From d7d0acdbb4c1925047e39fa46e9410f9ddd87429 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Tue, 11 Feb 2025 01:06:15 +0100 Subject: [PATCH] libstore: create drv temp roots in Worker constructors can't be async, and root creation must be made async. creating roots outside of goal classes and passing a witness type is a lot easier than changing the constructor structure of today. Change-Id: Ic84a92f3db2e1a9a9164047456f227048c6871bd --- lix/libstore/build/derivation-goal.cc | 6 +----- lix/libstore/build/derivation-goal.hh | 5 ++++- lix/libstore/build/local-derivation-goal.hh | 1 + lix/libstore/build/worker.cc | 8 ++++++-- lix/libstore/platform.cc | 9 +++++---- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/lix/libstore/build/derivation-goal.cc b/lix/libstore/build/derivation-goal.cc index be7bb8f6f..87f9a1b2c 100644 --- a/lix/libstore/build/derivation-goal.cc +++ b/lix/libstore/build/derivation-goal.cc @@ -82,7 +82,7 @@ DerivationGoal::DerivationGoal(const StorePath & drvPath, } -DerivationGoal::DerivationGoal(const StorePath & drvPath, const BasicDerivation & drv, +DerivationGoal::DerivationGoal(DrvHasRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, Worker & worker, bool isDependency, BuildMode buildMode) : Goal(worker, isDependency) , useDerivation(false) @@ -98,10 +98,6 @@ DerivationGoal::DerivationGoal(const StorePath & drvPath, const BasicDerivation trace("created"); mcExpectedBuilds = worker.expectedBuilds.addTemporarily(1); - - /* Prevent the .chroot directory from being - garbage-collected. (See isActiveTempFile() in gc.cc.) */ - worker.store.addTempRoot(this->drvPath); } diff --git a/lix/libstore/build/derivation-goal.hh b/lix/libstore/build/derivation-goal.hh index 2a547ecb3..3ce619402 100644 --- a/lix/libstore/build/derivation-goal.hh +++ b/lix/libstore/build/derivation-goal.hh @@ -245,10 +245,13 @@ struct DerivationGoal : public Goal */ std::string machineName; + /** Witness type to say that the drvPath has already been added as a temp root */ + struct DrvHasRoot { explicit DrvHasRoot() = default; }; + DerivationGoal(const StorePath & drvPath, const OutputsSpec & wantedOutputs, Worker & worker, bool isDependency, BuildMode buildMode = bmNormal); - DerivationGoal(const StorePath & drvPath, const BasicDerivation & drv, + DerivationGoal(DrvHasRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, Worker & worker, bool isDependency, BuildMode buildMode = bmNormal); virtual ~DerivationGoal() noexcept(false); diff --git a/lix/libstore/build/local-derivation-goal.hh b/lix/libstore/build/local-derivation-goal.hh index d9a7bb91b..61325f36c 100644 --- a/lix/libstore/build/local-derivation-goal.hh +++ b/lix/libstore/build/local-derivation-goal.hh @@ -195,6 +195,7 @@ struct LocalDerivationGoal : public DerivationGoal * possibly a platform-specific subclass */ static std::unique_ptr makeLocalDerivationGoal( + DrvHasRoot drvRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, diff --git a/lix/libstore/build/worker.cc b/lix/libstore/build/worker.cc index 2c1ac9c0c..e3e9b7849 100644 --- a/lix/libstore/build/worker.cc +++ b/lix/libstore/build/worker.cc @@ -142,16 +142,20 @@ std::pair, kj::Promise> BuildMode buildMode ) { + /* Prevent the .chroot directory from being + garbage-collected. (See isActiveTempFile() in gc.cc.) */ + store.addTempRoot(drvPath); + return makeGoalCommon( derivationGoals, drvPath, [&]() -> std::unique_ptr { return !dynamic_cast(&store) ? std::make_unique( - drvPath, drv, wantedOutputs, *this, running, buildMode + DerivationGoal::DrvHasRoot{}, drvPath, drv, wantedOutputs, *this, running, buildMode ) : LocalDerivationGoal::makeLocalDerivationGoal( - drvPath, drv, wantedOutputs, *this, running, buildMode + DerivationGoal::DrvHasRoot{}, drvPath, drv, wantedOutputs, *this, running, buildMode ); }, [&](DerivationGoal & g) { return g.addWantedOutputs(wantedOutputs); } diff --git a/lix/libstore/platform.cc b/lix/libstore/platform.cc index 7a1d9c502..f3ce17a60 100644 --- a/lix/libstore/platform.cc +++ b/lix/libstore/platform.cc @@ -45,6 +45,7 @@ std::unique_ptr LocalDerivationGoal::makeLocalDerivationGoa } std::unique_ptr LocalDerivationGoal::makeLocalDerivationGoal( + DrvHasRoot drvRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, @@ -55,19 +56,19 @@ std::unique_ptr LocalDerivationGoal::makeLocalDerivationGoa { #if __linux__ return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #elif __APPLE__ return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #elif __FreeBSD__ return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #else return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #endif }