From a3e5c99d66e111455c6ddc40759005718016c8dd Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 19 Nov 2014 17:09:27 +0100 Subject: [PATCH] nix-daemon: Call exit(), not _exit() This was preventing destructors from running. In particular, it was preventing the deletion of the temproot file for each worker process. It may also have been responsible for the excessive WAL growth on Hydra (due to the SQLite database not being closed properly). Apparently broken by accident in 8e9140cfdef9dbd1eb61e4c75c91d452ab5e4a74. --- src/libutil/util.cc | 7 +++++-- src/libutil/util.hh | 2 +- src/nix-daemon/nix-daemon.cc | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 99d2b1e0a..305e470eb 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -864,7 +864,7 @@ void killUser(uid_t uid) pid_t startProcess(std::function fun, - bool dieWithParent, const string & errorPrefix) + bool dieWithParent, const string & errorPrefix, bool runExitHandlers) { pid_t pid = fork(); if (pid == -1) throw SysError("unable to fork"); @@ -883,7 +883,10 @@ pid_t startProcess(std::function fun, std::cerr << errorPrefix << e.what() << "\n"; } catch (...) { } } catch (...) { } - _exit(1); + if (runExitHandlers) + exit(1); + else + _exit(1); } return pid; diff --git a/src/libutil/util.hh b/src/libutil/util.hh index b35e02dce..628b8a0e1 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -270,7 +270,7 @@ void killUser(uid_t uid); /* Fork a process that runs the given function, and return the child pid to the caller. */ pid_t startProcess(std::function fun, bool dieWithParent = true, - const string & errorPrefix = "error: "); + const string & errorPrefix = "error: ", bool runExitHandlers = false); /* Run a program and return its stdout in a string (i.e., like the diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc index d973e579f..3864ab935 100644 --- a/src/nix-daemon/nix-daemon.cc +++ b/src/nix-daemon/nix-daemon.cc @@ -820,8 +820,8 @@ static void daemonLoop(char * * argv) to.fd = remote; processConnection(trusted); - _exit(0); - }, false, "unexpected Nix daemon error: "); + exit(0); + }, false, "unexpected Nix daemon error: ", true); } catch (Interrupted & e) { throw;