diff options
author | eldritch horrors <pennae@lix.systems> | 2024-04-27 18:51:39 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-05-07 14:35:20 +0000 |
commit | 230860dbb8fc061fd55b98cedd134cdc5097ea69 (patch) | |
tree | 21d68a7d3276eef5f978bbf97f4dcf344700bb3c /src/libstore/build/drv-output-substitution-goal.cc | |
parent | 29f93e1e0d405440b35f1aa7c601dc5f601f9a90 (diff) |
libstore: limit CA realisation info substitution concurrency
this seems to be an oversight, considering that regular substitutions
are concurrency-limited. while not particularly necessary at present,
once we've removed the `Callback` based interfaces it will be needed.
Change-Id: Ide2d08169fcc24752cbd07a1d33fb8482f7034f5
Diffstat (limited to 'src/libstore/build/drv-output-substitution-goal.cc')
-rw-r--r-- | src/libstore/build/drv-output-substitution-goal.cc | 14 |
1 files changed, 14 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(); |