aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/local-store.hh
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2021-08-16 20:03:32 +0200
committerEelco Dolstra <edolstra@gmail.com>2021-10-13 12:12:44 +0200
commit8614cf13344eca75074cd4af20fd90238571b0b6 (patch)
tree367c7d7a0d3a5bf7a38f6d18a0bc56e15ec0b057 /src/libstore/local-store.hh
parent9947f1646a26b339fff2e02b77798e9841fac7f0 (diff)
Non-blocking garbage collector
The garbage collector no longer blocks other processes from adding/building store paths or adding GC roots. To prevent the collector from deleting store paths just added by another process, processes need to connect to the garbage collector via a Unix domain socket to register new temporary roots.
Diffstat (limited to 'src/libstore/local-store.hh')
-rw-r--r--src/libstore/local-store.hh28
1 files changed, 12 insertions, 16 deletions
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index 3b3f26162..85c6c4495 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -58,9 +58,15 @@ private:
struct Stmts;
std::unique_ptr<Stmts> stmts;
+ /* The global GC lock */
+ AutoCloseFD fdGCLock;
+
/* The file to which we write our temporary roots. */
AutoCloseFD fdTempRoots;
+ /* Connection to the garbage collector. */
+ AutoCloseFD fdRootsSocket;
+
/* The last time we checked whether to do an auto-GC, or an
auto-GC finished. */
std::chrono::time_point<std::chrono::steady_clock> lastGCCheck;
@@ -150,10 +156,7 @@ public:
private:
- typedef std::shared_ptr<AutoCloseFD> FDPtr;
- typedef list<FDPtr> FDs;
-
- void findTempRoots(FDs & fds, Roots & roots, bool censor);
+ void findTempRoots(Roots & roots, bool censor);
public:
@@ -235,18 +238,11 @@ private:
struct GCState;
- void deleteGarbage(GCState & state, const Path & path);
-
- void tryToDelete(GCState & state, const Path & path);
-
- bool canReachRoot(GCState & state, StorePathSet & visited, const StorePath & path);
-
- void deletePathRecursive(GCState & state, const Path & path);
-
- bool isActiveTempFile(const GCState & state,
- const Path & path, const string & suffix);
-
- AutoCloseFD openGCLock(LockType lockType);
+ bool tryToDelete(
+ GCState & state,
+ StorePathSet & visited,
+ const Path & path,
+ bool recursive);
void findRoots(const Path & path, unsigned char type, Roots & roots);