guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/05: Better handle retries for jobs


From: Christopher Baines
Subject: 01/05: Better handle retries for jobs
Date: Wed, 3 Feb 2021 07:59:38 -0500 (EST)

cbaines pushed a commit to branch master
in repository data-service.

commit 643753ff463694f0e894526e46460fecc6c5b696
Author: Christopher Baines <mail@cbaines.net>
AuthorDate: Wed Feb 3 10:35:56 2021 +0000

    Better handle retries for jobs
    
    This was broken when the guix_revisions entry started being added before the
    final commit.
---
 guix-data-service/jobs/load-new-guix-revision.scm | 88 +++++++++++++----------
 guix-data-service/model/guix-revision.scm         | 14 ++++
 2 files changed, 63 insertions(+), 39 deletions(-)

diff --git a/guix-data-service/jobs/load-new-guix-revision.scm 
b/guix-data-service/jobs/load-new-guix-revision.scm
index 423043b..0e051f4 100644
--- a/guix-data-service/jobs/load-new-guix-revision.scm
+++ b/guix-data-service/jobs/load-new-guix-revision.scm
@@ -1316,20 +1316,32 @@ WHERE job_id = $1"
                                           store
                                           channel-for-commit
                                           fetch-with-authentication?)))
-    (let ((guix-revision-id
-           (insert-guix-revision conn git-repository-id commit)))
-      (insert-channel-instances conn
-                                guix-revision-id
-                                (filter-map
-                                 (match-lambda
-                                   ((system . derivations)
-                                    (and=>
-                                     (assoc-ref derivations
-                                                'manifest-entry-item)
-                                     (lambda (drv)
-                                       (cons system drv)))))
-                                 channel-derivations-by-system))
 
+    (with-time-logging
+        "acquiring advisory transaction lock: load-new-guix-revision-inserts"
+      ;; Wait until this is the only transaction inserting data, to avoid any
+      ;; concurrency issues
+      (obtain-advisory-transaction-lock conn
+                                        'load-new-guix-revision-inserts))
+    (let* ((existing-guix-revision-id
+            (git-repository-id-and-commit->revision-id conn
+                                                       git-repository-id
+                                                       commit))
+           (guix-revision-id
+            (or existing-guix-revision-id
+                (insert-guix-revision conn git-repository-id commit))))
+      (unless existing-guix-revision-id
+        (insert-channel-instances conn
+                                  guix-revision-id
+                                  (filter-map
+                                   (match-lambda
+                                     ((system . derivations)
+                                      (and=>
+                                       (assoc-ref derivations
+                                                  'manifest-entry-item)
+                                       (lambda (drv)
+                                         (cons system drv)))))
+                                   channel-derivations-by-system)))
       (simple-format
        (current-error-port)
        "guix-data-service: saving the channel instance derivations to the 
database\n")
@@ -1777,32 +1789,30 @@ SKIP LOCKED")
         (simple-format #t "Processing job ~A (commit: ~A, source: ~A)\n\n"
                        id commit source)
 
-        (if (or
-             (guix-revision-exists? conn git-repository-id commit)
-             (eq?
-              (with-time-logging (string-append "loading revision " commit)
-                (setup-logging
-                 id
-                 (lambda ()
-                   (with-exception-handler
-                       (const #f)
-                     (lambda ()
-                       (with-exception-handler
-                           (lambda (exn)
-                             (simple-format (current-error-port)
-                                            "error: load-new-guix-revision: 
~A\n"
-                                            exn)
-                             (backtrace)
-                             #f)
-                         (lambda ()
-                           (with-store-connection
-                            (lambda (store)
-                              (load-new-guix-revision conn
-                                                      store
-                                                      git-repository-id
-                                                      commit))))))
-                     #:unwind? #t))))
-              #t))
+        (if (eq?
+             (with-time-logging (string-append "loading revision " commit)
+               (setup-logging
+                id
+                (lambda ()
+                  (with-exception-handler
+                      (const #f)
+                    (lambda ()
+                      (with-exception-handler
+                          (lambda (exn)
+                            (simple-format (current-error-port)
+                                           "error: load-new-guix-revision: 
~A\n"
+                                           exn)
+                            (backtrace)
+                            #f)
+                        (lambda ()
+                          (with-store-connection
+                           (lambda (store)
+                             (load-new-guix-revision conn
+                                                     store
+                                                     git-repository-id
+                                                     commit))))))
+                    #:unwind? #t))))
+             #t)
             (begin
               (record-job-succeeded conn id)
               (record-job-event conn id "success")
diff --git a/guix-data-service/model/guix-revision.scm 
b/guix-data-service/model/guix-revision.scm
index 4f5ed6d..f7dc26a 100644
--- a/guix-data-service/model/guix-revision.scm
+++ b/guix-data-service/model/guix-revision.scm
@@ -23,6 +23,7 @@
   #:export (count-guix-revisions
             most-recent-n-guix-revisions
             commit->revision-id
+            git-repository-id-and-commit->revision-id
             insert-guix-revision
             guix-commit-exists?
             guix-revision-exists?
@@ -46,6 +47,19 @@
      id)
     (() #f)))
 
+(define (git-repository-id-and-commit->revision-id conn git-repository-id 
commit)
+  (match (exec-query
+          conn
+          "
+SELECT id
+FROM guix_revisions
+WHERE commit = $1
+  AND git_repository_id = $2"
+          (list commit git-repository-id))
+    (((id))
+     id)
+    (() #f)))
+
 (define (insert-guix-revision conn git-repository-id commit)
   (define insert
     "



reply via email to

[Prev in Thread] Current Thread [Next in Thread]