Add automatic garbage collection

Nix can now automatically run the garbage collector during builds or
while adding paths to the store. The option "min-free = <bytes>"
specifies that Nix should run the garbage collector whenever free
space in the Nix store drops below <bytes>. It will then delete
garbage until "max-free" bytes are available.

Garbage collection during builds is asynchronous; running builds are
not paused and new builds are not blocked. However, there also is a
synchronous GC run prior to the first build/substitution.

Currently, no old GC roots are deleted (as in "nix-collect-garbage
-d").
This commit is contained in:
Eelco Dolstra 2017-09-05 20:43:42 +02:00
parent b932ea58ec
commit 0b606aad46
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
6 changed files with 127 additions and 1 deletions

View file

@ -244,6 +244,18 @@ LocalStore::LocalStore(const Params & params)
LocalStore::~LocalStore()
{
std::shared_future<void> future;
{
auto state(_state.lock());
if (state->gcRunning)
future = state->gcFuture;
}
if (future.valid()) {
printError("waiting for auto-GC to finish on exit...");
future.get();
}
try {
auto state(_state.lock());
@ -991,6 +1003,8 @@ void LocalStore::addToStore(const ValidPathInfo & info, const ref<std::string> &
StringSource source(*nar);
restorePath(realPath, source);
autoGC();
canonicalisePathMetaData(realPath, -1);
optimisePath(realPath); // FIXME: combine with hashPath()
@ -1025,6 +1039,8 @@ Path LocalStore::addToStoreFromDump(const string & dump, const string & name,
deletePath(realPath);
autoGC();
if (recursive) {
StringSource source(dump);
restorePath(realPath, source);
@ -1097,6 +1113,8 @@ Path LocalStore::addTextToStore(const string & name, const string & s,
deletePath(realPath);
autoGC();
writeFile(realPath, s);
canonicalisePathMetaData(realPath, -1);