diff options
| author | Dan Engelbrecht <[email protected]> | 2024-06-11 13:36:07 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2024-06-11 13:36:07 +0200 |
| commit | 3d1c02bd351a9cf46d19c1632f683820b9bc1fe2 (patch) | |
| tree | 9ee509df8370e372e6bb9225dd4837e8a756e7b7 /src/zenserver | |
| parent | 5.5.3-pre0 (diff) | |
| download | zen-3d1c02bd351a9cf46d19c1632f683820b9bc1fe2.tar.xz zen-3d1c02bd351a9cf46d19c1632f683820b9bc1fe2.zip | |
add logging/validation for getchunkinfos
Diffstat (limited to 'src/zenserver')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index 4c434c39b..0222ccd36 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -2818,6 +2818,7 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, const bool WantsRawSizeField = WantsAllFields || WantedFieldNames.contains("rawsize"); const bool WantsSizeField = WantsAllFields || WantedFieldNames.contains("size"); + std::vector<bool> Found; std::vector<Oid> Ids; std::vector<IoHash> Hashes; std::vector<uint64_t> RawSizes; @@ -2838,13 +2839,14 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, if (WantsRawSizeField || WantsSizeField) { + Found.resize(Hashes.size(), false); if (WantsRawSizeField) { - RawSizes.resize(Hashes.size(), 0u); + RawSizes.resize(Hashes.size(), (uint64_t)-1); } if (WantsSizeField) { - Sizes.resize(Hashes.size(), 0u); + Sizes.resize(Hashes.size(), (uint64_t)-1); } WorkerThreadPool& WorkerPool = GetSmallWorkerPool(); // GetSyncWorkerPool(); @@ -2852,13 +2854,39 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, Hashes, [&](size_t Index, const IoBuffer& Chunk) -> bool { uint64_t Size = Chunk.GetSize(); + if (Size == 0) + { + ZEN_INFO("Empty data for chunk {} in oplog {}/{}", Ids[Index], ProjectId, OplogId); + } + else + { + Found[Index] = true; + } if (WantsRawSizeField) { uint64_t RawSize = Size; if (Chunk.GetContentType() == ZenContentType::kCompressedBinary) { - IoHash __; - (void)CompressedBuffer::FromCompressed(SharedBuffer(Chunk), __, RawSize); + IoHash RawHash; + CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Chunk), RawHash, RawSize); + if (Compressed) + { + if (RawHash != Hashes[Index]) + { + ZEN_WARN("Mismatching raw hash for chunk {} in oplog {}/{}. Expected {}, Got: {}", + Ids[Index], + ProjectId, + OplogId, + Hashes[Index], + RawHash); + Found[Index] = false; + } + } + else + { + ZEN_INFO("Invalid data format for chunk {} in oplog {}/{}", Ids[Index], ProjectId, OplogId); + Found[Index] = false; + } } RawSizes[Index] = RawSize; } @@ -2870,6 +2898,10 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, }, &WorkerPool); } + else + { + Found.resize(Hashes.size(), true); + } CbObjectWriter Response; Response.BeginArray("chunkinfos"sv); @@ -2877,6 +2909,11 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, for (size_t Index = 0; Index < Count; Index++) { Response.BeginObject(); + if (!Found[Index]) + { + ZEN_INFO("Missing chunk {} in oplog {}/{}", Ids[Index], ProjectId, OplogId); + continue; + } if (WantsIdField) { Response << "id"sv << Ids[Index]; |