mirror of
https://github.com/NixOS/nix
synced 2025-06-29 10:31:15 +02:00
* Garbage collector: option `--max-freed' to stop after at least N
bytes have been freed, `--max-links' to stop when the Nix store directory has fewer than N hard links (the latter being important for very large Nix stores on filesystems with a 32000 subdirectories limit).
This commit is contained in:
parent
a8f3b02092
commit
d3aa183beb
6 changed files with 47 additions and 12 deletions
|
@ -439,6 +439,9 @@ Paths topoSortPaths(const PathSet & paths)
|
|||
}
|
||||
|
||||
|
||||
struct GCLimitReached { };
|
||||
|
||||
|
||||
void LocalStore::tryToDelete(const GCOptions & options, GCResults & results,
|
||||
const PathSet & livePaths, const PathSet & tempRootsClosed, PathSet & done,
|
||||
const Path & path)
|
||||
|
@ -512,6 +515,21 @@ void LocalStore::tryToDelete(const GCOptions & options, GCResults & results,
|
|||
results.bytesFreed += bytesFreed;
|
||||
results.blocksFreed += blocksFreed;
|
||||
|
||||
if (results.bytesFreed > options.maxFreed) {
|
||||
printMsg(lvlInfo, format("deleted more than %1% bytes; stopping") % options.maxFreed);
|
||||
throw GCLimitReached();
|
||||
}
|
||||
|
||||
if (options.maxLinks) {
|
||||
struct stat st;
|
||||
if (stat(nixStore.c_str(), &st) == -1)
|
||||
throw SysError(format("statting `%1%'") % nixStore);
|
||||
if (st.st_nlink < options.maxLinks) {
|
||||
printMsg(lvlInfo, format("link count on the store has dropped below %1%; stopping") % options.maxLinks);
|
||||
throw GCLimitReached();
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef __CYGWIN__
|
||||
if (fdLock != -1)
|
||||
/* Write token to stale (deleted) lock file. */
|
||||
|
@ -650,8 +668,11 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
|
|||
: format("deleting garbage..."));
|
||||
|
||||
PathSet done;
|
||||
foreach (PathSet::iterator, i, storePaths)
|
||||
tryToDelete(options, results, livePaths, tempRootsClosed, done, *i);
|
||||
try {
|
||||
foreach (PathSet::iterator, i, storePaths)
|
||||
tryToDelete(options, results, livePaths, tempRootsClosed, done, *i);
|
||||
} catch (GCLimitReached & e) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue