diff options
| -rw-r--r-- | zenserver/projectstore.cpp | 89 | ||||
| -rw-r--r-- | zenserver/projectstore.h | 23 |
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 |