Archived
1
0
Fork 0

grafts: Simplify access to store item references.

This is a followup to 710854304b.

This also slightly reduces the number of 'query-references' RPCs, for
instance from 176 to 166 from "guix build emacs -d".

* guix/grafts.scm (references-oracle): Remove.
(non-self-references): Remove 'references' parameter and add 'store'.
Add 'references*' procedure and use it instead of 'references'.  Adjust
caller accordingly.
(cumulative-grafts): Remove 'references' parameter and adjust caller
accordingly.
This commit is contained in:
Ludovic Courtès 2020-04-01 22:51:46 +02:00
parent 65bdb2d9dd
commit 4b75a70600
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -152,43 +152,23 @@ are not recursively applied to dependencies of DRV."
#:properties properties))))) #:properties properties)))))
(define (non-self-references references drv outputs) (define (non-self-references store drv outputs)
"Return the list of references of the OUTPUTS of DRV, excluding self "Return the list of references of the OUTPUTS of DRV, excluding self
references. Call REFERENCES to get the list of references." references."
(let ((refs (append-map (compose references
(cut derivation->output-path drv <>))
outputs))
(self (match (derivation->output-paths drv)
(((names . items) ...)
items))))
(remove (cut member <> self) refs)))
(define (references-oracle store input)
"Return a one-argument procedure that, when passed the output file names of
INPUT, a derivation input, or their dependencies, returns the list of
references of that item. Build INPUT if it's not available."
(define (references* items) (define (references* items)
;; Return the references of ITEMS. ;; Return the references of ITEMS.
(guard (c ((store-protocol-error? c) (guard (c ((store-protocol-error? c)
;; ITEMS are not in store so build INPUT first. ;; ITEMS are not in store so build INPUT first.
(and (build-derivations store (list input)) (and (build-derivations store (list drv))
(map (cut references/cached store <>) items)))) (append-map (cut references/cached store <>) items))))
(map (cut references/cached store <>) items))) (append-map (cut references/cached store <>) items)))
(let loop ((items (derivation-input-output-paths input)) (let ((refs (references* (map (cut derivation->output-path drv <>)
(result vlist-null)) outputs)))
(match items (self (match (derivation->output-paths drv)
(() (((names . items) ...)
(lambda (item) items))))
(match (vhash-assoc item result) (remove (cut member <> self) refs)))
((_ . refs) refs)
(#f #f))))
(_
(let* ((refs (references* items))
(result (fold vhash-cons result items refs)))
(loop (remove (cut vhash-assoc <> result)
(delete-duplicates (concatenate refs) string=?))
result))))))
(define-syntax-rule (with-cache key exp ...) (define-syntax-rule (with-cache key exp ...)
"Cache the value of monadic expression EXP under KEY." "Cache the value of monadic expression EXP under KEY."
@ -231,15 +211,12 @@ of DRV."
(set-insert drv visited))))))))) (set-insert drv visited)))))))))
(define* (cumulative-grafts store drv grafts (define* (cumulative-grafts store drv grafts
references
#:key #:key
(outputs (derivation-output-names drv)) (outputs (derivation-output-names drv))
(guile (%guile-for-build)) (guile (%guile-for-build))
(system (%current-system))) (system (%current-system)))
"Augment GRAFTS with additional grafts resulting from the application of "Augment GRAFTS with additional grafts resulting from the application of
GRAFTS to the dependencies of DRV; REFERENCES must be a one-argument procedure GRAFTS to the dependencies of DRV. Return the resulting list of grafts.
that returns the list of references of the store item it is given. Return the
resulting list of grafts.
This is a monadic procedure in %STATE-MONAD where the state is a vhash mapping This is a monadic procedure in %STATE-MONAD where the state is a vhash mapping
derivations to the corresponding set of grafts." derivations to the corresponding set of grafts."
@ -262,7 +239,7 @@ derivations to the corresponding set of grafts."
;; If GRAFTS already contains a graft from DRV, do not override it. ;; If GRAFTS already contains a graft from DRV, do not override it.
(if (find (cut graft-origin? drv <>) grafts) (if (find (cut graft-origin? drv <>) grafts)
(state-return grafts) (state-return grafts)
(cumulative-grafts store drv grafts references (cumulative-grafts store drv grafts
#:outputs (list output) #:outputs (list output)
#:guile guile #:guile guile
#:system system))) #:system system)))
@ -270,7 +247,7 @@ derivations to the corresponding set of grafts."
(state-return grafts)))) (state-return grafts))))
(with-cache (cons (derivation-file-name drv) outputs) (with-cache (cons (derivation-file-name drv) outputs)
(match (non-self-references references drv outputs) (match (non-self-references store drv outputs)
(() ;no dependencies (() ;no dependencies
(return grafts)) (return grafts))
(deps ;one or more dependencies (deps ;one or more dependencies
@ -307,15 +284,8 @@ derivations to the corresponding set of grafts."
"Apply GRAFTS to the OUTPUTS of DRV and all their dependencies, recursively. "Apply GRAFTS to the OUTPUTS of DRV and all their dependencies, recursively.
That is, if GRAFTS apply only indirectly to DRV, graft the dependencies of That is, if GRAFTS apply only indirectly to DRV, graft the dependencies of
DRV, and graft DRV itself to refer to those grafted dependencies." DRV, and graft DRV itself to refer to those grafted dependencies."
;; First, pre-compute the dependency tree of the outputs of DRV. Do this
;; upfront to have as much parallelism as possible when querying substitute
;; info or when building DRV.
(define references
(references-oracle store (derivation-input drv outputs)))
(match (run-with-state (match (run-with-state
(cumulative-grafts store drv grafts references (cumulative-grafts store drv grafts
#:outputs outputs #:outputs outputs
#:guile guile #:system system) #:guile guile #:system system)
vlist-null) ;the initial cache vlist-null) ;the initial cache