From a9510f950228957cde98001b67e123aa2d4d62c9 Mon Sep 17 00:00:00 2001 From: Ben Radford Date: Wed, 19 Jul 2023 11:23:54 +0100 Subject: [PATCH] Implement test for store path deduplication. --- tests/overlay-local-store/common.sh | 16 ++++------ tests/overlay-local-store/optimise-inner.sh | 33 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/tests/overlay-local-store/common.sh b/tests/overlay-local-store/common.sh index 7850c068b..5a678c947 100644 --- a/tests/overlay-local-store/common.sh +++ b/tests/overlay-local-store/common.sh @@ -22,11 +22,12 @@ storeDirs () { # Mounting Overlay Store mountOverlayfs () { + mergedStorePath="$TEST_ROOT/merged-store/nix/store" mount -t overlay overlay \ -o lowerdir="$storeA/nix/store" \ -o upperdir="$storeBTop" \ -o workdir="$TEST_ROOT/workdir" \ - "$TEST_ROOT/merged-store/nix/store" \ + "$mergedStorePath" \ || skipTest "overlayfs is not supported" cleanupOverlay () { @@ -36,6 +37,10 @@ mountOverlayfs () { trap cleanupOverlay EXIT } +remountOverlayfs () { + mount -o remount "$mergedStorePath" +} + toRealPath () { storeDir=$1; shift storePath=$1; shift @@ -54,12 +59,3 @@ initLowerStore () { execUnshare () { exec unshare --mount --map-root-user "$@" } - -addTextToStore() { - storeDir=$1; shift - filename=$1; shift - content=$1; shift - filePath="$TEST_HOME/$filename" - echo "$content" > "$filePath" - nix-store --store "$storeDir" --add "$filePath" -} diff --git a/tests/overlay-local-store/optimise-inner.sh b/tests/overlay-local-store/optimise-inner.sh index 76c5a0cb6..c60c742a2 100755 --- a/tests/overlay-local-store/optimise-inner.sh +++ b/tests/overlay-local-store/optimise-inner.sh @@ -16,4 +16,37 @@ initLowerStore mountOverlayfs +# Create a file to add to store +dupFilePath="$TEST_ROOT/dup-file" +echo Duplicate > "$dupFilePath" + +# Add it to the overlay store (it will be written to the upper layer) +dupFileStorePath=$(nix-store --store "$storeB" --add "$dupFilePath") + +# Now add it to the lower store so the store path is duplicated +nix-store --store "$storeA" --add "$dupFilePath" + +# Ensure overlayfs and layers and synchronised +remountOverlayfs + +dupFilename="${dupFileStorePath#/nix/store}" +lowerPath="$storeA/$dupFileStorePath" +upperPath="$storeBTop/$dupFilename" +overlayPath="$mergedStorePath/$dupFilename" + +# Check store path exists in both layers and overlay +lowerInode=$(stat -c %i "$lowerPath") +upperInode=$(stat -c %i "$upperPath") +overlayInode=$(stat -c %i "$overlayPath") +[[ $upperInode == $overlayInode ]] +[[ $upperInode != $lowerInode ]] + +# Run optimise to deduplicate store paths nix-store --store "$storeB" --optimise +remountOverlayfs + +stat "$lowerPath" +stat "$overlayPath" +expect 1 stat "$upperPath" + +#expect 1 stat $(toRealPath "$storeA/nix/store" "$path")