diff --git a/src/libstore/build/derivation-building-goal.cc b/src/libstore/build/derivation-building-goal.cc index 6aab48a80..4497a6070 100644 --- a/src/libstore/build/derivation-building-goal.cc +++ b/src/libstore/build/derivation-building-goal.cc @@ -769,9 +769,11 @@ Goal::Co DerivationBuildingGoal::tryToBuild() try { builtOutputs = builder->unprepareBuild(); } catch (BuilderFailureError & e) { + builder.reset(); outputLocks.unlock(); co_return doneFailure(fixupBuilderFailureErrorMessage(std::move(e))); } catch (BuildError & e) { + builder.reset(); outputLocks.unlock(); // Allow selecting a subset of enum values # pragma GCC diagnostic push @@ -796,6 +798,7 @@ Goal::Co DerivationBuildingGoal::tryToBuild() co_return doneFailure(std::move(e)); } { + builder.reset(); StorePathSet outputPaths; for (auto & [_, output] : builtOutputs) { // for sake of `bmRepair` diff --git a/src/libstore/unix/build/derivation-builder.cc b/src/libstore/unix/build/derivation-builder.cc index 60509560d..f837efe5a 100644 --- a/src/libstore/unix/build/derivation-builder.cc +++ b/src/libstore/unix/build/derivation-builder.cc @@ -484,14 +484,6 @@ bool DerivationBuilderImpl::prepareBuild() SingleDrvOutputs DerivationBuilderImpl::unprepareBuild() { - // FIXME: get rid of this, rely on RAII. - Finally releaseBuildUser([&]() { - /* Release the build user at the end of this function. We don't do - it right away because we don't want another build grabbing this - uid and then messing around with our output. */ - buildUser.reset(); - }); - /* Since we got an EOF on the logger pipe, the builder is presumed to have terminated. In fact, the builder could also have simply have closed its end of the pipe, so just to be sure,