diff options
| author | Dan Engelbrecht <[email protected]> | 2025-09-29 13:24:44 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-09-29 13:24:44 +0200 |
| commit | 23edfaec29d306e055c801bb9c945c7cde5a9438 (patch) | |
| tree | 2154d52bc77453e0d2bbb26c4cf45b33c7101d71 /src/zenstore/cache/cachedisklayer.cpp | |
| parent | split zenserver-test monolith into multiple source files (#528) (diff) | |
| download | zen-23edfaec29d306e055c801bb9c945c7cde5a9438.tar.xz zen-23edfaec29d306e055c801bb9c945c7cde5a9438.zip | |
more cbobject validations (#527)
- Improvement: Add additional validations when reading disk cache records to get references in GC
Diffstat (limited to 'src/zenstore/cache/cachedisklayer.cpp')
| -rw-r--r-- | src/zenstore/cache/cachedisklayer.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/zenstore/cache/cachedisklayer.cpp b/src/zenstore/cache/cachedisklayer.cpp index ba82dd942..de0678550 100644 --- a/src/zenstore/cache/cachedisklayer.cpp +++ b/src/zenstore/cache/cachedisklayer.cpp @@ -3450,13 +3450,27 @@ ZenCacheDiskLayer::CacheBucket::GetReferences(const LoggerRef& Logger, auto Log = [&Logger]() { return Logger; }; - auto GetAttachments = [&](MemoryView Data) -> bool { - if (ValidateCompactBinary(Data, CbValidateMode::Default) == CbValidateError::None) + auto GetAttachments = [&](const IoHash& RawHash, MemoryView Data) -> bool { + if (CbValidateError Error = ValidateCompactBinary(Data, CbValidateMode::Default); Error == CbValidateError::None) { CbObjectView Obj(Data.GetData()); - Obj.IterateAttachments([&](CbFieldView Field) { OutReferences.emplace_back(Field.AsAttachment()); }); + if (Obj.GetSize() == Data.GetSize()) + { + Obj.IterateAttachments([&](CbFieldView Field) { OutReferences.emplace_back(Field.AsAttachment()); }); + } + else + { + ZEN_WARN("Cache record {} payload is malformed. Payload size is {}, but compact binary object size is {}", + RawHash, + Data.GetSize(), + Obj.GetSize()); + } return true; } + else + { + ZEN_WARN("Cache record {} payload is malformed. Reason: ", RawHash, ToString(Error)); + } return false; }; @@ -3548,7 +3562,7 @@ ZenCacheDiskLayer::CacheBucket::GetReferences(const LoggerRef& Logger, } auto CaptureAttachments = [&](size_t ChunkIndex, MemoryView Data) { - if (GetAttachments(Data)) + if (GetAttachments(InlineKeys[ChunkIndex], Data)) { if (WriteMetaData) { @@ -3617,7 +3631,7 @@ ZenCacheDiskLayer::CacheBucket::GetReferences(const LoggerRef& Logger, IoBuffer Buffer = GetStandaloneCacheValue(It.second, It.first); if (Buffer) { - GetAttachments(Buffer.GetView()); + GetAttachments(It.first, Buffer.GetView()); } } return true; |