diff --git a/src/libfetchers/fetch-to-store.cc b/src/libfetchers/fetch-to-store.cc index e2b06d8ca92..3af2d4c83e8 100644 --- a/src/libfetchers/fetch-to-store.cc +++ b/src/libfetchers/fetch-to-store.cc @@ -47,6 +47,12 @@ std::pair fetchToStore2( auto hash = Hash::parseSRI(fetchers::getStrAttr(*res, "hash")); auto storePath = store.makeFixedOutputPathFromCA(name, ContentAddressWithReferences::fromParts(method, hash, {})); + + /* Add a temproot before the call to isValidPath to prevent accidental GC in case the + input is cached. Note that this must be done before to avoid races. */ + if (mode != FetchMode::DryRun) + store.addTempRoot(storePath); + if (mode == FetchMode::DryRun || store.isValidPath(storePath)) { debug( "source path '%s' cache hit in '%s' (hash '%s')", diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc index 10c6c724cc6..e91b08e0516 100644 --- a/src/libstore/derivations.cc +++ b/src/libstore/derivations.cc @@ -139,6 +139,12 @@ StorePath Store::writeDerivation(const Derivation & drv, RepairFlag repair) { auto [suffix, contents, references, path] = infoForDerivation(*this, drv); + /* In case the derivation is already valid, we bail out early since that's + faster. But we need to make sure that the derivation has a corresponding + temproot. It is added by the remote in addToStoreFromDump, but we'd like + to avoid sending a lot of drv contents to the daemon. */ + addTempRoot(path); + if (isValidPath(path) && !repair) return path;