* 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:
Eelco Dolstra 2010-02-03 21:38:41 +00:00
parent f859a8d3c3
commit 4e17be7981
4 changed files with 21 additions and 37 deletions

View file

@ -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;

View file

@ -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,

View file

@ -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();

View file

@ -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