diff options
| author | Dan Engelbrecht <[email protected]> | 2024-05-03 16:34:37 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-05-03 16:34:37 +0200 |
| commit | d23b2ece61f92e8beef2d1113df2838e3fd7f5ac (patch) | |
| tree | c56fc3078fca4b47343222261b63f12d34451bde | |
| parent | assert improvements (#72) (diff) | |
| download | zen-d23b2ece61f92e8beef2d1113df2838e3fd7f5ac.tar.xz zen-d23b2ece61f92e8beef2d1113df2838e3fd7f5ac.zip | |
check partial chunk result (#73)
* validate result when getting partial chunk and warn on failure
* changelog
| -rw-r--r-- | CHANGELOG.md | 5 | ||||
| -rw-r--r-- | src/zenstore/cache/cacherpc.cpp | 35 |
2 files changed, 31 insertions, 9 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 41e272d4d..4959a4f06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ ## +- Bugfix: If we get a request for a partial chunk that can not be fulfilled we warn and send back the full chunk +- Improvement: Asserts gives an immediate ERROR log entry with callstack and reason +- Improvement: Asserts flushes the log before sending error report to Sentry + +## 5.5.1 - Bugfix: Remove extra loop causing GetProjectFiles for project store to find all chunks once for each chunk found - Bugfix: Don't capture ChunkIndex variable in CasImpl::IterateChunks by reference as it causes crash - Bugfix: Don't try to respond with zero size partial cache value when partial size is zero diff --git a/src/zenstore/cache/cacherpc.cpp b/src/zenstore/cache/cacherpc.cpp index 5bd73e902..d2625b97c 100644 --- a/src/zenstore/cache/cacherpc.cpp +++ b/src/zenstore/cache/cacherpc.cpp @@ -1663,17 +1663,34 @@ CacheRpcHandler::WriteGetCacheChunksResponse([[maybe_unused]] const CacheRequest } Request.Value = Request.Value.GetRange(Request.RequestedOffset, Request.RequestedSize == 0 ? 1u : Request.RequestedSize); - uint64_t FragmentLength = Request.Value.DecodeRawSize(); - IoHashStream FragmentHashStream; - FragmentHashStream.Append(Request.Key->ChunkId.Hash, sizeof(Request.Key->ChunkId.Hash)); - FragmentHashStream.Append(&FragmentRawOffset, sizeof(FragmentRawOffset)); - FragmentHashStream.Append(&FragmentLength, sizeof(FragmentLength)); - IoHash FragmentHash = FragmentHashStream.GetHash(); + if (Request.Value) + { + uint64_t FragmentLength = Request.Value.DecodeRawSize(); + + IoHashStream FragmentHashStream; + FragmentHashStream.Append(Request.Key->ChunkId.Hash, sizeof(Request.Key->ChunkId.Hash)); + FragmentHashStream.Append(&FragmentRawOffset, sizeof(FragmentRawOffset)); + FragmentHashStream.Append(&FragmentLength, sizeof(FragmentLength)); + IoHash FragmentHash = FragmentHashStream.GetHash(); - Writer.AddHash("FragmentHash", FragmentHash); - Writer.AddInteger("FragmentOffset", FragmentRawOffset); - RpcResponse.AddAttachment(CbAttachment(Request.Value, FragmentHash)); + Writer.AddHash("FragmentHash", FragmentHash); + Writer.AddInteger("FragmentOffset", FragmentRawOffset); + RpcResponse.AddAttachment(CbAttachment(Request.Value, FragmentHash)); + } + else + { + ZEN_WARN( + "Failed to get partial chunk for attachment {}/{}/{} (rawsize: {}, offset: {}, size: {}). Sending full " + "chunk", + Namespace, + Request.Key->Key.Bucket, + Request.Key->ChunkId, + Request.Value.DecodeRawSize(), + Request.RequestedOffset, + Request.RequestedSize) + RpcResponse.AddAttachment(CbAttachment(Request.Value, Request.Key->ChunkId)); + } } else { |