store: 'map/accumulate-builds' handler checks the store received.
This is a followup tob19250eec6
, providing a proper fix for <https://issues.guix.gnu.org/46756>. * guix/remote.scm (remote-eval): Revertb19250eec6
. * guix/store.scm (build-accumulator): Turn into a procedure. Call CONTINUE when the store is not eq? to the initial store. (map/accumulate-builds): Adjust accordingly. * tests/store.scm ("map/accumulate-builds and different store"): New test.
This commit is contained in:
parent
45b251fd04
commit
2015d3f042
@ -146,15 +146,6 @@ remote store."
|
|||||||
sources)))
|
sources)))
|
||||||
(mbegin %store-monad
|
(mbegin %store-monad
|
||||||
((store-lift send-files) to-send remote #:recursive? #t)
|
((store-lift send-files) to-send remote #:recursive? #t)
|
||||||
|
(return (build-derivations remote inputs))
|
||||||
;; Build handlers are not tied to a specific <store-connection>.
|
|
||||||
;; If a handler is already installed, it might want to go ahead
|
|
||||||
;; and build, but on the local <store-connection> instead of
|
|
||||||
;; REMOTE. To avoid that, install a build handler that does
|
|
||||||
;; nothing.
|
|
||||||
(return (with-build-handler (lambda (continue . _)
|
|
||||||
(continue #t))
|
|
||||||
(build-derivations remote inputs)))
|
|
||||||
|
|
||||||
(return (close-connection remote))
|
(return (close-connection remote))
|
||||||
(return (%remote-eval lowered session become-command)))))))
|
(return (%remote-eval lowered session become-command)))))))
|
||||||
|
@ -1349,11 +1349,14 @@ on the build output of a previous derivation."
|
|||||||
(things unresolved-things)
|
(things unresolved-things)
|
||||||
(continuation unresolved-continuation))
|
(continuation unresolved-continuation))
|
||||||
|
|
||||||
(define (build-accumulator continue store things mode)
|
(define (build-accumulator expected-store)
|
||||||
"This build handler accumulates THINGS and returns an <unresolved> object."
|
"Return a build handler that accumulates THINGS and returns an <unresolved>
|
||||||
(if (= mode (build-mode normal))
|
object, only for build requests on EXPECTED-STORE."
|
||||||
(unresolved things continue)
|
(lambda (continue store things mode)
|
||||||
(continue #t)))
|
(if (and (eq? store expected-store)
|
||||||
|
(= mode (build-mode normal)))
|
||||||
|
(unresolved things continue)
|
||||||
|
(continue #t))))
|
||||||
|
|
||||||
(define* (map/accumulate-builds store proc lst
|
(define* (map/accumulate-builds store proc lst
|
||||||
#:key (cutoff 30))
|
#:key (cutoff 30))
|
||||||
@ -1366,13 +1369,16 @@ CUTOFF is the threshold above which we stop accumulating unresolved nodes."
|
|||||||
;; stumbling upon the same .drv build requests with many incoming edges.
|
;; stumbling upon the same .drv build requests with many incoming edges.
|
||||||
;; See <https://bugs.gnu.org/49439>.
|
;; See <https://bugs.gnu.org/49439>.
|
||||||
|
|
||||||
|
(define accumulator
|
||||||
|
(build-accumulator store))
|
||||||
|
|
||||||
(define-values (result rest)
|
(define-values (result rest)
|
||||||
(let loop ((lst lst)
|
(let loop ((lst lst)
|
||||||
(result '())
|
(result '())
|
||||||
(unresolved 0))
|
(unresolved 0))
|
||||||
(match lst
|
(match lst
|
||||||
((head . tail)
|
((head . tail)
|
||||||
(match (with-build-handler build-accumulator
|
(match (with-build-handler accumulator
|
||||||
(proc head))
|
(proc head))
|
||||||
((? unresolved? obj)
|
((? unresolved? obj)
|
||||||
(if (>= unresolved cutoff)
|
(if (>= unresolved cutoff)
|
||||||
|
@ -490,6 +490,34 @@
|
|||||||
(equal? (map derivation-file-name (drop d 16)) batch3)
|
(equal? (map derivation-file-name (drop d 16)) batch3)
|
||||||
lst)))))
|
lst)))))
|
||||||
|
|
||||||
|
(test-equal "map/accumulate-builds and different store"
|
||||||
|
'(d2) ;see <https://issues.guix.gnu.org/46756>
|
||||||
|
(let* ((b (add-text-to-store %store "build" "echo $foo > $out" '()))
|
||||||
|
(s (add-to-store %store "bash" #t "sha256"
|
||||||
|
(search-bootstrap-binary "bash"
|
||||||
|
(%current-system))))
|
||||||
|
(d1 (derivation %store "first"
|
||||||
|
s `("-e" ,b)
|
||||||
|
#:env-vars `(("foo" . ,(random-text)))
|
||||||
|
#:sources (list b s)))
|
||||||
|
(d2 (derivation %store "second"
|
||||||
|
s `("-e" ,b)
|
||||||
|
#:env-vars `(("foo" . ,(random-text))
|
||||||
|
("bar" . "baz"))
|
||||||
|
#:sources (list b s))))
|
||||||
|
(with-store alternate-store
|
||||||
|
(with-build-handler (lambda (continue store things mode)
|
||||||
|
;; If this handler is called, it means that
|
||||||
|
;; 'map/accumulate-builds' triggered a build,
|
||||||
|
;; which it shouldn't since the inner
|
||||||
|
;; 'build-derivations' call is for another store.
|
||||||
|
'failed)
|
||||||
|
(map/accumulate-builds %store
|
||||||
|
(lambda (drv)
|
||||||
|
(build-derivations alternate-store (list d2))
|
||||||
|
'd2)
|
||||||
|
(list d1))))))
|
||||||
|
|
||||||
(test-assert "mapm/accumulate-builds"
|
(test-assert "mapm/accumulate-builds"
|
||||||
(let* ((d1 (run-with-store %store
|
(let* ((d1 (run-with-store %store
|
||||||
(gexp->derivation "foo" #~(mkdir #$output))))
|
(gexp->derivation "foo" #~(mkdir #$output))))
|
||||||
|
Loading…
Reference in New Issue
Block a user