diff --git a/doc/manual/command-ref/conf-file.xml b/doc/manual/command-ref/conf-file.xml
index 6638bf61e..431c0e6d3 100644
--- a/doc/manual/command-ref/conf-file.xml
+++ b/doc/manual/command-ref/conf-file.xml
@@ -456,6 +456,36 @@ builtins.fetchurl {
+ narinfo-cache-negative-ttl
+
+
+
+ The TTL in seconds for negative lookups. If a store path is
+ queried from a substituter but was not found, there will be a
+ negative lookup cached in the local disk cache database for the
+ specified duration.
+
+
+
+
+
+ narinfo-cache-positive-ttl
+
+
+
+ The TTL in seconds for positive lookups. If a store path is
+ queried from a substituter, the result of the query will be cached
+ in the local disk cache database including some of the NAR
+ metadata. The default TTL is a month, setting a shorter TTL for
+ positive lookups can be useful for binary caches that have
+ frequent garbage collection, in which case having a more frequent
+ cache invalidation would prevent trying to pull the path again and
+ failing with a hash mismatch if the build isn't reproducible.
+
+
+
+
+
netrc-file
@@ -511,7 +541,6 @@ password my-password
-
pre-build-hook
@@ -788,7 +817,6 @@ password my-password
-
diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh
index 117404ec1..7430bbedb 100644
--- a/src/libstore/globals.hh
+++ b/src/libstore/globals.hh
@@ -313,6 +313,14 @@ public:
Setting trustedUsers{this, {"root"}, "trusted-users",
"Which users or groups are trusted to ask the daemon to do unsafe things."};
+ Setting ttlNegativeNarInfoCache{this, 3600, "narinfo-cache-negative-ttl",
+ "The TTL in seconds for negative lookups in the disk cache i.e binary cache lookups that "
+ "return an invalid path result"};
+
+ Setting ttlPositiveNarInfoCache{this, 30 * 24 * 3600, "narinfo-cache-positive-ttl",
+ "The TTL in seconds for positive lookups in the disk cache i.e binary cache lookups that "
+ "return a valid path result."};
+
/* ?Who we trust to use the daemon in safe ways */
Setting allowedUsers{this, {"*"}, "allowed-users",
"Which users or groups are allowed to connect to the daemon."};
diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc
index 3c52303f0..35403e5df 100644
--- a/src/libstore/nar-info-disk-cache.cc
+++ b/src/libstore/nar-info-disk-cache.cc
@@ -1,6 +1,7 @@
#include "nar-info-disk-cache.hh"
#include "sync.hh"
#include "sqlite.hh"
+#include "globals.hh"
#include
@@ -47,10 +48,6 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache
{
public:
- /* How long negative and positive lookups are valid. */
- const int ttlNegative = 3600;
- const int ttlPositive = 30 * 24 * 3600;
-
/* How often to purge expired entries from the cache. */
const int purgeInterval = 24 * 3600;
@@ -116,8 +113,8 @@ public:
SQLiteStmt(state->db,
"delete from NARs where ((present = 0 and timestamp < ?) or (present = 1 and timestamp < ?))")
.use()
- (now - ttlNegative)
- (now - ttlPositive)
+ (now - settings.ttlNegativeNarInfoCache)
+ (now - settings.ttlPositiveNarInfoCache)
.exec();
debug("deleted %d entries from the NAR info disk cache", sqlite3_changes(state->db));
@@ -186,8 +183,8 @@ public:
auto queryNAR(state->queryNAR.use()
(cache.id)
(hashPart)
- (now - ttlNegative)
- (now - ttlPositive));
+ (now - settings.ttlNegativeNarInfoCache)
+ (now - settings.ttlPositiveNarInfoCache));
if (!queryNAR.next())
return {oUnknown, 0};