introduces Goal::jobCategory
This commit is contained in:
parent
1ea1e378de
commit
13185133bc
|
@ -335,6 +335,8 @@ struct DerivationGoal : public Goal
|
||||||
void waiteeDone(GoalPtr waitee, ExitCode result) override;
|
void waiteeDone(GoalPtr waitee, ExitCode result) override;
|
||||||
|
|
||||||
StorePathSet exportReferences(const StorePathSet & storePaths);
|
StorePathSet exportReferences(const StorePathSet & storePaths);
|
||||||
|
|
||||||
|
JobCategory jobCategory() override { return JobCategory::Build; };
|
||||||
};
|
};
|
||||||
|
|
||||||
MakeError(NotDeterministic, BuildError);
|
MakeError(NotDeterministic, BuildError);
|
||||||
|
|
|
@ -21,7 +21,7 @@ class Worker;
|
||||||
class DrvOutputSubstitutionGoal : public Goal {
|
class DrvOutputSubstitutionGoal : public Goal {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The drv output we're trying to substitue
|
* The drv output we're trying to substitute
|
||||||
*/
|
*/
|
||||||
DrvOutput id;
|
DrvOutput id;
|
||||||
|
|
||||||
|
@ -72,6 +72,8 @@ public:
|
||||||
|
|
||||||
void work() override;
|
void work() override;
|
||||||
void handleEOF(int fd) override;
|
void handleEOF(int fd) override;
|
||||||
|
|
||||||
|
JobCategory jobCategory() override { return JobCategory::Substitution; };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,17 @@ typedef std::set<WeakGoalPtr, std::owner_less<WeakGoalPtr>> WeakGoals;
|
||||||
*/
|
*/
|
||||||
typedef std::map<StorePath, WeakGoalPtr> WeakGoalMap;
|
typedef std::map<StorePath, WeakGoalPtr> WeakGoalMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used as a hint to the worker on how to schedule a particular goal. For example,
|
||||||
|
* builds are typically CPU- and memory-bound, while substitutions are I/O bound.
|
||||||
|
* Using this information, the worker might decide to schedule more or fewer goals
|
||||||
|
* of each category in parallel.
|
||||||
|
*/
|
||||||
|
enum struct JobCategory {
|
||||||
|
Build,
|
||||||
|
Substitution,
|
||||||
|
};
|
||||||
|
|
||||||
struct Goal : public std::enable_shared_from_this<Goal>
|
struct Goal : public std::enable_shared_from_this<Goal>
|
||||||
{
|
{
|
||||||
typedef enum {ecBusy, ecSuccess, ecFailed, ecNoSubstituters, ecIncompleteClosure} ExitCode;
|
typedef enum {ecBusy, ecSuccess, ecFailed, ecNoSubstituters, ecIncompleteClosure} ExitCode;
|
||||||
|
@ -150,6 +161,8 @@ public:
|
||||||
void amDone(ExitCode result, std::optional<Error> ex = {});
|
void amDone(ExitCode result, std::optional<Error> ex = {});
|
||||||
|
|
||||||
virtual void cleanup() { }
|
virtual void cleanup() { }
|
||||||
|
|
||||||
|
virtual JobCategory jobCategory() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
void addToWeakGoals(WeakGoals & goals, GoalPtr p);
|
void addToWeakGoals(WeakGoals & goals, GoalPtr p);
|
||||||
|
|
|
@ -115,6 +115,8 @@ public:
|
||||||
void handleEOF(int fd) override;
|
void handleEOF(int fd) override;
|
||||||
|
|
||||||
void cleanup() override;
|
void cleanup() override;
|
||||||
|
|
||||||
|
JobCategory jobCategory() override { return JobCategory::Substitution; };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ void Worker::childStarted(GoalPtr goal, const std::set<int> & fds,
|
||||||
child.respectTimeouts = respectTimeouts;
|
child.respectTimeouts = respectTimeouts;
|
||||||
children.emplace_back(child);
|
children.emplace_back(child);
|
||||||
if (inBuildSlot) {
|
if (inBuildSlot) {
|
||||||
if (dynamic_cast<PathSubstitutionGoal *>(child.goal2)) nrSubstitutions++;
|
if (goal->jobCategory() == JobCategory::Substitution) nrSubstitutions++;
|
||||||
else nrLocalBuilds++;
|
else nrLocalBuilds++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,7 +208,7 @@ void Worker::childTerminated(Goal * goal, bool wakeSleepers)
|
||||||
if (i == children.end()) return;
|
if (i == children.end()) return;
|
||||||
|
|
||||||
if (i->inBuildSlot) {
|
if (i->inBuildSlot) {
|
||||||
if (dynamic_cast<PathSubstitutionGoal *>(goal)) {
|
if (goal->jobCategory() == JobCategory::Substitution) {
|
||||||
assert(nrSubstitutions > 0);
|
assert(nrSubstitutions > 0);
|
||||||
nrSubstitutions--;
|
nrSubstitutions--;
|
||||||
} else {
|
} else {
|
||||||
|
@ -235,7 +235,7 @@ void Worker::childTerminated(Goal * goal, bool wakeSleepers)
|
||||||
void Worker::waitForBuildSlot(GoalPtr goal)
|
void Worker::waitForBuildSlot(GoalPtr goal)
|
||||||
{
|
{
|
||||||
debug("wait for build slot");
|
debug("wait for build slot");
|
||||||
bool isSubstitutionGoal = dynamic_cast<PathSubstitutionGoal *>(goal.get());
|
bool isSubstitutionGoal = goal->jobCategory() == JobCategory::Substitution;
|
||||||
if ((!isSubstitutionGoal && getNrLocalBuilds() < settings.maxBuildJobs) ||
|
if ((!isSubstitutionGoal && getNrLocalBuilds() < settings.maxBuildJobs) ||
|
||||||
(isSubstitutionGoal && getNrSubstitutions() < settings.maxSubstitutionJobs))
|
(isSubstitutionGoal && getNrSubstitutions() < settings.maxSubstitutionJobs))
|
||||||
wakeUp(goal); /* we can do it right away */
|
wakeUp(goal); /* we can do it right away */
|
||||||
|
|
Loading…
Reference in a new issue