diff options
| author | Stefan Boberg <[email protected]> | 2021-05-24 22:26:56 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-05-24 22:26:56 +0200 |
| commit | c54f3888d1b0e1bb0d5edf335c22a6d0f454afd2 (patch) | |
| tree | dc2866edfd93f91b31fefd70fcd8fa92ec81b453 /zenstore/cidstore.cpp | |
| parent | Fixed index flags for standalone files (diff) | |
| download | zen-c54f3888d1b0e1bb0d5edf335c22a6d0f454afd2.tar.xz zen-c54f3888d1b0e1bb0d5edf335c22a6d0f454afd2.zip | |
Implemented simple persistence for CidStore, which stores CID->CAS mappings
Diffstat (limited to 'zenstore/cidstore.cpp')
| -rw-r--r-- | zenstore/cidstore.cpp | 70 |
1 files changed, 61 insertions, 9 deletions
diff --git a/zenstore/cidstore.cpp b/zenstore/cidstore.cpp index 6e558e639..e041574a4 100644 --- a/zenstore/cidstore.cpp +++ b/zenstore/cidstore.cpp @@ -1,12 +1,69 @@ // Copyright Epic Games, Inc. All Rights Reserved. #include "zenstore/cidstore.h" -#include "zenstore/CAS.h" + +#include <zencore/filesystem.h> +#include <zenstore/CAS.h> +#include <zenstore/caslog.h> + +#include <spdlog/spdlog.h> +#include <filesystem> namespace zen { -CidStore::CidStore(CasStore& InCasStore) : m_CasStore(InCasStore) +struct CidStore::CidState +{ + CidState(CasStore& InCasStore) : m_CasStore(InCasStore) {} + + struct IndexEntry + { + IoHash Uncompressed; + IoHash Compressed; + }; + + CasStore& m_CasStore; + TCasLogFile<IndexEntry> m_LogFile; + + RwLock m_Lock; + tsl::robin_map<IoHash, IoHash> m_CidMap; + + void AddCompressedCid(const IoHash& DecompressedId, const IoHash& Compressed) + { + RwLock::ExclusiveLockScope _(m_Lock); + m_CidMap.insert_or_assign(DecompressedId, Compressed); + m_LogFile.Append({.Uncompressed = DecompressedId, .Compressed = Compressed}); + } + + IoBuffer FindChunkByCid(const IoHash& DecompressedId) + { + if (auto It = m_CidMap.find(DecompressedId); It != m_CidMap.end()) + { + return m_CasStore.FindChunk(It->second); + } + + return IoBuffer(); + } + + void InitializeIndex(const std::filesystem::path& RootDir) + { + zen::CreateDirectories(RootDir); + std::filesystem::path SlogPath{RootDir / "cid.slog"}; + + bool IsNew = !std::filesystem::exists(SlogPath); + + m_LogFile.Open(SlogPath, IsNew); + + m_LogFile.Replay([&](const IndexEntry& Ie) { m_CidMap.insert_or_assign(Ie.Uncompressed, Ie.Compressed); }); + + spdlog::debug("CID index initialized: {} entries found", m_CidMap.size()); + } +}; + +////////////////////////////////////////////////////////////////////////// + +CidStore::CidStore(CasStore& InCasStore, const std::filesystem::path& RootDir) : m_Impl(std::make_unique<CidState>(InCasStore)) { + m_Impl->InitializeIndex(RootDir); } CidStore::~CidStore() @@ -16,18 +73,13 @@ CidStore::~CidStore() void CidStore::AddCompressedCid(const IoHash& DecompressedId, const IoHash& Compressed) { - m_CidMap.insert_or_assign(DecompressedId, Compressed); + m_Impl->AddCompressedCid(DecompressedId, Compressed); } IoBuffer CidStore::FindChunkByCid(const IoHash& DecompressedId) { - if (auto It = m_CidMap.find(DecompressedId); It != m_CidMap.end()) - { - return m_CasStore.FindChunk(It->second); - } - - return IoBuffer(); + return m_Impl->FindChunkByCid(DecompressedId); } } // namespace zen |