From 16748d80158875ae4cd54270be683fcf9c5d5169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Mon, 28 Sep 2015 21:32:17 +0200 Subject: [PATCH] store: Add 'query-failed-paths' and 'clear-failed-paths' RPCs. Suggested by Mark H Weaver . * guix/store.scm (query-failed-paths, clear-failed-paths): New procedures. * tests/guix-daemon.sh: Add test with daemon started with --cache-failures. --- guix/store.scm | 15 +++++++++++++++ tests/guix-daemon.sh | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/guix/store.scm b/guix/store.scm index 5f37e72589..c4e3573711 100644 --- a/guix/store.scm +++ b/guix/store.scm @@ -67,6 +67,8 @@ add-to-store build-things build + query-failed-paths + clear-failed-paths add-temp-root add-indirect-root add-permanent-root @@ -889,6 +891,19 @@ PATHS---i.e., PATHS and all their dependencies." (and (export-path server head port #:sign? sign?) (loop tail)))))) +(define-operation (query-failed-paths) + "Return the list of store items for which a build failure is cached. + +The result is always the empty list unless the daemon was started with +'--cache-failures'." + store-path-list) + +(define-operation (clear-failed-paths (store-path-list items)) + "Remove ITEMS from the list of cached build failures. + +This makes sense only when the daemon was started with '--cache-failures'." + boolean) + (define* (register-path path #:key (references '()) deriver prefix state-directory) diff --git a/tests/guix-daemon.sh b/tests/guix-daemon.sh index 0de6f278e4..1f9c868293 100644 --- a/tests/guix-daemon.sh +++ b/tests/guix-daemon.sh @@ -65,7 +65,7 @@ guile -c " socket="$NIX_STATE_DIR/alternate-socket" guix-daemon --no-substitutes --listen="$socket" --disable-chroot & daemon_pid=$! -trap "kill $daemon_pid" EXIT +trap 'kill $daemon_pid' EXIT # Make sure we DON'T see the substitute. guile -c " @@ -77,3 +77,40 @@ guile -c " #:substitute-urls (list \"$GUIX_BINARY_SUBSTITUTE_URL\")) (exit (not (has-substitutes? store \"$out\")))" + +kill "$daemon_pid" + + +# Check the failed build cache. + +guix-daemon --no-substitutes --listen="$socket" --disable-chroot \ + --cache-failures & +daemon_pid=$! + +guile -c " + (use-modules (guix) (guix tests) (srfi srfi-34)) + (define store (open-connection-for-tests \"$socket\")) + + (define (build-without-failing drv) + (lambda (store) + (guard (c ((nix-protocol-error? c) (values #t store))) + (build-derivations store (list drv)) + (values #f store)))) + + ;; Make sure failed builds are cached and can be removed from + ;; the cache. + (run-with-store store + (mlet* %store-monad ((drv (gexp->derivation \"failure\" + #~(begin + (ungexp output) + #f))) + (out -> (derivation->output-path drv)) + (ok? (build-without-failing drv))) + ;; Note the mixture of monadic and direct style. Don't try + ;; this at home! + (return (exit (and ok? + (equal? (query-failed-paths store) (list out)) + (begin + (clear-failed-paths store (list out)) + (null? (query-failed-paths store))))))) + #:guile-for-build (%guile-for-build)) "