diff options
| author | Dan Engelbrecht <[email protected]> | 2024-06-11 15:39:45 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2024-06-11 15:39:45 +0200 |
| commit | 61e8cd48e82f63b83ad5f0420a9332de10ef13e9 (patch) | |
| tree | 1e536bfbef7265463143d41d7aec9b49fe16dcd0 | |
| parent | add logging/validation for getchunkinfos (diff) | |
| download | zen-de/chunk-info-logging.tar.xz zen-de/chunk-info-logging.zip | |
fix validationde/chunk-info-logging
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 36 | ||||
| -rw-r--r-- | src/zenserver/projectstore/projectstore.h | 5 |
2 files changed, 28 insertions, 13 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index 0222ccd36..9628d0aeb 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -2818,25 +2818,26 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, const bool WantsRawSizeField = WantsAllFields || WantedFieldNames.contains("rawsize"); const bool WantsSizeField = WantsAllFields || WantedFieldNames.contains("size"); + size_t ChunkCount = FoundLog->ChunkCount(); + std::vector<bool> Found; std::vector<Oid> Ids; std::vector<IoHash> Hashes; std::vector<uint64_t> RawSizes; std::vector<uint64_t> Sizes; - size_t Count = 0; + Ids.reserve(ChunkCount); + Hashes.reserve(ChunkCount); + FoundLog->IterateChunkMap([&](const Oid& Id, const IoHash& Hash) { - if (WantsIdField) - { - Ids.push_back(Id); - } - if (WantsRawHashField || WantsRawSizeField || WantsSizeField) - { - Hashes.push_back(Hash); - } - Count++; + ZEN_ASSERT(Id != Oid::Zero); + ZEN_ASSERT(Hash != IoHash::Zero); + Ids.push_back(Id); + Hashes.push_back(Hash); }); + ChunkCount = Ids.size(); + if (WantsRawSizeField || WantsSizeField) { Found.resize(Hashes.size(), false); @@ -2906,14 +2907,21 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, CbObjectWriter Response; Response.BeginArray("chunkinfos"sv); - for (size_t Index = 0; Index < Count; Index++) + for (size_t Index = 0; Index < ChunkCount; Index++) { - Response.BeginObject(); if (!Found[Index]) { - ZEN_INFO("Missing chunk {} in oplog {}/{}", Ids[Index], ProjectId, OplogId); + if (FoundLog->FindChunk(Ids[Index])) + { + ZEN_WARN("IterateChunks failed to fetch chunk {} in oplog {}/{}", Ids[Index], ProjectId, OplogId); + } + else + { + ZEN_INFO("Missing chunk {} in oplog {}/{}", Ids[Index], ProjectId, OplogId); + } continue; } + Response.BeginObject(); if (WantsIdField) { Response << "id"sv << Ids[Index]; @@ -2924,10 +2932,12 @@ ProjectStore::GetProjectChunkInfos(const std::string_view ProjectId, } if (WantsSizeField) { + ZEN_ASSERT(Sizes[Index] != (uint64_t)-1); Response << "size"sv << Sizes[Index]; } if (WantsRawSizeField) { + ZEN_ASSERT(RawSizes[Index] != (uint64_t)-1); Response << "rawsize"sv << RawSizes[Index]; } Response.EndObject(); diff --git a/src/zenserver/projectstore/projectstore.h b/src/zenserver/projectstore/projectstore.h index fd8443660..d4935a534 100644 --- a/src/zenserver/projectstore/projectstore.h +++ b/src/zenserver/projectstore/projectstore.h @@ -144,6 +144,11 @@ public: RwLock::SharedLockScope _(m_OplogLock); return m_LatestOpMap.size(); } + std::size_t ChunkCount() const + { + RwLock::SharedLockScope _(m_OplogLock); + return m_ChunkMap.size(); + } std::filesystem::path PrepareForDelete(bool MoveFolder); |