1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-28 17:51:15 +02:00

* While waiting for a lock, print a sign of life every 5 minutes.

This prevents remote builders from being killed by the
  `max-silent-time' inactivity monitor while they are waiting for a
  long garbage collection to finish.  This happens fairly often in the
  Hydra build farm.
This commit is contained in:
Eelco Dolstra 2010-02-03 21:22:57 +00:00
parent c45de33c67
commit f859a8d3c3
3 changed files with 27 additions and 3 deletions

View file

@ -37,7 +37,8 @@ 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;
if (lockType == ltRead) lock.l_type = F_RDLCK;
@ -49,11 +50,20 @@ bool lockFile(int fd, LockType lockType, bool wait)
lock.l_len = 0; /* entire file */
if (wait) {
while (fcntl(fd, F_SETLKW, &lock) != 0) {
/* 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;
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();