forked from lix-project/lix
* 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
|
@ -23,10 +23,8 @@ use English '-no_match_vars';
|
||||||
|
|
||||||
my $loadIncreased = 0;
|
my $loadIncreased = 0;
|
||||||
|
|
||||||
my $amWilling = shift @ARGV;
|
my ($amWilling, $localSystem, $neededSystem, $drvPath, $mustRun) = @ARGV;
|
||||||
my $localSystem = shift @ARGV;
|
$mustRun = 0 unless defined $mustRun;
|
||||||
my $neededSystem = shift @ARGV;
|
|
||||||
my $drvPath = shift @ARGV;
|
|
||||||
|
|
||||||
sub sendReply {
|
sub sendReply {
|
||||||
my $reply = shift;
|
my $reply = shift;
|
||||||
|
@ -91,13 +89,15 @@ LOOP: foreach my $cur (@machines) {
|
||||||
# We have a machine of the right type. Try to get a lock on
|
# We have a machine of the right type. Try to get a lock on
|
||||||
# one of the machine's lock files.
|
# one of the machine's lock files.
|
||||||
my $slot = 0;
|
my $slot = 0;
|
||||||
while ($slot < $cur->{maxJobs}) {
|
while ($slot < $cur->{maxJobs} || $mustRun) {
|
||||||
my $slotLock = "$currentLoad/" . $cur->{systemType} . "-" . $cur->{hostName} . "-$slot";
|
my $slotLock = "$currentLoad/" . $cur->{systemType} . "-" . $cur->{hostName} . "-$slot";
|
||||||
open SLOTLOCK, ">>$slotLock" or die;
|
open SLOTLOCK, ">>$slotLock" or die;
|
||||||
if (flock(SLOTLOCK, LOCK_EX | LOCK_NB)) {
|
if (flock(SLOTLOCK, LOCK_EX | LOCK_NB)) {
|
||||||
|
print STDERR "warning: exceeding maximum load on " . $cur->{systemType} . "\n"
|
||||||
|
if $slot >= $cur->{maxJobs};
|
||||||
$machine = $cur;
|
$machine = $cur;
|
||||||
last LOOP;
|
last LOOP;
|
||||||
}
|
}
|
||||||
close SLOTLOCK;
|
close SLOTLOCK;
|
||||||
$slot++;
|
$slot++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,6 +219,9 @@ public:
|
||||||
/* Can we start another child process? */
|
/* Can we start another child process? */
|
||||||
bool canBuildMore();
|
bool canBuildMore();
|
||||||
|
|
||||||
|
/* Can we postpone a build right now? */
|
||||||
|
bool canPostpone();
|
||||||
|
|
||||||
/* Registers a running child process. `inBuildSlot' means that
|
/* Registers a running child process. `inBuildSlot' means that
|
||||||
the process counts towards the jobs limit. */
|
the process counts towards the jobs limit. */
|
||||||
void childStarted(GoalPtr goal, pid_t pid,
|
void childStarted(GoalPtr goal, pid_t pid,
|
||||||
|
@ -1296,7 +1299,9 @@ DerivationGoal::HookReply DerivationGoal::tryBuildHook()
|
||||||
(worker.canBuildMore() ? (string) "1" : "0").c_str(),
|
(worker.canBuildMore() ? (string) "1" : "0").c_str(),
|
||||||
thisSystem.c_str(),
|
thisSystem.c_str(),
|
||||||
drv.platform.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);
|
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,
|
void Worker::childStarted(GoalPtr goal,
|
||||||
pid_t pid, const set<int> & fds, bool inBuildSlot)
|
pid_t pid, const set<int> & fds, bool inBuildSlot)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue