diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-02-03T21·38+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-02-03T21·38+0000 |
commit | 4e17be7981026f0317fb12f166282be2d972889e (patch) | |
tree | eb24809ed97bee6275aaa16a1b65764d411071cf /src/libstore | |
parent | f859a8d3c33cc275f41d983bfeff2a21a9f88f1b (diff) |
* 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.
Diffstat (limited to 'src/libstore')
-rw-r--r-- | src/libstore/build.cc | 28 | ||||
-rw-r--r-- | src/libstore/pathlocks.cc | 14 | ||||
-rw-r--r-- | src/libstore/pathlocks.hh | 3 |
3 files changed, 21 insertions, 24 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 77cffba25d8a..f4478a4db2f0 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -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, diff --git a/src/libstore/pathlocks.cc b/src/libstore/pathlocks.cc index fe872ceede87..d8290815c44c 100644 --- a/src/libstore/pathlocks.cc +++ b/src/libstore/pathlocks.cc @@ -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(); diff --git a/src/libstore/pathlocks.hh b/src/libstore/pathlocks.hh index 8c6ac6a03f50..57ca1584a6d6 100644 --- a/src/libstore/pathlocks.hh +++ b/src/libstore/pathlocks.hh @@ -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 |