aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/cidstore.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-05-02 10:01:47 +0200
committerGitHub <[email protected]>2023-05-02 10:01:47 +0200
commit075d17f8ada47e990fe94606c3d21df409223465 (patch)
treee50549b766a2f3c354798a54ff73404217b4c9af /src/zenstore/cidstore.cpp
parentfix: bundle shouldn't append content zip to zen (diff)
downloadzen-075d17f8ada47e990fe94606c3d21df409223465.tar.xz
zen-075d17f8ada47e990fe94606c3d21df409223465.zip
moved source directories into `/src` (#264)
* moved source directories into `/src` * updated bundle.lua for new `src` path * moved some docs, icon * removed old test trees
Diffstat (limited to 'src/zenstore/cidstore.cpp')
-rw-r--r--src/zenstore/cidstore.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/zenstore/cidstore.cpp b/src/zenstore/cidstore.cpp
new file mode 100644
index 000000000..5a5116faf
--- /dev/null
+++ b/src/zenstore/cidstore.cpp
@@ -0,0 +1,125 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "zenstore/cidstore.h"
+
+#include <zencore/compress.h>
+#include <zencore/filesystem.h>
+#include <zencore/fmtutils.h>
+#include <zencore/logging.h>
+#include <zencore/string.h>
+#include <zenstore/scrubcontext.h>
+
+#include "cas.h"
+
+#include <filesystem>
+
+namespace zen {
+
+struct CidStore::Impl
+{
+ Impl(CasStore& InCasStore) : m_CasStore(InCasStore) {}
+
+ CasStore& m_CasStore;
+
+ void Initialize(const CidStoreConfiguration& Config) { m_CasStore.Initialize(Config); }
+
+ CidStore::InsertResult AddChunk(const IoBuffer& ChunkData, const IoHash& RawHash, CidStore::InsertMode Mode)
+ {
+#ifndef NDEBUG
+ IoHash VerifyRawHash;
+ uint64_t _;
+ ZEN_ASSERT(CompressedBuffer::ValidateCompressedHeader(ChunkData, VerifyRawHash, _) && RawHash == VerifyRawHash);
+#endif // NDEBUG
+ IoBuffer Payload(ChunkData);
+ Payload.SetContentType(ZenContentType::kCompressedBinary);
+
+ CasStore::InsertResult Result = m_CasStore.InsertChunk(Payload, RawHash, static_cast<CasStore::InsertMode>(Mode));
+
+ return {.New = Result.New};
+ }
+
+ IoBuffer FindChunkByCid(const IoHash& DecompressedId) { return m_CasStore.FindChunk(DecompressedId); }
+
+ bool ContainsChunk(const IoHash& DecompressedId) { return m_CasStore.ContainsChunk(DecompressedId); }
+
+ void FilterChunks(HashKeySet& InOutChunks)
+ {
+ InOutChunks.RemoveHashesIf([&](const IoHash& Hash) { return ContainsChunk(Hash); });
+ }
+
+ void Flush() { m_CasStore.Flush(); }
+
+ void Scrub(ScrubContext& Ctx)
+ {
+ if (Ctx.ScrubTimestamp() == m_LastScrubTime)
+ {
+ return;
+ }
+
+ m_LastScrubTime = Ctx.ScrubTimestamp();
+
+ m_CasStore.Scrub(Ctx);
+ }
+
+ uint64_t m_LastScrubTime = 0;
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+CidStore::CidStore(GcManager& Gc) : m_CasStore(CreateCasStore(Gc)), m_Impl(std::make_unique<Impl>(*m_CasStore))
+{
+}
+
+CidStore::~CidStore()
+{
+}
+
+void
+CidStore::Initialize(const CidStoreConfiguration& Config)
+{
+ m_Impl->Initialize(Config);
+}
+
+CidStore::InsertResult
+CidStore::AddChunk(const IoBuffer& ChunkData, const IoHash& RawHash, InsertMode Mode)
+{
+ return m_Impl->AddChunk(ChunkData, RawHash, Mode);
+}
+
+IoBuffer
+CidStore::FindChunkByCid(const IoHash& DecompressedId)
+{
+ return m_Impl->FindChunkByCid(DecompressedId);
+}
+
+bool
+CidStore::ContainsChunk(const IoHash& DecompressedId)
+{
+ return m_Impl->ContainsChunk(DecompressedId);
+}
+
+void
+CidStore::FilterChunks(HashKeySet& InOutChunks)
+{
+ return m_Impl->FilterChunks(InOutChunks);
+}
+
+void
+CidStore::Flush()
+{
+ m_Impl->Flush();
+}
+
+void
+CidStore::Scrub(ScrubContext& Ctx)
+{
+ m_Impl->Scrub(Ctx);
+}
+
+CidStoreSize
+CidStore::TotalSize() const
+{
+ return m_Impl->m_CasStore.TotalSize();
+}
+
+} // namespace zen