aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/zenstore/buildstore/buildstore.cpp79
-rw-r--r--src/zenstore/include/zenstore/buildstore/buildstore.h16
2 files changed, 94 insertions, 1 deletions
diff --git a/src/zenstore/buildstore/buildstore.cpp b/src/zenstore/buildstore/buildstore.cpp
index ad737749c..19e4ce93b 100644
--- a/src/zenstore/buildstore/buildstore.cpp
+++ b/src/zenstore/buildstore/buildstore.cpp
@@ -2798,6 +2798,85 @@ BuildStore::LockState(GcCtx& Ctx)
return Locks;
}
+#if ZEN_WITH_TESTS
+
+std::optional<AccessTime>
+BuildStore::GetBuildLastAccessTime(std::string_view Namespace, std::string_view Bucket, const Oid& BuildId) const
+{
+ const IoHash BuildHashId = buildstore::impl::MakeBuildHashId(Namespace, Bucket, BuildId);
+
+ RwLock::SharedLockScope Lock(m_Lock);
+ if (auto It = m_BuildLookup.find(BuildHashId); It != m_BuildLookup.end())
+ {
+ const BuildEntryIndex Index = It->second;
+ ZEN_ASSERT_SLOW(Index.Index < m_BuildEntries.size());
+ const BuildEntry& Entry = m_BuildEntries[Index];
+ return Entry.LastAccessTime;
+ }
+ return {};
+}
+
+std::optional<AccessTime>
+BuildStore::GetBuildPartLastAccessTime(std::string_view Namespace,
+ std::string_view Bucket,
+ const Oid& BuildId,
+ const Oid& BuildPartId) const
+{
+ const IoHash BuildHashId = buildstore::impl::MakeBuildHashId(Namespace, Bucket, BuildId);
+ const IoHash BuildPartHashId = buildstore::impl::MakeBuildPartHashId(BuildHashId, BuildPartId);
+
+ RwLock::SharedLockScope Lock(m_Lock);
+ if (auto It = m_BuildPartLookup.find(BuildHashId); It != m_BuildPartLookup.end())
+ {
+ const BuildPartEntryIndex Index = It->second;
+ ZEN_ASSERT_SLOW(Index.Index < m_BuildPartEntries.size());
+ const BuildPartEntry& Entry = m_BuildPartEntries[Index];
+ return Entry.LastAccessTime;
+ }
+ return {};
+}
+
+bool
+BuildStore::SetBuildLastAccessTime(std::string_view Namespace, std::string_view Bucket, const Oid& BuildId, const AccessTime& Time)
+{
+ const IoHash BuildHashId = buildstore::impl::MakeBuildHashId(Namespace, Bucket, BuildId);
+
+ RwLock::SharedLockScope Lock(m_Lock);
+ if (auto It = m_BuildLookup.find(BuildHashId); It != m_BuildLookup.end())
+ {
+ const BuildEntryIndex Index = It->second;
+ ZEN_ASSERT_SLOW(Index.Index < m_BuildEntries.size());
+ BuildEntry& Entry = m_BuildEntries[Index];
+ Entry.LastAccessTime = Time;
+ return true;
+ }
+ return false;
+}
+
+bool
+BuildStore::SetBuildPartLastAccessTime(std::string_view Namespace,
+ std::string_view Bucket,
+ const Oid& BuildId,
+ const Oid& BuildPartId,
+ const AccessTime& Time)
+{
+ const IoHash BuildHashId = buildstore::impl::MakeBuildHashId(Namespace, Bucket, BuildId);
+ const IoHash BuildPartHashId = buildstore::impl::MakeBuildPartHashId(BuildHashId, BuildPartId);
+
+ RwLock::SharedLockScope Lock(m_Lock);
+ if (auto It = m_BuildPartLookup.find(BuildHashId); It != m_BuildPartLookup.end())
+ {
+ const BuildPartEntryIndex Index = It->second;
+ ZEN_ASSERT_SLOW(Index.Index < m_BuildPartEntries.size());
+ BuildPartEntry& Entry = m_BuildPartEntries[Index];
+ Entry.LastAccessTime = Time;
+ return true;
+ }
+ return false;
+}
+
+#endif // ZEN_WITH_TESTS
+
uint64_t
BuildStore::ReadLog(const RwLock::ExclusiveLockScope&, const std::filesystem::path& LogPath, uint64_t SkipEntryCount)
{
diff --git a/src/zenstore/include/zenstore/buildstore/buildstore.h b/src/zenstore/include/zenstore/buildstore/buildstore.h
index 5872cd3ea..59e42ef35 100644
--- a/src/zenstore/include/zenstore/buildstore/buildstore.h
+++ b/src/zenstore/include/zenstore/buildstore/buildstore.h
@@ -284,6 +284,20 @@ public:
//////// GcReferenceLocker
virtual std::vector<RwLock::SharedLockScope> LockState(GcCtx& Ctx) override;
+#if ZEN_WITH_TESTS
+ std::optional<AccessTime> GetBuildLastAccessTime(std::string_view Namespace, std::string_view Bucket, const Oid& BuildId) const;
+ std::optional<AccessTime> GetBuildPartLastAccessTime(std::string_view Namespace,
+ std::string_view Bucket,
+ const Oid& BuildId,
+ const Oid& BuildPartId) const;
+ bool SetBuildLastAccessTime(std::string_view Namespace, std::string_view Bucket, const Oid& BuildId, const AccessTime& Time);
+ bool SetBuildPartLastAccessTime(std::string_view Namespace,
+ std::string_view Bucket,
+ const Oid& BuildId,
+ const Oid& BuildPartId,
+ const AccessTime& Time);
+#endif // ZEN_WITH_TESTS
+
private:
uint64_t ReadLog(const RwLock::ExclusiveLockScope&, const std::filesystem::path& LogPath, uint64_t SkipEntryCount);
void WriteAccessTimes(const RwLock::ExclusiveLockScope&, const std::filesystem::path& AccessTimesPath);
@@ -354,7 +368,7 @@ private:
GcManager& m_Gc;
- RwLock m_Lock;
+ mutable RwLock m_Lock;
tsl::robin_map<IoHash, BuildEntryIndex, IoHash::Hasher> m_BuildLookup;
tsl::robin_map<IoHash, BuildPartEntryIndex, IoHash::Hasher> m_BuildPartLookup;