forked from lix-project/lix
Fix random client failures during GC server shutdown
We need to close the GC server socket before shutting down the active GC client connections, otherwise a client may (re)connect and get ECONNRESET. But also handle ECONNRESET for resilience. Fixes random failures like GC socket disconnected connecting to '/tmp/nix-shell.y07M0H/nix-test/default/var/nix/gc-socket/socket' sending GC root '/tmp/nix-shell.y07M0H/nix-test/default/store/kb5yzija0f1x5xkqkgclrdzldxj6nnc6-non-blocking' reading GC root from client: error: unexpected EOF reading a line 1 store paths deleted, 0.00 MiB freed error: reading from file: Connection reset by peer in gc-non-blocking.sh.
This commit is contained in:
parent
534332c8a0
commit
5b798f6cae
|
@ -147,7 +147,7 @@ void LocalStore::addTempRoot(const StorePath & path)
|
||||||
} catch (SysError & e) {
|
} catch (SysError & e) {
|
||||||
/* The garbage collector may have exited, so we need to
|
/* The garbage collector may have exited, so we need to
|
||||||
restart. */
|
restart. */
|
||||||
if (e.errNo == EPIPE) {
|
if (e.errNo == EPIPE || e.errNo == ECONNRESET) {
|
||||||
debug("GC socket disconnected");
|
debug("GC socket disconnected");
|
||||||
state->fdRootsSocket.close();
|
state->fdRootsSocket.close();
|
||||||
goto restart;
|
goto restart;
|
||||||
|
@ -506,6 +506,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
|
||||||
|
|
||||||
Finally cleanup([&]() {
|
Finally cleanup([&]() {
|
||||||
debug("GC roots server shutting down");
|
debug("GC roots server shutting down");
|
||||||
|
fdServer.close();
|
||||||
while (true) {
|
while (true) {
|
||||||
auto item = remove_begin(*connections.lock());
|
auto item = remove_begin(*connections.lock());
|
||||||
if (!item) break;
|
if (!item) break;
|
||||||
|
|
Loading…
Reference in a new issue