aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-06-11 15:39:45 +0200
committerDan Engelbrecht <[email protected]>2024-06-11 15:39:45 +0200
commit61e8cd48e82f63b83ad5f0420a9332de10ef13e9 (patch)
tree1e536bfbef7265463143d41d7aec9b49fe16dcd0
parentadd logging/validation for getchunkinfos (diff)
downloadzen-de/chunk-info-logging.tar.xz
zen-de/chunk-info-logging.zip
fix validationde/chunk-info-logging
-rw-r--r--src/zenserver/projectstore/projectstore.cpp36
-rw-r--r--src/zenserver/projectstore/projectstore.h5
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);