aboutsummaryrefslogtreecommitdiff
path: root/zenstore/cidstore.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-05-24 22:26:56 +0200
committerStefan Boberg <[email protected]>2021-05-24 22:26:56 +0200
commitc54f3888d1b0e1bb0d5edf335c22a6d0f454afd2 (patch)
treedc2866edfd93f91b31fefd70fcd8fa92ec81b453 /zenstore/cidstore.cpp
parentFixed index flags for standalone files (diff)
downloadzen-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.cpp70
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