aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/indirect-root-store.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/indirect-root-store.hh')
-rw-r--r--src/libstore/indirect-root-store.hh48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/libstore/indirect-root-store.hh b/src/libstore/indirect-root-store.hh
new file mode 100644
index 000000000..59e45af45
--- /dev/null
+++ b/src/libstore/indirect-root-store.hh
@@ -0,0 +1,48 @@
+#pragma once
+///@file
+
+#include "local-fs-store.hh"
+
+namespace nix {
+
+/**
+ * Mix-in class for implementing permanent roots as a pair of a direct
+ * (strong) reference and indirect weak reference to the first
+ * reference.
+ *
+ * See methods for details on the operations it represents.
+ */
+struct IndirectRootStore : public virtual LocalFSStore
+{
+ inline static std::string operationName = "Indirect GC roots registration";
+
+ /**
+ * Implementation of `LocalFSStore::addPermRoot` where the permanent
+ * root is a pair of
+ *
+ * - The user-facing symlink which all implementations must create
+ *
+ * - An additional weak reference known as the "indirect root" that
+ * points to that symlink.
+ *
+ * The garbage collector will automatically remove the indirect root
+ * when it finds that the symlink has disappeared.
+ *
+ * The implementation of this method is concrete, but it delegates
+ * to `addIndirectRoot()` which is abstract.
+ */
+ Path addPermRoot(const StorePath & storePath, const Path & gcRoot) override final;
+
+ /**
+ * Add an indirect root, which is a weak reference to the
+ * user-facing symlink created by `addPermRoot()`.
+ *
+ * @param path user-facing and user-controlled symlink to a store
+ * path.
+ *
+ * The form this weak-reference takes is implementation-specific.
+ */
+ virtual void addIndirectRoot(const Path & path) = 0;
+};
+
+}