From 26b21f98b654d79b109f1e55e5fe4ee2ef4ac926 Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Mon, 15 May 2023 21:50:24 +0200 Subject: added error reporting for bad BlockStore chunks also eliminated some copy-paste --- src/zenstore/blockstore.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'src/zenstore/blockstore.cpp') diff --git a/src/zenstore/blockstore.cpp b/src/zenstore/blockstore.cpp index f9e74fb0b..427364f84 100644 --- a/src/zenstore/blockstore.cpp +++ b/src/zenstore/blockstore.cpp @@ -665,6 +665,8 @@ BlockStore::IterateChunks(const std::vector& ChunkLocations, const IterateChunksSmallSizeCallback& SmallSizeCallback, const IterateChunksLargeSizeCallback& LargeSizeCallback) { + ZEN_LOG_SCOPE("iterating chunks from '{}'", m_BlocksBasePath); + std::vector LocationIndexes; LocationIndexes.reserve(ChunkLocations.size()); for (size_t ChunkIndex = 0; ChunkIndex < ChunkLocations.size(); ++ChunkIndex) @@ -718,10 +720,13 @@ BlockStore::IterateChunks(const std::vector& ChunkLocations, size_t ChunkIndex = LocationIndexes[LocationIndexOffset]; const BlockStoreLocation& FirstLocation = ChunkLocations[ChunkIndex]; - auto FindBlockIt = m_ChunkBlocks.find(FirstLocation.BlockIndex); + const uint32_t BlockIndex = FirstLocation.BlockIndex; + auto FindBlockIt = m_ChunkBlocks.find(BlockIndex); if (FindBlockIt == m_ChunkBlocks.end()) { - while (ChunkLocations[ChunkIndex].BlockIndex == FirstLocation.BlockIndex) + ZEN_LOG_SCOPE("block #{} not available", BlockIndex); + + while (ChunkLocations[ChunkIndex].BlockIndex == BlockIndex) { SmallSizeCallback(ChunkIndex, nullptr, 0); LocationIndexOffset++; @@ -736,8 +741,8 @@ BlockStore::IterateChunks(const std::vector& ChunkLocations, const Ref& BlockFile = FindBlockIt->second; ZEN_ASSERT(BlockFile); - size_t BlockSize = BlockFile->FileSize(); - size_t RangeCount = GetNextRange(LocationIndexOffset); + const size_t BlockSize = BlockFile->FileSize(); + const size_t RangeCount = GetNextRange(LocationIndexOffset); if (RangeCount > 0) { size_t LastChunkIndex = LocationIndexes[LocationIndexOffset + RangeCount - 1]; @@ -748,8 +753,14 @@ BlockStore::IterateChunks(const std::vector& ChunkLocations, { size_t NextChunkIndex = LocationIndexes[LocationIndexOffset + RangeIndex]; const BlockStoreLocation& ChunkLocation = ChunkLocations[NextChunkIndex]; - if (ChunkLocation.Size == 0 || (ChunkLocation.Offset + ChunkLocation.Size > BlockSize)) + if (ChunkLocation.Size == 0 || ((ChunkLocation.Offset + ChunkLocation.Size) > BlockSize)) { + ZEN_LOG_SCOPE("chunk [{},{}] out of bounds (block #{} file size = {})", + ChunkLocation.Offset, + ChunkLocation.Size, + BlockIndex, + BlockSize); + SmallSizeCallback(NextChunkIndex, nullptr, 0); continue; } @@ -761,6 +772,12 @@ BlockStore::IterateChunks(const std::vector& ChunkLocations, } if (FirstLocation.Size == 0 || (FirstLocation.Offset + FirstLocation.Size > BlockSize)) { + ZEN_LOG_SCOPE("chunk [{},{}] out of bounds (block #{} file size = {})", + FirstLocation.Offset, + FirstLocation.Size, + BlockIndex, + BlockSize); + SmallSizeCallback(ChunkIndex, nullptr, 0); LocationIndexOffset++; continue; -- cgit v1.2.3