aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-06-11 13:36:07 +0200
committerDan Engelbrecht <[email protected]>2024-06-11 13:36:07 +0200
commit3d1c02bd351a9cf46d19c1632f683820b9bc1fe2 (patch)
tree9ee509df8370e372e6bb9225dd4837e8a756e7b7 /src/zenserver
parent5.5.3-pre0 (diff)
downloadzen-3d1c02bd351a9cf46d19c1632f683820b9bc1fe2.tar.xz
zen-3d1c02bd351a9cf46d19c1632f683820b9bc1fe2.zip
add logging/validation for getchunkinfos
Diffstat (limited to 'src/zenserver')
-rw-r--r--src/zenserver/projectstore/projectstore.cpp45
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];