Add new derivation_output_details_set_id column to the builds table

As this will hopefully provide a faster way of associating derivations with
builds.
This commit is contained in:
Christopher Baines 2019-12-07 19:27:31 +01:00
parent a965ba1f6a
commit c8b93cb0d0
6 changed files with 118 additions and 15 deletions

View file

@ -17,6 +17,7 @@
#:use-module (guix build utils) #:use-module (guix build utils)
#:use-module (guix-data-service config) #:use-module (guix-data-service config)
#:use-module (guix-data-service database) #:use-module (guix-data-service database)
#:use-module (guix-data-service model build)
#:use-module (guix-data-service model channel-news) #:use-module (guix-data-service model channel-news)
#:use-module (guix-data-service model package) #:use-module (guix-data-service model package)
#:use-module (guix-data-service model git-repository) #:use-module (guix-data-service model git-repository)
@ -877,6 +878,9 @@ WHERE job_id = $1"
(inferior-data->package-derivation-ids (inferior-data->package-derivation-ids
conn inf inferior-package-id->package-database-id conn inf inferior-package-id->package-database-id
inferior-data-4-tuples))) inferior-data-4-tuples)))
(update-builds-derivation-output-details-set-id
conn
(map fourth inferior-data-4-tuples))
(insert-guix-revision-package-derivations conn (insert-guix-revision-package-derivations conn
guix-revision-id guix-revision-id

View file

@ -6,6 +6,7 @@
select-builds-with-context select-builds-with-context
select-builds-with-context-by-derivation-file-name select-builds-with-context-by-derivation-file-name
select-build-by-build-server-and-derivation-file-name select-build-by-build-server-and-derivation-file-name
update-builds-derivation-output-details-set-id
insert-builds insert-builds
insert-build insert-build
ensure-build-exists)) ensure-build-exists))
@ -110,25 +111,86 @@ WHERE build_server_id = $1 AND derivation_file_name = $2")
(_ (_
#f))) #f)))
(define (insert-builds conn build-server-id derivation-file-names) (define (update-builds-derivation-output-details-set-id conn derivation-file-names)
(insert-missing-data-and-return-all-ids (exec-query
conn conn
"builds" (string-append
'(build_server_id derivation_file_name) "
(map (lambda (derivation-file-name) UPDATE builds SET derivation_output_details_set_id = (
(list build-server-id SELECT derivations_by_output_details_set.derivation_output_details_set_id
derivation-file-name)) FROM derivations_by_output_details_set
derivation-file-names) INNER JOIN derivations
#:delete-duplicates? #t)) ON derivations.file_name = builds.derivation_file_name
WHERE derivations_by_output_details_set.derivation_id = derivations.id
) WHERE builds.derivation_output_details_set_id IS NULL AND
builds.derivation_file_name IN ("
(string-join (map quote-string derivation-file-names)
",")
")")))
(define (select-derivations-by-output-details-set-id-by-derivation-file-name
conn
derivation-file-name)
(match (exec-query
conn
"
SELECT derivation_output_details_set_id
FROM derivations_by_output_details_set
INNER JOIN derivations
ON derivations.id = derivations_by_output_details_set.derivation_id
WHERE derivations.file_name = $1"
(list derivation-file-name))
(((id))
(string->number id))
(_
#f)))
(define (insert-builds conn build-server-id derivation-file-names)
(let ((build-ids
(insert-missing-data-and-return-all-ids
conn
"builds"
'(build_server_id derivation_file_name)
(map (lambda (derivation-file-name)
(list build-server-id
derivation-file-name))
derivation-file-names)
#:delete-duplicates? #t)))
(exec-query
conn
(string-append
"
UPDATE builds SET derivation_output_details_set_id = (
SELECT derivations_by_output_details_set.derivation_output_details_set_id
FROM derivations_by_output_details_set
INNER JOIN derivations
ON derivations.file_name = builds.derivation_file_name
WHERE derivations_by_output_details_set.derivation_id = derivations.id
) WHERE builds.derivation_output_details_set_id IS NULL AND builds.id IN ("
(string-join (map number->string
build-ids)
",")
")"))
build-ids))
(define (insert-build conn build-server-id derivation-file-name) (define (insert-build conn build-server-id derivation-file-name)
(match (exec-query conn (match (exec-query
" conn
INSERT INTO builds (build_server_id, derivation_file_name) "
VALUES ($1, $2) INSERT INTO builds
(build_server_id, derivation_file_name, derivation_output_details_set_id)
VALUES ($1, $2, $3)
RETURNING (id)" RETURNING (id)"
(list (number->string build-server-id) (list (number->string build-server-id)
derivation-file-name)) derivation-file-name
(or
(and=> (select-derivations-by-output-details-set-id-by-derivation-file-name
conn
derivation-file-name)
number->string)
"NULL")))
(((id)) (((id))
(string->number id)))) (string->number id))))

View file

@ -0,0 +1,22 @@
-- Deploy guix-data-service:builds_add_derivation_output_details_set_id to pg
BEGIN;
ALTER TABLE builds
ADD COLUMN derivation_output_details_set_id integer
NULL
DEFAULT NULL
REFERENCES derivation_output_details_sets (id);
UPDATE builds SET derivation_output_details_set_id = (
SELECT derivations_by_output_details_set.derivation_output_details_set_id
FROM derivations_by_output_details_set
INNER JOIN derivations
ON derivations.file_name = builds.derivation_file_name
WHERE derivations_by_output_details_set.derivation_id = derivations.id
);
CREATE INDEX builds_derivation_output_details_set_id ON
builds (derivation_output_details_set_id);
COMMIT;

View file

@ -0,0 +1,7 @@
-- Revert guix-data-service:builds_add_derivation_output_details_set_id from pg
BEGIN;
-- XXX Add DDLs here.
COMMIT;

View file

@ -37,3 +37,4 @@ change_nar_urls_size_to_bigint 2019-12-04T21:49:07Z <chris@phact> # Change nar
sort_out_duplicate_builds 2019-12-05T12:43:53Z <chris@phact> # Sort out duplicate builds sort_out_duplicate_builds 2019-12-05T12:43:53Z <chris@phact> # Sort out duplicate builds
add_some_database_indexes 2019-12-05T15:53:04Z Christopher Baines <mail@cbaines.net> # Add some indexes add_some_database_indexes 2019-12-05T15:53:04Z Christopher Baines <mail@cbaines.net> # Add some indexes
derivation_output_sets 2019-12-05T23:19:05Z Christopher Baines <mail@cbaines.net> # Describe the sets of derivation outputs derivation_output_sets 2019-12-05T23:19:05Z Christopher Baines <mail@cbaines.net> # Describe the sets of derivation outputs
builds_add_derivation_output_details_set_id 2019-12-07T18:25:38Z Christopher Baines <mail@cbaines.net> # Add a derivation_output_details_set_id column to builds

View file

@ -0,0 +1,7 @@
-- Verify guix-data-service:builds_add_derivation_output_details_set_id on pg
BEGIN;
-- XXX Add verifications here.
ROLLBACK;