Factor out GC path deletion so it can be overridden.

This commit is contained in:
Ben Radford 2023-05-24 11:24:07 +01:00 committed by Ben Radford
parent b852bdb3f8
commit 98edbb9686
2 changed files with 16 additions and 2 deletions

View file

@ -97,6 +97,13 @@ struct GcStore : public virtual Store
* Perform a garbage collection. * Perform a garbage collection.
*/ */
virtual void collectGarbage(const GCOptions & options, GCResults & results) = 0; virtual void collectGarbage(const GCOptions & options, GCResults & results) = 0;
/**
* Called by `collectGarbage` to recursively delete a path.
* The default implementation simply calls `deletePath`, but it can be
* overridden by stores that wish to provide their own deletion behaviour.
*/
virtual void deleteGCPath(const Path & path, uint64_t & bytesFreed);
}; };
} }

View file

@ -654,7 +654,8 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
results.paths.insert(path); results.paths.insert(path);
uint64_t bytesFreed; uint64_t bytesFreed;
deletePath(realPath, bytesFreed); deleteGCPath(realPath, bytesFreed);
results.bytesFreed += bytesFreed; results.bytesFreed += bytesFreed;
if (results.bytesFreed > options.maxFreed) { if (results.bytesFreed > options.maxFreed) {
@ -872,7 +873,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
if (unlink(path.c_str()) == -1) if (unlink(path.c_str()) == -1)
throw SysError("deleting '%1%'", path); throw SysError("deleting '%1%'", path);
/* Do not accound for deleted file here. Rely on deletePath() /* Do not account for deleted file here. Rely on deletePath()
accounting. */ accounting. */
} }
@ -890,6 +891,12 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
} }
void GcStore::deleteGCPath(const Path & path, uint64_t & bytesFreed)
{
deletePath(path, bytesFreed);
}
void LocalStore::autoGC(bool sync) void LocalStore::autoGC(bool sync)
{ {
static auto fakeFreeSpaceFile = getEnv("_NIX_TEST_FREE_SPACE_FILE"); static auto fakeFreeSpaceFile = getEnv("_NIX_TEST_FREE_SPACE_FILE");