aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/local-store.hh
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2023-01-03 15:15:14 +0100
committerEelco Dolstra <edolstra@gmail.com>2023-01-03 15:20:21 +0100
commit28d5b5cd453d89642557455d82b98903da2898b7 (patch)
treed3b3ed78a3678e432ea555c5f48a2595a7489022 /src/libstore/local-store.hh
parent224b56f10e1bb754d403c106eb9d1b947fc30414 (diff)
Fix deadlock between auto-GC and addTempRoot()
Previously addTempRoot() acquired the LocalStore state lock and waited for the garbage collector to reply. If the garbage collector is in the same process (as it the case with auto-GC), this would deadlock as soon as the garbage collector thread needs the LocalStore state lock. So now addTempRoot() uses separate Syncs for the state that it needs. As long at the auto-GC thread doesn't call addTempRoot() (which it shouldn't), it shouldn't deadlock. Fixes #3224.
Diffstat (limited to 'src/libstore/local-store.hh')
-rw-r--r--src/libstore/local-store.hh12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index 9ea0c0bf7..06d36a7d5 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -59,12 +59,6 @@ private:
struct Stmts;
std::unique_ptr<Stmts> stmts;
- /* The global GC lock */
- AutoCloseFD fdGCLock;
-
- /* 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;
@@ -160,6 +154,12 @@ private:
/* The file to which we write our temporary roots. */
Sync<AutoCloseFD> _fdTempRoots;
+ /* The global GC lock. */
+ Sync<AutoCloseFD> _fdGCLock;
+
+ /* Connection to the garbage collector. */
+ Sync<AutoCloseFD> _fdRootsSocket;
+
public:
void addIndirectRoot(const Path & path) override;