* Revert r19797, and use a simpler solution: just don't monitor build
hooks for silence. It's unnecessary because the remote nix-store command is already monitoring the real build.
This commit is contained in:
parent
f859a8d3c3
commit
4e17be7981
4 changed files with 21 additions and 37 deletions
|
@ -31,11 +31,6 @@ static void sigintHandler(int signo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void sigalrmHandler(int signo)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Path makeRootName(const Path & gcRoot, int & counter)
|
Path makeRootName(const Path & gcRoot, int & counter)
|
||||||
{
|
{
|
||||||
counter++;
|
counter++;
|
||||||
|
@ -165,14 +160,6 @@ static void initAndRun(int argc, char * * argv)
|
||||||
if (sigaction(SIGPIPE, &act, 0))
|
if (sigaction(SIGPIPE, &act, 0))
|
||||||
throw SysError("ignoring SIGPIPE");
|
throw SysError("ignoring SIGPIPE");
|
||||||
|
|
||||||
/* Catch SIGALRM with an empty handler (we just need it to get an
|
|
||||||
EINTR from blocking system calls). */
|
|
||||||
act.sa_handler = sigalrmHandler;
|
|
||||||
sigfillset(&act.sa_mask);
|
|
||||||
act.sa_flags = 0;
|
|
||||||
if (sigaction(SIGALRM, &act, 0))
|
|
||||||
throw SysError("installing handler for SIGALRM");
|
|
||||||
|
|
||||||
/* Reset SIGCHLD to its default. */
|
/* Reset SIGCHLD to its default. */
|
||||||
act.sa_handler = SIG_DFL;
|
act.sa_handler = SIG_DFL;
|
||||||
act.sa_flags = 0;
|
act.sa_flags = 0;
|
||||||
|
|
|
@ -162,6 +162,7 @@ struct Child
|
||||||
{
|
{
|
||||||
WeakGoalPtr goal;
|
WeakGoalPtr goal;
|
||||||
set<int> fds;
|
set<int> fds;
|
||||||
|
bool monitorForSilence;
|
||||||
bool inBuildSlot;
|
bool inBuildSlot;
|
||||||
time_t lastOutput; /* time we last got output on stdout/stderr */
|
time_t lastOutput; /* time we last got output on stdout/stderr */
|
||||||
};
|
};
|
||||||
|
@ -234,7 +235,7 @@ public:
|
||||||
/* 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,
|
||||||
const set<int> & fds, bool inBuildSlot);
|
const set<int> & fds, bool inBuildSlot, bool monitorForSilence);
|
||||||
|
|
||||||
/* Unregisters a running child process. `wakeSleepers' should be
|
/* Unregisters a running child process. `wakeSleepers' should be
|
||||||
false if there is no sense in waking up goals that are sleeping
|
false if there is no sense in waking up goals that are sleeping
|
||||||
|
@ -1262,7 +1263,7 @@ DerivationGoal::HookReply DerivationGoal::tryBuildHook()
|
||||||
pid.setKillSignal(SIGTERM);
|
pid.setKillSignal(SIGTERM);
|
||||||
logPipe.writeSide.close();
|
logPipe.writeSide.close();
|
||||||
worker.childStarted(shared_from_this(),
|
worker.childStarted(shared_from_this(),
|
||||||
pid, singleton<set<int> >(logPipe.readSide), false);
|
pid, singleton<set<int> >(logPipe.readSide), false, false);
|
||||||
|
|
||||||
toHook.readSide.close();
|
toHook.readSide.close();
|
||||||
|
|
||||||
|
@ -1767,7 +1768,7 @@ void DerivationGoal::startBuilder()
|
||||||
pid.setSeparatePG(true);
|
pid.setSeparatePG(true);
|
||||||
logPipe.writeSide.close();
|
logPipe.writeSide.close();
|
||||||
worker.childStarted(shared_from_this(), pid,
|
worker.childStarted(shared_from_this(), pid,
|
||||||
singleton<set<int> >(logPipe.readSide), true);
|
singleton<set<int> >(logPipe.readSide), true, true);
|
||||||
|
|
||||||
if (printBuildTrace) {
|
if (printBuildTrace) {
|
||||||
printMsg(lvlError, format("@ build-started %1% %2% %3% %4%")
|
printMsg(lvlError, format("@ build-started %1% %2% %3% %4%")
|
||||||
|
@ -2274,7 +2275,7 @@ void SubstitutionGoal::tryToRun()
|
||||||
pid.setKillSignal(SIGTERM);
|
pid.setKillSignal(SIGTERM);
|
||||||
logPipe.writeSide.close();
|
logPipe.writeSide.close();
|
||||||
worker.childStarted(shared_from_this(),
|
worker.childStarted(shared_from_this(),
|
||||||
pid, singleton<set<int> >(logPipe.readSide), true);
|
pid, singleton<set<int> >(logPipe.readSide), true, true);
|
||||||
|
|
||||||
state = &SubstitutionGoal::finished;
|
state = &SubstitutionGoal::finished;
|
||||||
|
|
||||||
|
@ -2474,13 +2475,15 @@ unsigned Worker::getNrLocalBuilds()
|
||||||
|
|
||||||
|
|
||||||
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,
|
||||||
|
bool monitorForSilence)
|
||||||
{
|
{
|
||||||
Child child;
|
Child child;
|
||||||
child.goal = goal;
|
child.goal = goal;
|
||||||
child.fds = fds;
|
child.fds = fds;
|
||||||
child.lastOutput = time(0);
|
child.lastOutput = time(0);
|
||||||
child.inBuildSlot = inBuildSlot;
|
child.inBuildSlot = inBuildSlot;
|
||||||
|
child.monitorForSilence = monitorForSilence;
|
||||||
children[pid] = child;
|
children[pid] = child;
|
||||||
if (inBuildSlot) nrLocalBuilds++;
|
if (inBuildSlot) nrLocalBuilds++;
|
||||||
}
|
}
|
||||||
|
@ -2601,13 +2604,17 @@ void Worker::waitForInput()
|
||||||
if (maxSilentTime != 0) {
|
if (maxSilentTime != 0) {
|
||||||
time_t oldest = 0;
|
time_t oldest = 0;
|
||||||
foreach (Children::iterator, i, children) {
|
foreach (Children::iterator, i, children) {
|
||||||
|
if (i->second.monitorForSilence) {
|
||||||
oldest = oldest == 0 || i->second.lastOutput < oldest
|
oldest = oldest == 0 || i->second.lastOutput < oldest
|
||||||
? i->second.lastOutput : oldest;
|
? i->second.lastOutput : oldest;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (oldest) {
|
||||||
useTimeout = true;
|
useTimeout = true;
|
||||||
timeout.tv_sec = std::max((time_t) 0, oldest + maxSilentTime - before);
|
timeout.tv_sec = std::max((time_t) 0, oldest + maxSilentTime - before);
|
||||||
printMsg(lvlVomit, format("sleeping %1% seconds") % timeout.tv_sec);
|
printMsg(lvlVomit, format("sleeping %1% seconds") % timeout.tv_sec);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* If we are polling goals that are waiting for a lock, then wake
|
/* If we are polling goals that are waiting for a lock, then wake
|
||||||
up after a few seconds at most. */
|
up after a few seconds at most. */
|
||||||
|
@ -2681,6 +2688,7 @@ void Worker::waitForInput()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxSilentTime != 0 &&
|
if (maxSilentTime != 0 &&
|
||||||
|
j->second.monitorForSilence &&
|
||||||
after - j->second.lastOutput >= (time_t) maxSilentTime)
|
after - j->second.lastOutput >= (time_t) maxSilentTime)
|
||||||
{
|
{
|
||||||
printMsg(lvlError,
|
printMsg(lvlError,
|
||||||
|
|
|
@ -37,8 +37,7 @@ void deleteLockFile(const Path & path, int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool lockFile(int fd, LockType lockType, bool wait,
|
bool lockFile(int fd, LockType lockType, bool wait)
|
||||||
unsigned int progressInterval)
|
|
||||||
{
|
{
|
||||||
struct flock lock;
|
struct flock lock;
|
||||||
if (lockType == ltRead) lock.l_type = F_RDLCK;
|
if (lockType == ltRead) lock.l_type = F_RDLCK;
|
||||||
|
@ -50,20 +49,11 @@ bool lockFile(int fd, LockType lockType, bool wait,
|
||||||
lock.l_len = 0; /* entire file */
|
lock.l_len = 0; /* entire file */
|
||||||
|
|
||||||
if (wait) {
|
if (wait) {
|
||||||
/* Wait until we acquire the lock. If `progressInterval' is
|
while (fcntl(fd, F_SETLKW, &lock) != 0) {
|
||||||
non-zero, when print a message every `progressInterval'
|
|
||||||
seconds. This is mostly to make sure that remote builders
|
|
||||||
aren't killed due to the `max-silent-time' inactivity
|
|
||||||
monitor while waiting for the garbage collector lock. */
|
|
||||||
while (1) {
|
|
||||||
if (progressInterval) alarm(progressInterval);
|
|
||||||
if (fcntl(fd, F_SETLKW, &lock) == 0) break;
|
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
if (errno != EINTR)
|
if (errno != EINTR)
|
||||||
throw SysError(format("acquiring/releasing lock"));
|
throw SysError(format("acquiring/releasing lock"));
|
||||||
if (progressInterval) printMsg(lvlError, "still waiting for lock...");
|
|
||||||
}
|
}
|
||||||
alarm(0);
|
|
||||||
} else {
|
} else {
|
||||||
while (fcntl(fd, F_SETLK, &lock) != 0) {
|
while (fcntl(fd, F_SETLK, &lock) != 0) {
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
|
|
|
@ -17,8 +17,7 @@ void deleteLockFile(const Path & path, int fd);
|
||||||
|
|
||||||
enum LockType { ltRead, ltWrite, ltNone };
|
enum LockType { ltRead, ltWrite, ltNone };
|
||||||
|
|
||||||
bool lockFile(int fd, LockType lockType, bool wait,
|
bool lockFile(int fd, LockType lockType, bool wait);
|
||||||
unsigned int progressInterval = 300);
|
|
||||||
|
|
||||||
|
|
||||||
class PathLocks
|
class PathLocks
|
||||||
|
|
Loading…
Reference in a new issue