aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service/data-deletion.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix-data-service/data-deletion.scm')
-rw-r--r--guix-data-service/data-deletion.scm69
1 files changed, 50 insertions, 19 deletions
diff --git a/guix-data-service/data-deletion.scm b/guix-data-service/data-deletion.scm
index c9dc631..13b3246 100644
--- a/guix-data-service/data-deletion.scm
+++ b/guix-data-service/data-deletion.scm
@@ -146,7 +146,7 @@ AND id NOT IN (
(delete-unreferenced-lint-checkers))))
(define (delete-revisions-from-branch conn git-repository-id branch-name commits)
- (define (delete-jobs conn)
+ (define (delete-jobs conn commits)
(for-each
(lambda (table)
(exec-query
@@ -217,9 +217,7 @@ WHERE id IN (
'delete-revisions-from-branch)
(exec-query conn "SET LOCAL lock_timeout = '5s';")
-
(delete-from-git-commits conn)
- (delete-jobs conn)
(let ((git-branch-id
(git-branch-for-repository-and-name conn
@@ -232,7 +230,28 @@ WHERE id IN (
DROP TABLE IF EXISTS package_derivations_by_guix_revision_range_git_branch_"
(number->string git-branch-id) ";")))
- (delete-guix-revisions conn git-repository-id commits))))
+ (let ((now-unreferenced-commits
+ (filter
+ (lambda (commit)
+ (let ((result
+ (or
+ (string-null? commit)
+ (null?
+ (exec-query
+ conn
+ "SELECT 1 FROM git_commits WHERE commit = $1"
+ (list commit))))))
+ (unless result
+ (simple-format (current-error-port)
+ "skipping ~A because it's still referenced\n"
+ commit))
+ result))
+ commits)))
+ (unless (null? now-unreferenced-commits)
+ (delete-jobs conn now-unreferenced-commits)
+ (delete-guix-revisions conn
+ git-repository-id
+ now-unreferenced-commits))))))
(lambda (key . args)
(simple-format
(current-error-port)
@@ -255,10 +274,11 @@ WHERE git_repository_id = $1
(list (number->string git-repository-id)
branch-name))))
- (delete-revisions-from-branch conn
- git-repository-id
- branch-name
- commits)
+ (unless (null? commits)
+ (delete-revisions-from-branch conn
+ git-repository-id
+ branch-name
+ commits))
(exec-query
conn
@@ -434,10 +454,9 @@ DELETE FROM derivation_source_files
WHERE id IN (
SELECT id
FROM derivation_source_files
- WHERE NOT EXISTS (
- SELECT 1
+ WHERE id NOT IN (
+ SELECT derivation_source_file_id
FROM derivation_sources
- WHERE derivation_source_file_id = derivation_source_files.id
)
LIMIT 100
)
@@ -551,6 +570,7 @@ DELETE FROM derivations WHERE id = $1"
1)))
(define deleted-count 0)
+ (define ignored-derivation-ids (make-hash-table))
(define channel (make-channel))
(define (delete-batch conn)
@@ -588,7 +608,8 @@ WHERE NOT EXISTS (
(set! deleted-count 0)
(for-each
(lambda (derivation-id)
- (put-message channel derivation-id))
+ (unless (hash-ref ignored-derivation-ids derivation-id)
+ (put-message channel derivation-id)))
derivations))
(simple-format (current-error-port)
@@ -635,6 +656,11 @@ SET CONSTRAINTS derivations_by_output_details_set_derivation_id_fkey DEFERRED")
0))))
+ (when (= 0 val)
+ (hash-set! ignored-derivation-ids
+ derivation-id
+ #t))
+
;; This is safe as all fibers are in the same
;; thread and cooperative.
(set! deleted-count
@@ -653,13 +679,18 @@ SET CONSTRAINTS derivations_by_output_details_set_derivation_id_fkey DEFERRED")
(let ((batch-deleted-count (delete-batch conn)))
(if (eq? 0 batch-deleted-count)
(begin
- (with-time-logging
- "Deleting unused derivation_source_files entries"
- (delete-unreferenced-derivations-source-files conn))
- (simple-format
- (current-output-port)
- "Finished deleting derivations, deleted ~A in total\n"
- total-deleted))
+ (hash-clear! ignored-derivation-ids)
+ (let ((batch-deleted-count (delete-batch conn)))
+ (if (= 0 batch-deleted-count)
+ (begin
+ (with-time-logging
+ "Deleting unused derivation_source_files entries"
+ (delete-unreferenced-derivations-source-files conn))
+ (simple-format
+ (current-output-port)
+ "Finished deleting derivations, deleted ~A in total\n"
+ total-deleted))
+ (loop (+ total-deleted batch-deleted-count)))))
(loop (+ total-deleted batch-deleted-count))))))))
#:hz 0
#:parallelism 1))