diff options
author | Christopher Baines <mail@cbaines.net> | 2020-05-10 17:25:09 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2020-05-10 17:25:09 +0100 |
commit | e2da4a08ff03e66d76351ca83e14fbbcfcc51ff8 (patch) | |
tree | 80477c64992466498c7b86c936668c1fb1651a96 /guix-build-coordinator/datastore/sqlite.scm | |
parent | 542e606211c0129691bd4d843505212abf6ec1ce (diff) | |
download | build-coordinator-e2da4a08ff03e66d76351ca83e14fbbcfcc51ff8.tar build-coordinator-e2da4a08ff03e66d76351ca83e14fbbcfcc51ff8.tar.gz |
Add datastore-fetch-unprocessed-builds-with-propagated-priorities
To use with the derivation ordered allocator.
Diffstat (limited to 'guix-build-coordinator/datastore/sqlite.scm')
-rw-r--r-- | guix-build-coordinator/datastore/sqlite.scm | 55 |
1 files changed, 55 insertions, 0 deletions
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 <sqlite-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 |