* When using build hooks, for any nix-store -r build operation, it is
necessary that at least one build hook doesn't return "postpone", otherwise nix-store will barf ("waiting for a build slot, yet there are no running children"). So inform the build hook when this is the case, so that it can start a build even when that would exceed the maximum load on a machine.
This commit is contained in:
parent
5dfba0b4db
commit
909fbb9de1
2 changed files with 18 additions and 7 deletions
|
@ -219,6 +219,9 @@ public:
|
|||
/* Can we start another child process? */
|
||||
bool canBuildMore();
|
||||
|
||||
/* Can we postpone a build right now? */
|
||||
bool canPostpone();
|
||||
|
||||
/* Registers a running child process. `inBuildSlot' means that
|
||||
the process counts towards the jobs limit. */
|
||||
void childStarted(GoalPtr goal, pid_t pid,
|
||||
|
@ -1296,7 +1299,9 @@ DerivationGoal::HookReply DerivationGoal::tryBuildHook()
|
|||
(worker.canBuildMore() ? (string) "1" : "0").c_str(),
|
||||
thisSystem.c_str(),
|
||||
drv.platform.c_str(),
|
||||
drvPath.c_str(), NULL);
|
||||
drvPath.c_str(),
|
||||
(worker.canPostpone() ? (string) "0" : "1").c_str(),
|
||||
NULL);
|
||||
|
||||
throw SysError(format("executing `%1%'") % buildHook);
|
||||
|
||||
|
@ -2602,6 +2607,12 @@ bool Worker::canBuildMore()
|
|||
}
|
||||
|
||||
|
||||
bool Worker::canPostpone()
|
||||
{
|
||||
return children.size() != 0;
|
||||
}
|
||||
|
||||
|
||||
void Worker::childStarted(GoalPtr goal,
|
||||
pid_t pid, const set<int> & fds, bool inBuildSlot)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue