diff --git a/src/libstore/build/derivation-building-goal.cc b/src/libstore/build/derivation-building-goal.cc index a4aace163..2b7622b3c 100644 --- a/src/libstore/build/derivation-building-goal.cc +++ b/src/libstore/build/derivation-building-goal.cc @@ -673,10 +673,13 @@ Goal::Co DerivationBuildingGoal::tryToBuild() } }; + auto * localStoreP = dynamic_cast(&worker.store); + assert(localStoreP); + /* If we have to wait and retry (see below), then `builder` will already be created, so we don't need to create it again. */ builder = makeDerivationBuilder( - worker.store, + *localStoreP, std::make_unique(*this, builder), DerivationBuilderParams{ drvPath, diff --git a/src/libstore/unix/build/chroot-derivation-builder.cc b/src/libstore/unix/build/chroot-derivation-builder.cc index ccf4f8e20..669e3ffb7 100644 --- a/src/libstore/unix/build/chroot-derivation-builder.cc +++ b/src/libstore/unix/build/chroot-derivation-builder.cc @@ -5,7 +5,7 @@ namespace nix { struct ChrootDerivationBuilder : virtual DerivationBuilderImpl { ChrootDerivationBuilder( - Store & store, std::unique_ptr miscMethods, DerivationBuilderParams params) + LocalStore & store, std::unique_ptr miscMethods, DerivationBuilderParams params) : DerivationBuilderImpl{store, std::move(miscMethods), std::move(params)} { } @@ -178,7 +178,7 @@ struct ChrootDerivationBuilder : virtual DerivationBuilderImpl continue; if (buildMode != bmCheck && status.known->isValid()) continue; - auto p = store.toRealPath(status.known->path); + auto p = store.Store::toRealPath(status.known->path); if (pathExists(chrootRootDir + p)) std::filesystem::rename((chrootRootDir + p), p); } diff --git a/src/libstore/unix/build/darwin-derivation-builder.cc b/src/libstore/unix/build/darwin-derivation-builder.cc index d25325126..5889ecf8f 100644 --- a/src/libstore/unix/build/darwin-derivation-builder.cc +++ b/src/libstore/unix/build/darwin-derivation-builder.cc @@ -21,7 +21,7 @@ struct DarwinDerivationBuilder : DerivationBuilderImpl bool useSandbox; DarwinDerivationBuilder( - Store & store, + LocalStore & store, std::unique_ptr miscMethods, DerivationBuilderParams params, bool useSandbox) diff --git a/src/libstore/unix/build/derivation-builder.cc b/src/libstore/unix/build/derivation-builder.cc index 190352985..7520933c4 100644 --- a/src/libstore/unix/build/derivation-builder.cc +++ b/src/libstore/unix/build/derivation-builder.cc @@ -61,14 +61,14 @@ class DerivationBuilderImpl : public DerivationBuilder, public DerivationBuilder { protected: - Store & store; + LocalStore & store; std::unique_ptr miscMethods; public: DerivationBuilderImpl( - Store & store, std::unique_ptr miscMethods, DerivationBuilderParams params) + LocalStore & store, std::unique_ptr miscMethods, DerivationBuilderParams params) : DerivationBuilderParams{std::move(params)} , store{store} , miscMethods{std::move(miscMethods)} @@ -424,13 +424,6 @@ void handleDiffHook( const Path DerivationBuilderImpl::homeDir = "/homeless-shelter"; -static LocalStore & getLocalStore(Store & store) -{ - auto p = dynamic_cast(&store); - assert(p); - return *p; -} - void DerivationBuilderImpl::killSandbox(bool getStats) { if (buildUser) { @@ -631,10 +624,9 @@ bool DerivationBuilderImpl::decideWhetherDiskFull() so, we don't mark this build as a permanent failure. */ #if HAVE_STATVFS { - auto & localStore = getLocalStore(store); uint64_t required = 8ULL * 1024 * 1024; // FIXME: make configurable struct statvfs st; - if (statvfs(localStore.config->realStoreDir.get().c_str(), &st) == 0 + if (statvfs(store.config->realStoreDir.get().c_str(), &st) == 0 && (uint64_t) st.f_bavail * st.f_bsize < required) diskFull = true; if (statvfs(tmpDir.c_str(), &st) == 0 && (uint64_t) st.f_bavail * st.f_bsize < required) @@ -712,7 +704,7 @@ void DerivationBuilderImpl::startBuilder() Magenta(drv.platform), concatStringsSep(", ", drvOptions.getRequiredSystemFeatures(drv)), Magenta(settings.thisSystem), - concatStringsSep(", ", store.config.systemFeatures)); + concatStringsSep(", ", store.Store::config.systemFeatures)); // since aarch64-darwin has Rosetta 2, this user can actually run x86_64-darwin on their hardware - we should // tell them to run the command to install Darwin 2 @@ -724,7 +716,7 @@ void DerivationBuilderImpl::startBuilder() throw BuildError(msg); } - auto buildDir = getLocalStore(store).config->getBuildDir(); + auto buildDir = store.config->getBuildDir(); createDirs(buildDir); @@ -1173,7 +1165,7 @@ void DerivationBuilderImpl::startDaemon() auto store = makeRestrictedStore( [&] { - auto config = make_ref(*getLocalStore(this->store).config); + auto config = make_ref(*this->store.config); config->pathInfoCacheSize = 0; config->stateDir = "/no-such-path"; config->logDir = "/no-such-path"; @@ -1839,8 +1831,6 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs() } } - auto & localStore = getLocalStore(store); - if (buildMode == bmCheck) { if (!store.isValidPath(newInfo.path)) @@ -1876,8 +1866,8 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs() /* Since we verified the build, it's now ultimately trusted. */ if (!oldInfo.ultimate) { oldInfo.ultimate = true; - localStore.signPathInfo(oldInfo); - localStore.registerValidPaths({{oldInfo.path, oldInfo}}); + store.signPathInfo(oldInfo); + store.registerValidPaths({{oldInfo.path, oldInfo}}); } continue; @@ -1891,12 +1881,12 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs() debug("unreferenced input: '%1%'", store.printStorePath(i)); } - localStore.optimisePath(actualPath, NoRepair); // FIXME: combine with scanForReferences() + store.optimisePath(actualPath, NoRepair); // FIXME: combine with scanForReferences() miscMethods->markContentsGood(newInfo.path); newInfo.deriver = drvPath; newInfo.ultimate = true; - localStore.signPathInfo(newInfo); + store.signPathInfo(newInfo); finish(newInfo.path); @@ -1904,7 +1894,7 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs() isn't statically known so that we can safely unlock the path before the next iteration */ if (newInfo.ca) - localStore.registerValidPaths({{newInfo.path, newInfo}}); + store.registerValidPaths({{newInfo.path, newInfo}}); infos.emplace(outputName, std::move(newInfo)); } @@ -1925,13 +1915,11 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs() paths referenced by each of them. If there are cycles in the outputs, this will fail. */ { - auto & localStore = getLocalStore(store); - ValidPathInfos infos2; for (auto & [outputName, newInfo] : infos) { infos2.insert_or_assign(newInfo.path, newInfo); } - localStore.registerValidPaths(infos2); + store.registerValidPaths(infos2); } /* In case of a fixed-output derivation hash mismatch, throw an @@ -2164,7 +2152,7 @@ StorePath DerivationBuilderImpl::makeFallbackPath(const StorePath & path) namespace nix { std::unique_ptr makeDerivationBuilder( - Store & store, std::unique_ptr miscMethods, DerivationBuilderParams params) + LocalStore & store, std::unique_ptr miscMethods, DerivationBuilderParams params) { bool useSandbox = false; @@ -2191,8 +2179,7 @@ std::unique_ptr makeDerivationBuilder( useSandbox = params.drv.type().isSandboxed() && !params.drvOptions.noChroot; } - auto & localStore = getLocalStore(store); - if (localStore.storeDir != localStore.config->realStoreDir.get()) { + if (store.storeDir != store.config->realStoreDir.get()) { #ifdef __linux__ useSandbox = true; #else diff --git a/src/libstore/unix/build/linux-derivation-builder.cc b/src/libstore/unix/build/linux-derivation-builder.cc index 3e67cdd42..0d9dc4a85 100644 --- a/src/libstore/unix/build/linux-derivation-builder.cc +++ b/src/libstore/unix/build/linux-derivation-builder.cc @@ -191,7 +191,7 @@ struct ChrootLinuxDerivationBuilder : ChrootDerivationBuilder, LinuxDerivationBu std::optional cgroup; ChrootLinuxDerivationBuilder( - Store & store, std::unique_ptr miscMethods, DerivationBuilderParams params) + LocalStore & store, std::unique_ptr miscMethods, DerivationBuilderParams params) : DerivationBuilderImpl{store, std::move(miscMethods), std::move(params)} , ChrootDerivationBuilder{store, std::move(miscMethods), std::move(params)} , LinuxDerivationBuilder{store, std::move(miscMethods), std::move(params)} @@ -492,7 +492,7 @@ struct ChrootLinuxDerivationBuilder : ChrootDerivationBuilder, LinuxDerivationBu createDirs(chrootRootDir + "/dev/shm"); createDirs(chrootRootDir + "/dev/pts"); ss.push_back("/dev/full"); - if (store.config.systemFeatures.get().count("kvm") && pathExists("/dev/kvm")) + if (store.Store::config.systemFeatures.get().count("kvm") && pathExists("/dev/kvm")) ss.push_back("/dev/kvm"); ss.push_back("/dev/null"); ss.push_back("/dev/random"); diff --git a/src/libstore/unix/include/nix/store/build/derivation-builder.hh b/src/libstore/unix/include/nix/store/build/derivation-builder.hh index 465b45197..8a36a6a8f 100644 --- a/src/libstore/unix/include/nix/store/build/derivation-builder.hh +++ b/src/libstore/unix/include/nix/store/build/derivation-builder.hh @@ -179,6 +179,6 @@ struct DerivationBuilder : RestrictionContext }; std::unique_ptr makeDerivationBuilder( - Store & store, std::unique_ptr miscMethods, DerivationBuilderParams params); + LocalStore & store, std::unique_ptr miscMethods, DerivationBuilderParams params); } // namespace nix