diff options
author | eldritch horrors <pennae@lix.systems> | 2024-08-11 01:37:40 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-08-18 09:10:05 +0000 |
commit | 38f550708dd01515f7aaf66b0cc548fcd701e1c0 (patch) | |
tree | 67150416d442821b921d705aa5401a87c1d8f3bb /src/libstore/build/worker.cc | |
parent | 176e1058f11d4b957a82bd6cc184e73b1ce5688f (diff) |
libstore: add explicit in-build-slot-ness to goals
we don't need to expose information about how busy a Worker is if the
worker can instead tell its work items whether they are in a slot. in
the future we might use this to not start items waiting for a slot if
no slots are currently available, but that requires more preparation.
Change-Id: Ibe01ac536da7e6d6f80520164117c43e772f9bd9
Diffstat (limited to 'src/libstore/build/worker.cc')
-rw-r--r-- | src/libstore/build/worker.cc | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/src/libstore/build/worker.cc b/src/libstore/build/worker.cc index a27cb0076..411525d94 100644 --- a/src/libstore/build/worker.cc +++ b/src/libstore/build/worker.cc @@ -232,18 +232,6 @@ void Worker::wakeUp(GoalPtr goal) } -unsigned Worker::getNrLocalBuilds() -{ - return nrLocalBuilds; -} - - -unsigned Worker::getNrSubstitutions() -{ - return nrSubstitutions; -} - - void Worker::childStarted(GoalPtr goal, const std::set<int> & fds, bool inBuildSlot, bool respectTimeouts) { @@ -307,8 +295,8 @@ void Worker::waitForBuildSlot(GoalPtr goal) { goal->trace("wait for build slot"); bool isSubstitutionGoal = goal->jobCategory() == JobCategory::Substitution; - if ((!isSubstitutionGoal && getNrLocalBuilds() < settings.maxBuildJobs) || - (isSubstitutionGoal && getNrSubstitutions() < settings.maxSubstitutionJobs)) + if ((!isSubstitutionGoal && nrLocalBuilds < settings.maxBuildJobs) || + (isSubstitutionGoal && nrSubstitutions < settings.maxSubstitutionJobs)) wakeUp(goal); /* we can do it right away */ else wantingToBuild.insert(goal); @@ -364,7 +352,12 @@ void Worker::run(const Goals & _topGoals) awake.clear(); for (auto & goal : awake2) { checkInterrupt(); - handleWorkResult(goal, goal->work()); + /* Make sure that we are always allowed to run at least one substitution. + This prevents infinite waiting. */ + const bool inSlot = goal->jobCategory() == JobCategory::Substitution + ? nrSubstitutions < std::max(1U, (unsigned int) settings.maxSubstitutionJobs) + : nrLocalBuilds < settings.maxBuildJobs; + handleWorkResult(goal, goal->work(inSlot)); actDerivations.progress( doneBuilds, expectedBuilds + doneBuilds, runningBuilds, failedBuilds |