aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/drv-output-substitution-goal.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-04-27 18:51:39 +0200
committereldritch horrors <pennae@lix.systems>2024-05-07 14:35:20 +0000
commit230860dbb8fc061fd55b98cedd134cdc5097ea69 (patch)
tree21d68a7d3276eef5f978bbf97f4dcf344700bb3c /src/libstore/build/drv-output-substitution-goal.cc
parent29f93e1e0d405440b35f1aa7c601dc5f601f9a90 (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.cc14
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();