guix-data-service/tests/jobs-load-new-guix-revision.scm
Christopher Baines f66ff9a3ff Rework how data is inserted
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.
2026-02-05 12:23:10 +00:00

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)