Better handle retries for jobs

This was broken when the guix_revisions entry started being added before the
final commit.
This commit is contained in:
Christopher Baines 2021-02-03 10:35:56 +00:00
parent 7fbcb3a3c2
commit 643753ff46
2 changed files with 63 additions and 39 deletions

View file

@ -1316,20 +1316,32 @@ WHERE job_id = $1"
store store
channel-for-commit channel-for-commit
fetch-with-authentication?))) 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 (simple-format
(current-error-port) (current-error-port)
"guix-data-service: saving the channel instance derivations to the database\n") "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" (simple-format #t "Processing job ~A (commit: ~A, source: ~A)\n\n"
id commit source) id commit source)
(if (or (if (eq?
(guix-revision-exists? conn git-repository-id commit) (with-time-logging (string-append "loading revision " commit)
(eq? (setup-logging
(with-time-logging (string-append "loading revision " commit) id
(setup-logging (lambda ()
id (with-exception-handler
(lambda () (const #f)
(with-exception-handler (lambda ()
(const #f) (with-exception-handler
(lambda () (lambda (exn)
(with-exception-handler (simple-format (current-error-port)
(lambda (exn) "error: load-new-guix-revision: ~A\n"
(simple-format (current-error-port) exn)
"error: load-new-guix-revision: ~A\n" (backtrace)
exn) #f)
(backtrace) (lambda ()
#f) (with-store-connection
(lambda () (lambda (store)
(with-store-connection (load-new-guix-revision conn
(lambda (store) store
(load-new-guix-revision conn git-repository-id
store commit))))))
git-repository-id #:unwind? #t))))
commit)))))) #t)
#:unwind? #t))))
#t))
(begin (begin
(record-job-succeeded conn id) (record-job-succeeded conn id)
(record-job-event conn id "success") (record-job-event conn id "success")

View file

@ -23,6 +23,7 @@
#:export (count-guix-revisions #:export (count-guix-revisions
most-recent-n-guix-revisions most-recent-n-guix-revisions
commit->revision-id commit->revision-id
git-repository-id-and-commit->revision-id
insert-guix-revision insert-guix-revision
guix-commit-exists? guix-commit-exists?
guix-revision-exists? guix-revision-exists?
@ -46,6 +47,19 @@
id) id)
(() #f))) (() #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-guix-revision conn git-repository-id commit)
(define insert (define insert
" "