nix-store --serve: Only monitor stdin during builds

Other operations cannot hang indefinitely (except when we're reading
from stdin, in which case we'll notice a client disconnect). But
monitoring works badly during compressed imports, since there the
client can close the connection before we've sent an ack.

http://hydra.nixos.org/build/12711638
This commit is contained in:
Eelco Dolstra 2014-07-24 11:52:52 +02:00
parent a6ab3cf35f
commit d7a92ed4a9

View file

@ -880,8 +880,6 @@ static void opServe(Strings opFlags, Strings opArgs)
FdSource in(STDIN_FILENO); FdSource in(STDIN_FILENO);
FdSink out(STDOUT_FILENO); FdSink out(STDOUT_FILENO);
MonitorFdHup monitor(in.fd);
/* Exchange the greeting. */ /* Exchange the greeting. */
unsigned int magic = readInt(in); unsigned int magic = readInt(in);
if (magic != SERVE_MAGIC_1) throw Error("protocol mismatch"); if (magic != SERVE_MAGIC_1) throw Error("protocol mismatch");
@ -1002,6 +1000,7 @@ static void opServe(Strings opFlags, Strings opArgs)
} }
case cmdBuildPaths: { case cmdBuildPaths: {
/* Used by build-remote.pl. */ /* Used by build-remote.pl. */
if (!writeAllowed) throw Error("building paths is not allowed"); if (!writeAllowed) throw Error("building paths is not allowed");
PathSet paths = readStorePaths<PathSet>(in); PathSet paths = readStorePaths<PathSet>(in);
@ -1016,6 +1015,7 @@ static void opServe(Strings opFlags, Strings opArgs)
int res = 0; int res = 0;
try { try {
MonitorFdHup monitor(in.fd);
store->buildPaths(paths); store->buildPaths(paths);
} catch (Error & e) { } catch (Error & e) {
printMsg(lvlError, format("error: %1%") % e.msg()); printMsg(lvlError, format("error: %1%") % e.msg());