aboutsummaryrefslogtreecommitdiff
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
parentFixed index flags for standalone files (diff)
downloadzen-c54f3888d1b0e1bb0d5edf335c22a6d0f454afd2.tar.xz
zen-c54f3888d1b0e1bb0d5edf335c22a6d0f454afd2.zip
Implemented simple persistence for CidStore, which stores CID->CAS mappings
-rw-r--r--zenserver/zenserver.cpp10
-rw-r--r--zenstore/cidstore.cpp70
-rw-r--r--zenstore/include/zenstore/cidstore.h10
3 files changed, 74 insertions, 16 deletions
diff --git a/zenserver/zenserver.cpp b/zenserver/zenserver.cpp
index 7142024ea..e57a6142d 100644
--- a/zenserver/zenserver.cpp
+++ b/zenserver/zenserver.cpp
@@ -77,18 +77,20 @@ public:
// Ok so now we're configured, let's kick things off
zen::CasStoreConfiguration Config;
- Config.RootDirectory = m_DataRoot / "CAS";
+ Config.RootDirectory = m_DataRoot / "cas";
m_CasStore->Initialize(Config);
spdlog::info("instantiating project service");
- m_ProjectStore = new zen::ProjectStore(*m_CasStore, m_DataRoot / "Builds");
+ m_ProjectStore = new zen::ProjectStore(*m_CasStore, m_DataRoot / "projects");
m_HttpProjectService.reset(new zen::HttpProjectService{*m_CasStore, m_ProjectStore});
m_LocalProjectService = zen::LocalProjectService::New(*m_CasStore, m_ProjectStore);
m_HttpLaunchService = std::make_unique<zen::HttpLaunchService>(*m_CasStore);
+ m_CidStore = std::make_unique<zen::CidStore>(*m_CasStore, m_DataRoot / "cid");
+
if (ServiceConfig.LegacyCacheEnabled)
{
spdlog::info("instantiating legacy cache service");
@@ -102,7 +104,7 @@ public:
if (ServiceConfig.StructuredCacheEnabled)
{
spdlog::info("instantiating structured cache service");
- m_StructuredCacheService.reset(new zen::HttpStructuredCacheService(m_DataRoot / "cache", *m_CasStore, m_CidStore));
+ m_StructuredCacheService.reset(new zen::HttpStructuredCacheService(m_DataRoot / "cache", *m_CasStore, *m_CidStore));
}
else
{
@@ -208,7 +210,7 @@ private:
zen::HttpServer m_Http;
std::unique_ptr<zen::CasStore> m_CasStore{zen::CreateCasStore()};
- zen::CidStore m_CidStore{*m_CasStore};
+ std::unique_ptr<zen::CidStore> m_CidStore;
zen::CasGc m_Gc{*m_CasStore};
zen::CasScrubber m_Scrubber{*m_CasStore};
HttpTestService m_TestService;
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
diff --git a/zenstore/include/zenstore/cidstore.h b/zenstore/include/zenstore/cidstore.h
index 0c8f51740..e365b198e 100644
--- a/zenstore/include/zenstore/cidstore.h
+++ b/zenstore/include/zenstore/cidstore.h
@@ -5,6 +5,10 @@
#include <tsl/robin_map.h>
#include <zencore/iohash.h>
+namespace std::filesystem {
+class path;
+}
+
namespace zen {
class CasStore;
@@ -20,15 +24,15 @@ class IoBuffer;
class CidStore
{
public:
- CidStore(CasStore& InCasStore);
+ CidStore(CasStore& InCasStore, const std::filesystem::path& RootDir);
~CidStore();
void AddCompressedCid(const IoHash& DecompressedId, const IoHash& Compressed);
IoBuffer FindChunkByCid(const IoHash& DecompressedId);
private:
- CasStore& m_CasStore;
- tsl::robin_map<IoHash, IoHash, IoHash::Hasher> m_CidMap;
+ struct CidState;
+ std::unique_ptr<CidState> m_Impl;
};
} // namespace zen