NarInfoDiskCache: Prepare reproducer for #3898

This commit is contained in:
Robert Hensing 2023-01-30 22:15:23 +01:00
parent 79f62d2dda
commit 2ceece3ef3
3 changed files with 96 additions and 0 deletions

View file

@ -207,6 +207,7 @@ public:
if (!cache)
return std::nullopt;
return CacheInfo {
.id = cache->id,
.wantMassQuery = cache->wantMassQuery,
.priority = cache->priority
};
@ -370,4 +371,9 @@ ref<NarInfoDiskCache> getNarInfoDiskCache()
return cache;
}
ref<NarInfoDiskCache> getTestNarInfoDiskCache(Path dbPath)
{
return make_ref<NarInfoDiskCacheImpl>(dbPath);
}
}

View file

@ -18,6 +18,7 @@ public:
struct CacheInfo
{
int id;
bool wantMassQuery;
int priority;
};
@ -45,4 +46,6 @@ public:
multiple threads. */
ref<NarInfoDiskCache> getNarInfoDiskCache();
ref<NarInfoDiskCache> getTestNarInfoDiskCache(Path dbPath);
}

View file

@ -0,0 +1,87 @@
#include "nar-info-disk-cache.hh"
#include <gtest/gtest.h>
#include <rapidcheck/gtest.h>
#include "sqlite.hh"
#include <sqlite3.h>
namespace nix {
RC_GTEST_PROP(
NarInfoDiskCacheImpl,
create_and_read,
(int prio, bool wantMassQuery)
)
{
Path tmpDir = createTempDir();
AutoDelete delTmpDir(tmpDir);
Path dbPath(tmpDir + "/test-narinfo-disk-cache.sqlite");
auto cache = getTestNarInfoDiskCache(dbPath);
cache->createCache("other://uri", "/nix/storedir", wantMassQuery, prio);
cache->createCache("other://uri-2", "/nix/storedir", wantMassQuery, prio);
cache->createCache("the://uri", "/nix/storedir", wantMassQuery, prio);
{
auto r = cache->upToDateCacheExists("the://uri");
ASSERT_TRUE(r);
ASSERT_EQ(r->priority, prio);
ASSERT_EQ(r->wantMassQuery, wantMassQuery);
}
SQLite db(dbPath);
SQLiteStmt getIds;
getIds.create(db, "SELECT id FROM BinaryCaches WHERE url = 'the://uri'");
int savedId;
{
auto q(getIds.use());
ASSERT_TRUE(q.next());
savedId = q.getInt(0);
ASSERT_FALSE(q.next());
}
db.exec("UPDATE BinaryCaches SET timestamp = timestamp - 1 - 7 * 24 * 3600;");
// Relies on memory cache
{
auto r = cache->upToDateCacheExists("the://uri");
ASSERT_TRUE(r);
ASSERT_EQ(r->priority, prio);
ASSERT_EQ(r->wantMassQuery, wantMassQuery);
}
auto cache2 = getTestNarInfoDiskCache(dbPath);
{
auto r = cache2->upToDateCacheExists("the://uri");
ASSERT_FALSE(r);
}
cache2->createCache("the://uri", "/nix/storedir", wantMassQuery, prio);
{
auto r = cache->upToDateCacheExists("the://uri");
ASSERT_TRUE(r);
ASSERT_EQ(r->priority, prio);
ASSERT_EQ(r->wantMassQuery, wantMassQuery);
// FIXME, reproduces #3898
// ASSERT_EQ(r->id, savedId);
(void) savedId;
}
{
auto q(getIds.use());
ASSERT_TRUE(q.next());
auto currentId = q.getInt(0);
ASSERT_FALSE(q.next());
// FIXME, reproduces #3898
// ASSERT_EQ(currentId, savedId);
(void) currentId;
}
}
}