diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-01-27T15·21+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-01-27T15·21+0000 |
commit | c505702265833a762d681952bcc72562d64a242e (patch) | |
tree | da6f095532755b766d7752d6925ea865ba0cefe2 /src/libstore/gc.cc | |
parent | 59682e618805701f9c249736514df6db457895f9 (diff) |
* Fix and simplify the garbage collector (it's still not concurrent,
though). In particular it's now much easier to register a GC root. Just place a symlink to whatever store path it is that you want to keep in /nix/var/nix/gcroots.
Diffstat (limited to 'src/libstore/gc.cc')
-rw-r--r-- | src/libstore/gc.cc | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 4f3306505440..ba6e6bb9d4bb 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -1,12 +1,68 @@ #include "globals.hh" #include "gc.hh" - +#include "build.hh" #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> +void collectGarbage(const PathSet & roots, GCAction action, + PathSet & result) +{ + result.clear(); + + /* !!! TODO: Acquire an exclusive lock on the gcroots directory. + This prevents the set of live paths from increasing after this + point. */ + + /* Determine the live paths which is just the closure of the + roots under the `references' relation. */ + PathSet livePaths; + for (PathSet::const_iterator i = roots.begin(); i != roots.end(); ++i) + computeFSClosure(canonPath(*i), livePaths); + + if (action == gcReturnLive) { + result = livePaths; + return; + } + + /* !!! TODO: Try to acquire (without blocking) exclusive locks on + the files in the `pending' directory. Delete all files for + which we managed to acquire such a lock (since if we could get + such a lock, that means that the process that owned the file + has died). */ + + /* !!! TODO: Acquire shared locks on all files in the pending + directories. This prevents the set of pending paths from + increasing while we are garbage-collecting. Read the set of + pending paths from those files. */ + + /* Read the Nix store directory to find all currently existing + paths. */ + Strings storeNames = readDirectory(nixStore); + + for (Strings::iterator i = storeNames.begin(); i != storeNames.end(); ++i) { + Path path = canonPath(nixStore + "/" + *i); + + if (livePaths.find(path) != livePaths.end()) { + debug(format("live path `%1%'") % path); + continue; + } + + debug(format("dead path `%1%'") % path); + result.insert(path); + + if (action == gcDeleteDead) { + printMsg(lvlInfo, format("deleting `%1%'") % path); + deleteFromStore(path); + } + + } +} + + + #if 0 void followLivePaths(Path nePath, PathSet & live) { |