diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-02-03T21·22+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-02-03T21·22+0000 |
commit | f859a8d3c33cc275f41d983bfeff2a21a9f88f1b (patch) | |
tree | 8f242f4fc9d094a93b416f03b829d0f58af37bf0 /src/libstore/pathlocks.cc | |
parent | c45de33c67a7273fc87a654696d15010df0f5c6d (diff) |
* 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.
Diffstat (limited to 'src/libstore/pathlocks.cc')
-rw-r--r-- | src/libstore/pathlocks.cc | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/libstore/pathlocks.cc b/src/libstore/pathlocks.cc index d8290815c44c..fe872ceede87 100644 --- a/src/libstore/pathlocks.cc +++ b/src/libstore/pathlocks.cc @@ -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(); |