diff --git a/src/libstore/local-overlay-store.cc b/src/libstore/local-overlay-store.cc index da0c8e3d5..9e530ed9b 100644 --- a/src/libstore/local-overlay-store.cc +++ b/src/libstore/local-overlay-store.cc @@ -190,7 +190,23 @@ void LocalOverlayStore::deleteGCPath(const Path & path, uint64_t & bytesFreed) void LocalOverlayStore::optimiseStore() { - warn("not implemented"); + Activity act(*logger, actOptimiseStore); + + // Note for LocalOverlayStore, queryAllValidPaths only returns paths in upper layer + auto paths = queryAllValidPaths(); + + act.progress(0, paths.size()); + + uint64_t done = 0; + + for (auto & path : paths) { + if (lowerStore->isValidPath(path)) { + // Deduplicate store path + deletePath(toUpperPath(path)); + } + done++; + act.progress(done, paths.size()); + } } bool LocalOverlayStore::verifyStore(bool checkContents, RepairFlag repair) diff --git a/tests/overlay-local-store/optimise-inner.sh b/tests/overlay-local-store/optimise-inner.sh index c60c742a2..2b778b311 100755 --- a/tests/overlay-local-store/optimise-inner.sh +++ b/tests/overlay-local-store/optimise-inner.sh @@ -45,8 +45,7 @@ overlayInode=$(stat -c %i "$overlayPath") nix-store --store "$storeB" --optimise remountOverlayfs +# Check path only exists in lower store stat "$lowerPath" stat "$overlayPath" expect 1 stat "$upperPath" - -#expect 1 stat $(toRealPath "$storeA/nix/store" "$path")