From 1277aab219c83beae856024eea6e868677f7523b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 6 Sep 2017 11:37:58 +0200 Subject: [PATCH] Fix abort when the GC thread gets an exception --- src/libstore/gc.cc | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index cf95f7f45..45f28c328 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -887,24 +887,32 @@ void LocalStore::autoGC(bool sync) std::thread([promise{std::move(promise)}, this, avail, getAvail]() mutable { - /* Wake up any threads waiting for the auto-GC to finish. */ - Finally wakeup([&]() { - auto state(_state.lock()); - state->gcRunning = false; - state->lastGCCheck = std::chrono::steady_clock::now(); - promise.set_value(); - }); + try { - printInfo("running auto-GC to free %d bytes", settings.maxFree - avail); + /* Wake up any threads waiting for the auto-GC to finish. */ + Finally wakeup([&]() { + auto state(_state.lock()); + state->gcRunning = false; + state->lastGCCheck = std::chrono::steady_clock::now(); + promise.set_value(); + }); - GCOptions options; - options.maxFreed = settings.maxFree - avail; + printInfo("running auto-GC to free %d bytes", settings.maxFree - avail); - GCResults results; + GCOptions options; + options.maxFreed = settings.maxFree - avail; - collectGarbage(options, results); + GCResults results; - _state.lock()->availAfterGC = getAvail(); + collectGarbage(options, results); + + _state.lock()->availAfterGC = getAvail(); + + } catch (...) { + // FIXME: we could propagate the exception to the + // future, but we don't really care. + ignoreException(); + } }).detach(); }