diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-10-14T15·55+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-10-14T15·55+0000 |
commit | 64fd29855a8ae49cacdaff424679821b4fd3bf57 (patch) | |
tree | bf99b1034e1bfe9a4c152bf8b361cb7e5c2ccd35 /src/libstore/gc.cc | |
parent | bfa6ee7d919b84a105f6376116e82240e44b990d (diff) |
* Wrap deleteFromStore() in a transaction. Otherwise there might be a
race with other processes that add new referrers to a path, resulting in the garbage collector crashing with "foreign key constraint failed". (Nix/4) * Make --gc --print-dead etc. interruptible.
Diffstat (limited to 'src/libstore/gc.cc')
-rw-r--r-- | src/libstore/gc.cc | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 7d58cd50afae..b8395bfc4352 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -421,7 +421,7 @@ struct LocalStore::GCState }; -static bool doDelete(GCOptions::GCAction action) +static bool shouldDelete(GCOptions::GCAction action) { return action == GCOptions::gcDeleteDead || action == GCOptions::gcDeleteSpecific; @@ -438,6 +438,8 @@ bool LocalStore::isActiveTempFile(const GCState & state, bool LocalStore::tryToDelete(GCState & state, const Path & path) { + checkInterrupt(); + if (!pathExists(path)) return true; if (state.deleted.find(path) != state.deleted.end()) return true; if (state.live.find(path) != state.live.end()) return false; @@ -516,7 +518,7 @@ bool LocalStore::tryToDelete(GCState & state, const Path & path) } /* The path is garbage, so delete it. */ - if (doDelete(state.options.action)) { + if (shouldDelete(state.options.action)) { printMsg(lvlInfo, format("deleting `%1%'") % path); unsigned long long bytesFreed, blocksFreed; @@ -625,7 +627,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) vector<Path> entries_(entries.begin(), entries.end()); random_shuffle(entries_.begin(), entries_.end()); - if (doDelete(state.options.action)) + if (shouldDelete(state.options.action)) printMsg(lvlError, format("deleting garbage...")); else printMsg(lvlError, format("determining live/dead paths...")); |