aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zenserver/projectstore.cpp89
-rw-r--r--zenserver/projectstore.h23
2 files changed, 58 insertions, 54 deletions
diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp
index 95fb2d3f8..c3af4ad92 100644
--- a/zenserver/projectstore.cpp
+++ b/zenserver/projectstore.cpp
@@ -385,22 +385,34 @@ ProjectStore::Oplog::FindChunk(Oid ChunkId)
return Chunk;
}
- if (auto DerivedIt = m_DerivedDataMap.find(ChunkId); DerivedIt != m_DerivedDataMap.end())
+ if (auto EntryIt = m_CacheMap.find(ChunkId); EntryIt != m_CacheMap.end())
{
- const DerivedDataEntry& Entry = DerivedIt->second;
+ const CacheMapEntry& Entry = EntryIt->second;
- if (Entry.Cid != IoHash::Zero)
+ if (Entry.ValueId != Oid::Zero)
{
- if (IoBuffer Chunk = m_CidStore.FindChunkByCid(Entry.Cid))
+ IoHash Cid = Entry.Cid;
+ if (Cid == IoHash::Zero)
{
- Chunk.SetContentType(ZenContentType::kCompressedBinary);
- return Chunk;
+ Cid = ResolveCacheMapping(Entry.Namespace, Entry.CacheKey, Entry.ValueId);
+ if (Cid != IoHash::Zero)
+ {
+ CacheMapEntry ResolvedEntry = Entry;
+ ResolvedEntry.Cid = Cid;
+ m_CacheMap.insert_or_assign(ChunkId, ResolvedEntry);
+ }
}
- }
- ZenCacheValue CacheValue;
- if (m_CacheStore.Get(Entry.Namespace, Entry.Bucket, Entry.Hash, CacheValue))
+ IoBuffer Chunk = m_CidStore.FindChunkByCid(Cid);
+ Chunk.SetContentType(ZenContentType::kCompressedBinary);
+
+ return Chunk;
+ }
+ else
{
+ ZenCacheValue CacheValue;
+ m_CacheStore.Get(Entry.Namespace, Entry.CacheKey.Bucket, Entry.CacheKey.Hash, CacheValue);
+
return CacheValue.Value;
}
}
@@ -534,35 +546,38 @@ ProjectStore::Oplog::AddMetaMapping(const RwLock::ExclusiveLockScope&, Oid Chunk
}
bool
-ProjectStore::Oplog::AddDerivedDataMapping(const RwLock::ExclusiveLockScope&,
- std::string_view Namespace,
- std::string_view Bucket,
- const IoHash& Hash,
- const Oid& ValueId,
- const Oid& ChunkId)
+ProjectStore::Oplog::AddCacheMapping(const RwLock::ExclusiveLockScope&,
+ std::string_view Namespace,
+ const CacheKey& CacheKey,
+ const Oid& ValueId,
+ const Oid& ChunkId)
{
using namespace std::literals;
- if (Namespace.empty() || Bucket.empty() || Hash == IoHash::Zero)
+ if (Namespace.empty() || CacheKey == CacheKey::Empty || ChunkId == Oid::Zero)
{
return false;
}
- if (ChunkId == Oid::Zero)
- {
- return false;
- }
+ const IoHash Cid = ValueId != Oid::Zero ? ResolveCacheMapping(Namespace, CacheKey, ValueId) : IoHash::Zero;
+ m_CacheMap.insert_or_assign(ChunkId,
+ CacheMapEntry{.Namespace = std::string(Namespace), .CacheKey = CacheKey, .ValueId = ValueId, .Cid = Cid});
+
+ return true;
+}
- IoHash Cid = IoHash::Zero;
+IoHash
+ProjectStore::Oplog::ResolveCacheMapping(std::string_view Namespace, const CacheKey& CacheKey, const Oid& ValueId)
+{
+ using namespace std::literals;
ZenCacheValue CacheValue;
- if (m_CacheStore.Get(Namespace, Bucket, Hash, CacheValue))
+ if (m_CacheStore.Get(Namespace, CacheKey.Bucket, CacheKey.Hash, CacheValue))
{
- const bool IsStructured = CacheValue.Value.GetContentType() == ZenContentType::kCbObject;
- if (IsStructured)
+ if (CacheValue.Value.GetContentType() == ZenContentType::kCbObject)
{
- CbObjectView RecordObj = CbObjectView(CacheValue.Value.GetData());
- CbArrayView Values = RecordObj["Values"sv].AsArrayView();
+ CbObjectView CacheRecord = CbObjectView(CacheValue.Value.GetData());
+ CbArrayView Values = CacheRecord["Values"sv].AsArrayView();
for (CbFieldView Value : Values)
{
@@ -571,24 +586,13 @@ ProjectStore::Oplog::AddDerivedDataMapping(const RwLock::ExclusiveLockScope&,
if (Id == ValueId)
{
- Cid = ValueObj["RawHash"sv].AsHash();
- break;
+ return ValueObj["RawHash"sv].AsHash();
}
}
-
- if (Cid == IoHash::Zero)
- {
- // Failed to map Value id to content ID
- return false;
- }
}
}
- m_DerivedDataMap.insert_or_assign(
- ChunkId,
- DerivedDataEntry{.Namespace = std::string(Namespace), .Bucket = std::string(Bucket), .Hash = Hash, .Cid = Cid, .ValueId = ValueId});
-
- return true;
+ return IoHash::Zero;
}
uint32_t
@@ -679,14 +683,13 @@ ProjectStore::Oplog::RegisterOplogEntry(CbObject Core, const OplogEntry& OpEntry
{
CbObjectView RefObj = Entry.AsObjectView();
std::string_view Namespace = RefObj["namespace"sv].AsString(std::string_view("ue.ddc"));
- std::string_view Bucket = RefObj["bucket"sv].AsString();
- const IoHash Key = RefObj["key"sv].AsHash();
+ CacheKey Key = CacheKey::Create(RefObj["bucket"sv].AsString(), RefObj["key"sv].AsHash());
const Oid ValueId = RefObj["valueid"sv].AsObjectId();
const Oid ChunkId = RefObj["chunkid"sv].AsObjectId();
- if (AddDerivedDataMapping(OplogLock, Namespace, Bucket, Key, ValueId, ChunkId))
+ if (AddCacheMapping(OplogLock, Namespace, Key, ValueId, ChunkId))
{
- ZEN_DEBUG("derived data {} -> '{}/{}/{}'", ChunkId, Namespace, Bucket, Key);
+ ZEN_DEBUG("derived data {} -> '{}/{}/{}'", ChunkId, Namespace, Key.Bucket, Key.Hash);
}
else
{
diff --git a/zenserver/projectstore.h b/zenserver/projectstore.h
index 94bfe5f03..65d9264ad 100644
--- a/zenserver/projectstore.h
+++ b/zenserver/projectstore.h
@@ -8,6 +8,7 @@
#include <zenhttp/httpserver.h>
#include <zenstore/cidstore.h>
#include <zenstore/gc.h>
+#include <zenutil/cache/cachekey.h>
#include <filesystem>
#include <map>
@@ -135,13 +136,12 @@ public:
std::string ClientPath;
};
- struct DerivedDataEntry
+ struct CacheMapEntry
{
std::string Namespace;
- std::string Bucket;
- IoHash Hash;
- IoHash Cid;
+ CacheKey CacheKey;
Oid ValueId;
+ IoHash Cid;
};
template<class V>
@@ -157,7 +157,7 @@ public:
OidMap<IoHash> m_ChunkMap; // output data chunk id -> CAS address
OidMap<IoHash> m_MetaMap; // meta chunk id -> CAS address
OidMap<FileMapEntry> m_FileMap; // file id -> file map entry
- OidMap<DerivedDataEntry> m_DerivedDataMap; // chunk id -> CAS address
+ OidMap<CacheMapEntry> m_CacheMap; // chunk id -> CAS address
int32_t m_ManifestVersion; // File system manifest version
std::map<int, OplogEntryAddress> m_OpAddressMap; // Index LSN -> op data in ops blob file
OidMap<int> m_LatestOpMap; // op key -> latest op LSN for key
@@ -172,12 +172,13 @@ public:
std::string_view ClientPath);
void AddChunkMapping(const RwLock::ExclusiveLockScope& OplogLock, Oid ChunkId, IoHash Hash);
void AddMetaMapping(const RwLock::ExclusiveLockScope& OplogLock, Oid ChunkId, IoHash Hash);
- bool AddDerivedDataMapping(const RwLock::ExclusiveLockScope& OplogLock,
- std::string_view Namespace,
- std::string_view KeyBucket,
- const IoHash& KeyHash,
- const Oid& ValueId,
- const Oid& ChunkId);
+ bool AddCacheMapping(const RwLock::ExclusiveLockScope& OplogLock,
+ std::string_view Namespace,
+ const CacheKey& CacheKey,
+ const Oid& ValueId,
+ const Oid& ChunkId);
+
+ IoHash ResolveCacheMapping(std::string_view Namespace, const CacheKey& CacheKey, const Oid& ValueId);
};
struct Project : public RefCounted