aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/gc.cc19
-rw-r--r--src/libstore/gc.hh6
2 files changed, 21 insertions, 4 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index e2e6c23fd..53ee100f9 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -4,6 +4,7 @@
#include "local-store.hh"
#include "db.hh"
#include "util.hh"
+#include "gc.hh"
#include <boost/shared_ptr.hpp>
@@ -445,6 +446,8 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete,
queryBoolSetting("gc-keep-outputs", false);
bool gcKeepDerivations =
queryBoolSetting("gc-keep-derivations", true);
+ unsigned int gcKeepOutputsThreshold =
+ queryIntSetting ("gc-keep-outputs-threshold", defaultGcLevel);
/* Acquire the global GC root. This prevents
a) New roots from being added.
@@ -496,10 +499,18 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete,
i != livePaths.end(); ++i)
if (isDerivation(*i)) {
Derivation drv = derivationFromPath(*i);
- for (DerivationOutputs::iterator j = drv.outputs.begin();
- j != drv.outputs.end(); ++j)
- if (store->isValidPath(j->second.path))
- computeFSClosure(j->second.path, livePaths);
+
+ string gcLevelStr = drv.env["__gcLevel"];
+ int gcLevel;
+ if (!string2Int(gcLevelStr,gcLevel)) {
+ gcLevel = defaultGcLevel;
+ }
+
+ if (gcLevel >= gcKeepOutputsThreshold)
+ for (DerivationOutputs::iterator j = drv.outputs.begin();
+ j != drv.outputs.end(); ++j)
+ if (store->isValidPath(j->second.path))
+ computeFSClosure(j->second.path, livePaths);
}
}
diff --git a/src/libstore/gc.hh b/src/libstore/gc.hh
new file mode 100644
index 000000000..c86f7678b
--- /dev/null
+++ b/src/libstore/gc.hh
@@ -0,0 +1,6 @@
+#ifndef __GC_H_INCLUDED
+#define __GC_H_INCLUDED
+
+const unsigned int defaultGcLevel = 1000;
+
+#endif //__GC_H_INCLUDED