From 19164cf727030dc75c11533f11dc84645658b7c3 Mon Sep 17 00:00:00 2001 From: Ben Radford Date: Tue, 1 Aug 2023 12:49:46 +0100 Subject: [PATCH] Test that remounting fixes 'stale file handle' errors. --- tests/overlay-local-store/local.mk | 3 +- .../stale-file-handle-inner.sh | 47 +++++++++++++++++++ .../overlay-local-store/stale-file-handle.sh | 5 ++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100755 tests/overlay-local-store/stale-file-handle-inner.sh create mode 100755 tests/overlay-local-store/stale-file-handle.sh diff --git a/tests/overlay-local-store/local.mk b/tests/overlay-local-store/local.mk index 19ae6a3d0..34056683d 100644 --- a/tests/overlay-local-store/local.mk +++ b/tests/overlay-local-store/local.mk @@ -8,6 +8,7 @@ overlay-local-store-tests := \ $(d)/delete-duplicate.sh \ $(d)/gc.sh \ $(d)/verify.sh \ - $(d)/optimise.sh + $(d)/optimise.sh \ + $(d)/stale-file-handle.sh install-tests-groups += overlay-local-store diff --git a/tests/overlay-local-store/stale-file-handle-inner.sh b/tests/overlay-local-store/stale-file-handle-inner.sh new file mode 100755 index 000000000..86e39fa40 --- /dev/null +++ b/tests/overlay-local-store/stale-file-handle-inner.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -eu -o pipefail + +set -x + +source common.sh + +# Avoid store dir being inside sandbox build-dir +unset NIX_STORE_DIR +unset NIX_STATE_DIR + +storeDirs + +initLowerStore + +mountOverlayfs + +buildInStore () { + nix-build --store "$1" ../hermetic.nix --arg busybox "$busybox" --arg seed 1 --no-out-link +} + +triggerStaleFileHandle () { + # Arrange it so there are duplicate paths + nix-store --store "$storeA" --gc # Clear lower store + buildInStore "$storeB" # Build into upper layer first + buildInStore "$storeA" # Then build in lower store + + # Duplicate paths mean GC will have to delete via upper layer + nix-store --store "$storeB" --gc + + # Clear lower store again to force building in upper layer + nix-store --store "$storeA" --gc + + # Now attempting to build in upper layer will fail + buildInStore "$storeB" +} + +# Without remounting, we should encounter errors +expectStderr 1 triggerStaleFileHandle | grepQuiet 'Stale file handle' + +# Configure remount-hook and reset OverlayFS +storeB="$storeB&remount-hook=$PWD/remount.sh" +remountOverlayfs + +# Now it should succeed +triggerStaleFileHandle diff --git a/tests/overlay-local-store/stale-file-handle.sh b/tests/overlay-local-store/stale-file-handle.sh new file mode 100755 index 000000000..5e75628ca --- /dev/null +++ b/tests/overlay-local-store/stale-file-handle.sh @@ -0,0 +1,5 @@ +source common.sh + +requireEnvironment +setupConfig +execUnshare ./stale-file-handle-inner.sh