diff options
| -rw-r--r-- | src/zenstore/buildstore/buildstore.cpp | 79 | ||||
| -rw-r--r-- | src/zenstore/include/zenstore/buildstore/buildstore.h | 16 |
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; |