From e2da4a08ff03e66d76351ca83e14fbbcfcc51ff8 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Sun, 10 May 2020 17:25:09 +0100 Subject: Add datastore-fetch-unprocessed-builds-with-propagated-priorities To use with the derivation ordered allocator. --- guix-build-coordinator/datastore.scm | 1 + guix-build-coordinator/datastore/sqlite.scm | 55 ++++++++++++++++++++++ .../derivation_outputs_derivation_name_index.sql | 7 +++ .../derivation_outputs_derivation_name_index.sql | 7 +++ .../derivation_outputs_derivation_name_index.sql | 7 +++ sqitch/sqitch.plan | 1 + .../derivation_outputs_derivation_name_index.sql | 7 +++ .../derivation_outputs_derivation_name_index.sql | 7 +++ .../derivation_outputs_derivation_name_index.sql | 7 +++ 9 files changed, 99 insertions(+) create mode 100644 sqitch/pg/deploy/derivation_outputs_derivation_name_index.sql create mode 100644 sqitch/pg/revert/derivation_outputs_derivation_name_index.sql create mode 100644 sqitch/pg/verify/derivation_outputs_derivation_name_index.sql create mode 100644 sqitch/sqlite/deploy/derivation_outputs_derivation_name_index.sql create mode 100644 sqitch/sqlite/revert/derivation_outputs_derivation_name_index.sql create mode 100644 sqitch/sqlite/verify/derivation_outputs_derivation_name_index.sql diff --git a/guix-build-coordinator/datastore.scm b/guix-build-coordinator/datastore.scm index d1c08bf..0267f28 100644 --- a/guix-build-coordinator/datastore.scm +++ b/guix-build-coordinator/datastore.scm @@ -34,6 +34,7 @@ (re-export datastore-list-processed-builds) (re-export datastore-list-unprocessed-builds) (re-export datastore-fetch-input-builds-for-unprocessed-builds) +(re-export datastore-fetch-unprocessed-builds-with-propagated-priorities) (re-export datastore-list-unprocessed-hook-events) (re-export datastore-delete-unprocessed-hook-event) (re-export datastore-list-agent-builds) diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm index e418500..bbf967f 100644 --- a/guix-build-coordinator/datastore/sqlite.scm +++ b/guix-build-coordinator/datastore/sqlite.scm @@ -40,6 +40,7 @@ datastore-list-processed-builds datastore-list-unprocessed-builds datastore-fetch-input-builds-for-unprocessed-builds + datastore-fetch-unprocessed-builds-with-propagated-priorities datastore-list-unprocessed-hook-events datastore-delete-unprocessed-hook-event datastore-list-agent-builds @@ -942,6 +943,60 @@ WHERE builds.processed = 0"))) result))))) +(define-method (datastore-fetch-unprocessed-builds-with-propagated-priorities + (datastore )) + (call-with-worker-thread + (slot-ref datastore 'worker-reader-thread-channel) + (lambda (db) + (let ((statement + (sqlite-prepare + db + " +WITH RECURSIVE builds_with_derived_priority( + uuid, derivation_name, derived_priority + ) AS ( + -- Start with builds for derivations where outputs from that derivation + -- aren't used by other derivations + SELECT builds.uuid, builds.derivation_name, builds.priority + FROM builds + WHERE + builds.processed = 0 AND + NOT EXISTS ( + SELECT 1 + FROM derivation_inputs + INNER JOIN derivation_outputs + ON derivation_inputs.derivation_output_id = derivation_outputs.id + WHERE derivation_outputs.derivation_name = builds.derivation_name + ) +UNION + SELECT builds.uuid, builds.derivation_name, + max(builds.priority, builds_with_derived_priority.derived_priority) + FROM builds_with_derived_priority + INNER JOIN derivation_inputs + ON builds_with_derived_priority.derivation_name = + derivation_inputs.derivation_name + INNER JOIN derivation_outputs + ON derivation_inputs.derivation_output_id = derivation_outputs.id + INNER JOIN builds + ON builds.derivation_name = derivation_outputs.derivation_name + WHERE builds.processed = 0 +) +SELECT uuid, derived_priority +FROM builds_with_derived_priority" + #:cache? #t))) + + (let ((result (sqlite-fold + (lambda (row result) + (match row + (#(uuid derived-priority) + (hash-set! result uuid derived-priority))) + result) + (make-hash-table 10000) + statement))) + (sqlite-reset statement) + + result))))) + (define (insert-unprocessed-hook-event db event diff --git a/sqitch/pg/deploy/derivation_outputs_derivation_name_index.sql b/sqitch/pg/deploy/derivation_outputs_derivation_name_index.sql new file mode 100644 index 0000000..65ee9b0 --- /dev/null +++ b/sqitch/pg/deploy/derivation_outputs_derivation_name_index.sql @@ -0,0 +1,7 @@ +-- Deploy guix-build-coordinator:derivation_outputs_derivation_name_index to pg + +BEGIN; + +-- XXX Add DDLs here. + +COMMIT; diff --git a/sqitch/pg/revert/derivation_outputs_derivation_name_index.sql b/sqitch/pg/revert/derivation_outputs_derivation_name_index.sql new file mode 100644 index 0000000..2dfadfd --- /dev/null +++ b/sqitch/pg/revert/derivation_outputs_derivation_name_index.sql @@ -0,0 +1,7 @@ +-- Revert guix-build-coordinator:derivation_outputs_derivation_name_index from pg + +BEGIN; + +-- XXX Add DDLs here. + +COMMIT; diff --git a/sqitch/pg/verify/derivation_outputs_derivation_name_index.sql b/sqitch/pg/verify/derivation_outputs_derivation_name_index.sql new file mode 100644 index 0000000..c1b5a6a --- /dev/null +++ b/sqitch/pg/verify/derivation_outputs_derivation_name_index.sql @@ -0,0 +1,7 @@ +-- Verify guix-build-coordinator:derivation_outputs_derivation_name_index on pg + +BEGIN; + +-- XXX Add verifications here. + +ROLLBACK; diff --git a/sqitch/sqitch.plan b/sqitch/sqitch.plan index a062e08..509802d 100644 --- a/sqitch/sqitch.plan +++ b/sqitch/sqitch.plan @@ -12,3 +12,4 @@ output_metadata 2020-04-23T14:26:15Z Christopher Baines # Cre derivation_outputs_output_index 2020-04-28T17:49:19Z Christopher Baines # Add an index on derivation_outputs.output allocator_related_indexes 2020-04-29T16:59:14Z Christopher Baines # Add a few indexes that should speed up build allocation unprocessed_hook_events 2020-05-08T12:55:28Z Christopher Baines # Add a new table unprocessed_hook_events +derivation_outputs_derivation_name_index 2020-05-10T16:24:05Z Christopher Baines # Add an index on derivation_outputs.derivation_name diff --git a/sqitch/sqlite/deploy/derivation_outputs_derivation_name_index.sql b/sqitch/sqlite/deploy/derivation_outputs_derivation_name_index.sql new file mode 100644 index 0000000..b564ef6 --- /dev/null +++ b/sqitch/sqlite/deploy/derivation_outputs_derivation_name_index.sql @@ -0,0 +1,7 @@ +-- Deploy guix-build-coordinator:derivation_outputs_derivation_name_index to sqlite + +BEGIN; + +CREATE INDEX derivation_outputs_derivation_name_idx ON derivation_outputs (derivation_name); + +COMMIT; diff --git a/sqitch/sqlite/revert/derivation_outputs_derivation_name_index.sql b/sqitch/sqlite/revert/derivation_outputs_derivation_name_index.sql new file mode 100644 index 0000000..d915d2d --- /dev/null +++ b/sqitch/sqlite/revert/derivation_outputs_derivation_name_index.sql @@ -0,0 +1,7 @@ +-- Revert guix-build-coordinator:derivation_outputs_derivation_name_index from sqlite + +BEGIN; + +-- XXX Add DDLs here. + +COMMIT; diff --git a/sqitch/sqlite/verify/derivation_outputs_derivation_name_index.sql b/sqitch/sqlite/verify/derivation_outputs_derivation_name_index.sql new file mode 100644 index 0000000..5871242 --- /dev/null +++ b/sqitch/sqlite/verify/derivation_outputs_derivation_name_index.sql @@ -0,0 +1,7 @@ +-- Verify guix-build-coordinator:derivation_outputs_derivation_name_index on sqlite + +BEGIN; + +-- XXX Add verifications here. + +ROLLBACK; -- cgit v1.2.3