mirror of
https://github.com/NixOS/nix.git
synced 2025-11-28 13:11:00 +01:00
daemon: fix hang on SSH disconnect during remote builds
When an SSH connection dies during a remote build, MonitorFdHup correctly detects the disconnect and calls triggerInterrupt(). However, without ReceiveInterrupts instantiated, no SIGUSR1 is sent to interrupt the blocking read() syscall. This causes the daemon to hang indefinitely while holding file locks, blocking subsequent builds. The fix instantiates ReceiveInterrupts in processConnection(), which registers a callback to send SIGUSR1 to the current thread when triggerInterrupt() is called. This allows the blocking read() to return with EINTR, causing checkInterrupt() to throw and the daemon to exit cleanly. This pattern is already used in ThreadPool::doWork() and SubstitutionGoal for the same purpose.
This commit is contained in:
parent
091c0a97e1
commit
98c7ca2c9f
1 changed files with 1 additions and 0 deletions
|
|
@ -1025,6 +1025,7 @@ void processConnection(ref<Store> store, FdSource && from, FdSink && to, Trusted
|
|||
#ifndef _WIN32 // TODO need graceful async exit support on Windows?
|
||||
auto monitor = !recursive ? std::make_unique<MonitorFdHup>(from.fd) : nullptr;
|
||||
(void) monitor; // suppress warning
|
||||
ReceiveInterrupts receiveInterrupts;
|
||||
#endif
|
||||
|
||||
/* Exchange the greeting. */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue