diff options
Diffstat (limited to 'src/libstore/build')
-rw-r--r-- | src/libstore/build/drv-output-substitution-goal.cc | 14 | ||||
-rw-r--r-- | src/libstore/build/drv-output-substitution-goal.hh | 7 | ||||
-rw-r--r-- | src/libstore/build/worker.hh | 1 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/libstore/build/drv-output-substitution-goal.cc b/src/libstore/build/drv-output-substitution-goal.cc index b30957c84..0e85650a7 100644 --- a/src/libstore/build/drv-output-substitution-goal.cc +++ b/src/libstore/build/drv-output-substitution-goal.cc @@ -3,6 +3,7 @@ #include "worker.hh" #include "substitution-goal.hh" #include "callback.hh" +#include "signals.hh" namespace nix { @@ -38,6 +39,18 @@ void DrvOutputSubstitutionGoal::tryNext() { trace("trying next substituter"); + /* Make sure that we are allowed to start a substitution. Note that even + if maxSubstitutionJobs == 0, we still allow a substituter to run. This + prevents infinite waiting. */ + if (worker.runningCASubstitutions >= std::max(1U, settings.maxSubstitutionJobs.get())) { + worker.waitForBuildSlot(shared_from_this()); + return; + } + + maintainRunningSubstitutions = + std::make_unique<MaintainCount<uint64_t>>(worker.runningCASubstitutions); + worker.updateProgress(); + if (subs.size() == 0) { /* None left. Terminate this goal and let someone else deal with it. */ @@ -87,6 +100,7 @@ void DrvOutputSubstitutionGoal::tryNext() void DrvOutputSubstitutionGoal::realisationFetched() { worker.childTerminated(this); + maintainRunningSubstitutions.reset(); try { outputInfo = downloadState->promise.get_future().get(); diff --git a/src/libstore/build/drv-output-substitution-goal.hh b/src/libstore/build/drv-output-substitution-goal.hh index da2426e5e..ab6fb796e 100644 --- a/src/libstore/build/drv-output-substitution-goal.hh +++ b/src/libstore/build/drv-output-substitution-goal.hh @@ -41,6 +41,13 @@ class DrvOutputSubstitutionGoal : public Goal { */ std::shared_ptr<Store> sub; + /** + * The substituter thread. + */ + std::thread thr; + + std::unique_ptr<MaintainCount<uint64_t>> maintainRunningSubstitutions; + struct DownloadState { Pipe outPipe; diff --git a/src/libstore/build/worker.hh b/src/libstore/build/worker.hh index 23ad87914..ba4cd88d7 100644 --- a/src/libstore/build/worker.hh +++ b/src/libstore/build/worker.hh @@ -166,6 +166,7 @@ public: uint64_t doneSubstitutions = 0; uint64_t failedSubstitutions = 0; uint64_t runningSubstitutions = 0; + uint64_t runningCASubstitutions = 0; uint64_t expectedDownloadSize = 0; uint64_t doneDownloadSize = 0; uint64_t expectedNarSize = 0; |