aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/worker.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-08-11 01:37:40 +0200
committereldritch horrors <pennae@lix.systems>2024-08-18 09:10:05 +0000
commit38f550708dd01515f7aaf66b0cc548fcd701e1c0 (patch)
tree67150416d442821b921d705aa5401a87c1d8f3bb /src/libstore/build/worker.cc
parent176e1058f11d4b957a82bd6cc184e73b1ce5688f (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.cc23
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