This is the big change needed to allow for parallel revision processing. Previously, a lock was used to prevent this since the parallel transactions could deadlock if each inserted data that the other then went to insert. By defining the order in which inserts happen, both in terms of the order of tables, and the order of rows within the table, this change should guarantee that there won't be deadlocks. I'm also hoping this change will address whatever issue was causing some derivation data to be missing from the database.
142 lines
4.4 KiB
Scheme
142 lines
4.4 KiB
Scheme
(define-module (tests jobs-load-new-guix-revision)
|
|
#:use-module (srfi srfi-64)
|
|
#:use-module (ice-9 match)
|
|
#:use-module (squee)
|
|
#:use-module (fibers)
|
|
#:use-module (knots)
|
|
#:use-module (guix utils)
|
|
#:use-module (guix store)
|
|
#:use-module (guix tests)
|
|
#:use-module (guix-data-service database)
|
|
#:use-module (guix-data-service model git-repository)
|
|
#:use-module (guix-data-service model guix-revision)
|
|
#:use-module (guix-data-service jobs load-new-guix-revision))
|
|
|
|
(test-begin "jobs-load-new-guix-revision")
|
|
|
|
(%daemon-socket-uri "/var/empty/doesnotexist")
|
|
|
|
(with-postgresql-connection
|
|
"test-jobs-load-new-guix-revision"
|
|
(lambda (conn)
|
|
(check-test-database! conn)
|
|
|
|
(exec-query conn "TRUNCATE guix_revisions CASCADE")
|
|
|
|
(test-equal "select-job-for-commit works"
|
|
#f
|
|
(select-job-for-commit conn "does not exist"))
|
|
|
|
(exec-query conn "TRUNCATE guix_revisions CASCADE")
|
|
(exec-query conn "TRUNCATE load_new_guix_revision_jobs CASCADE")
|
|
|
|
(test-equal "test job success"
|
|
#t
|
|
(mock
|
|
((guix-data-service jobs load-new-guix-revision)
|
|
with-store-connection
|
|
(lambda (f)
|
|
(f 'fake-store-connection)))
|
|
|
|
(mock
|
|
((guix-data-service jobs load-new-guix-revision)
|
|
open-store-connection
|
|
(lambda ()
|
|
'fake-store-connection))
|
|
|
|
(mock
|
|
((guix-data-service jobs load-new-guix-revision)
|
|
channel->source-and-derivations-by-system
|
|
(lambda* (conn channel fetch-with-authentication?
|
|
#:key parallelism ignore-systems)
|
|
(values
|
|
"/gnu/store/guix"
|
|
'(("x86_64-linux"
|
|
.
|
|
((manifest-entry-item . "/gnu/store/foo.drv")
|
|
(profile . "/gnu/store/bar.drv")))))))
|
|
|
|
(mock
|
|
((guix-data-service jobs load-new-guix-revision)
|
|
channel-derivations-by-system->guix-store-item
|
|
(lambda (channel-derivations-by-system)
|
|
(values "/gnu/store/test"
|
|
"/gnu/store/test.drv")))
|
|
|
|
(mock
|
|
((guix-data-service jobs load-new-guix-revision)
|
|
extract-information-from
|
|
(lambda _
|
|
'()))
|
|
|
|
(mock
|
|
((guix-data-service jobs load-new-guix-revision)
|
|
load-channel-instances
|
|
(lambda (call-with-utility-thread
|
|
read-derivations/serialised
|
|
git-repository-id commit
|
|
channel-derivations-by-system)
|
|
(insert-guix-revision conn git-repository-id commit)))
|
|
|
|
(mock
|
|
((guix channels)
|
|
channel-news-for-commit
|
|
(lambda (channel commit)
|
|
'()))
|
|
|
|
(mock
|
|
((guix-data-service jobs load-new-guix-revision)
|
|
insert-derivations-with-table-managers
|
|
(lambda _
|
|
#(1)))
|
|
|
|
(mock
|
|
((guix store)
|
|
add-temp-root
|
|
(lambda _ #f))
|
|
|
|
(mock
|
|
((guix store)
|
|
close-connection
|
|
(lambda _ #f))
|
|
|
|
(match (enqueue-load-new-guix-revision-job
|
|
conn
|
|
(git-repository-url->git-repository-id conn "test-url3")
|
|
"test-commit"
|
|
"test-source")
|
|
((id)
|
|
(run-fibers
|
|
(lambda ()
|
|
(with-exception-handler
|
|
(lambda (exn)
|
|
(print-backtrace-and-exception/knots exn)
|
|
(raise-exception exn))
|
|
(lambda ()
|
|
(process-load-new-guix-revision-job
|
|
id #:parallelism 1))))
|
|
#:hz 0
|
|
#:parallelism 1
|
|
#:drain? #t))))))))))))))
|
|
|
|
(exec-query conn "TRUNCATE guix_revisions CASCADE")
|
|
(exec-query conn "TRUNCATE load_new_guix_revision_jobs CASCADE")
|
|
|
|
(test-assert "test duplicate job handling"
|
|
(with-postgresql-transaction
|
|
conn
|
|
(lambda (conn)
|
|
(enqueue-load-new-guix-revision-job
|
|
conn
|
|
(git-repository-url->git-repository-id conn "test-url")
|
|
"test-commit"
|
|
"test-source")
|
|
(enqueue-load-new-guix-revision-job
|
|
conn
|
|
(git-repository-url->git-repository-id conn "test-url")
|
|
"test-commit"
|
|
"test-source")
|
|
#t)
|
|
#:always-rollback? #t))))
|
|
|
|
(test-end)
|