* 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)
{
counter++;
@ -165,14 +160,6 @@ static void initAndRun(int argc, char * * argv)
if (sigaction(SIGPIPE, &act, 0))
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. */
act.sa_handler = SIG_DFL;
act.sa_flags = 0;

View File

@ -162,6 +162,7 @@ struct Child
{
WeakGoalPtr goal;
set<int> fds;
bool monitorForSilence;
bool inBuildSlot;
time_t lastOutput; /* time we last got output on stdout/stderr */
};
@ -234,7 +235,7 @@ public:
/* Registers a running child process. `inBuildSlot' means that
the process counts towards the jobs limit. */
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
false if there is no sense in waking up goals that are sleeping
@ -1262,7 +1263,7 @@ DerivationGoal::HookReply DerivationGoal::tryBuildHook()
pid.setKillSignal(SIGTERM);
logPipe.writeSide.close();
worker.childStarted(shared_from_this(),
pid, singleton<set<int> >(logPipe.readSide), false);
pid, singleton<set<int> >(logPipe.readSide), false, false);
toHook.readSide.close();
@ -1767,7 +1768,7 @@ void DerivationGoal::startBuilder()
pid.setSeparatePG(true);
logPipe.writeSide.close();
worker.childStarted(shared_from_this(), pid,
singleton<set<int> >(logPipe.readSide), true);
singleton<set<int> >(logPipe.readSide), true, true);
if (printBuildTrace) {
printMsg(lvlError, format("@ build-started %1% %2% %3% %4%")
@ -2274,7 +2275,7 @@ void SubstitutionGoal::tryToRun()
pid.setKillSignal(SIGTERM);
logPipe.writeSide.close();
worker.childStarted(shared_from_this(),
pid, singleton<set<int> >(logPipe.readSide), true);
pid, singleton<set<int> >(logPipe.readSide), true, true);
state = &SubstitutionGoal::finished;
@ -2474,13 +2475,15 @@ unsigned Worker::getNrLocalBuilds()
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.goal = goal;
child.fds = fds;
child.lastOutput = time(0);
child.inBuildSlot = inBuildSlot;
child.monitorForSilence = monitorForSilence;
children[pid] = child;
if (inBuildSlot) nrLocalBuilds++;
}
@ -2601,12 +2604,16 @@ void Worker::waitForInput()
if (maxSilentTime != 0) {
time_t oldest = 0;
foreach (Children::iterator, i, children) {
oldest = oldest == 0 || i->second.lastOutput < oldest
? i->second.lastOutput : oldest;
if (i->second.monitorForSilence) {
oldest = oldest == 0 || i->second.lastOutput < oldest
? i->second.lastOutput : oldest;
}
}
if (oldest) {
useTimeout = true;
timeout.tv_sec = std::max((time_t) 0, oldest + maxSilentTime - before);
printMsg(lvlVomit, format("sleeping %1% seconds") % timeout.tv_sec);
}
useTimeout = true;
timeout.tv_sec = std::max((time_t) 0, oldest + maxSilentTime - before);
printMsg(lvlVomit, format("sleeping %1% seconds") % timeout.tv_sec);
}
/* If we are polling goals that are waiting for a lock, then wake
@ -2681,6 +2688,7 @@ void Worker::waitForInput()
}
if (maxSilentTime != 0 &&
j->second.monitorForSilence &&
after - j->second.lastOutput >= (time_t) maxSilentTime)
{
printMsg(lvlError,

View File

@ -37,8 +37,7 @@ void deleteLockFile(const Path & path, int fd)
}
bool lockFile(int fd, LockType lockType, bool wait,
unsigned int progressInterval)
bool lockFile(int fd, LockType lockType, bool wait)
{
struct flock lock;
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 */
if (wait) {
/* Wait until we acquire the lock. If `progressInterval' is
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;
while (fcntl(fd, F_SETLKW, &lock) != 0) {
checkInterrupt();
if (errno != EINTR)
throw SysError(format("acquiring/releasing lock"));
if (progressInterval) printMsg(lvlError, "still waiting for lock...");
}
alarm(0);
} else {
while (fcntl(fd, F_SETLK, &lock) != 0) {
checkInterrupt();

View File

@ -17,8 +17,7 @@ void deleteLockFile(const Path & path, int fd);
enum LockType { ltRead, ltWrite, ltNone };
bool lockFile(int fd, LockType lockType, bool wait,
unsigned int progressInterval = 300);
bool lockFile(int fd, LockType lockType, bool wait);
class PathLocks