From bf25f7aa746ab14d5e89c34973a43c8711b840e7 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Mon, 13 Jun 2022 20:51:41 +0200 Subject: Improved BlockStore::IterateChunks Simplified interface Go through one block at a time Report back out of range ChunkLocations --- zenstore/compactcas.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'zenstore/compactcas.cpp') diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp index 65f959a0e..4f83fb8a1 100644 --- a/zenstore/compactcas.cpp +++ b/zenstore/compactcas.cpp @@ -340,23 +340,30 @@ CasContainerStrategy::Scrub(ScrubContext& Ctx) m_BlockStore.IterateChunks( ChunkLocations, [&](size_t ChunkIndex, const void* Data, uint64_t Size) { - const IoHash ComputedHash = IoHash::HashBuffer(Data, Size); - const IoHash& ExpectedHash = ChunkIndexToChunkHash[ChunkIndex]; - if (ComputedHash != ExpectedHash) + const IoHash& Hash = ChunkIndexToChunkHash[ChunkIndex]; + if (!Data) + { + // ChunkLocation out of range of stored blocks + BadKeys.push_back(Hash); + return; + } + const IoHash ComputedHash = IoHash::HashBuffer(Data, Size); + if (ComputedHash != Hash) { // Hash mismatch - BadKeys.push_back(ExpectedHash); + BadKeys.push_back(Hash); + return; } }, - [&](size_t ChunkIndex, Ref BlockFile, uint64_t Offset, uint64_t Size) { + [&](size_t ChunkIndex, BlockStoreFile& File, uint64_t Offset, uint64_t Size) { IoHashStream Hasher; - BlockFile->StreamByteRange(Offset, Size, [&](const void* Data, uint64_t Size) { Hasher.Append(Data, Size); }); + File.StreamByteRange(Offset, Size, [&](const void* Data, uint64_t Size) { Hasher.Append(Data, Size); }); IoHash ComputedHash = Hasher.GetHash(); - const IoHash& ExpectedHash = ChunkIndexToChunkHash[ChunkIndex]; - if (ComputedHash != ExpectedHash) + const IoHash& Hash = ChunkIndexToChunkHash[ChunkIndex]; + if (ComputedHash != Hash) { // Hash mismatch - BadKeys.push_back(ExpectedHash); + BadKeys.push_back(Hash); } }); -- cgit v1.2.3 From 83b1cd4c44b96819588828137bcf5edf9452a9bb Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Mon, 13 Jun 2022 23:15:09 +0200 Subject: Add validation to ZenCacheDiskLayer::CacheBucket::Scrub --- zenstore/compactcas.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'zenstore/compactcas.cpp') diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp index 4f83fb8a1..3b22f5b20 100644 --- a/zenstore/compactcas.cpp +++ b/zenstore/compactcas.cpp @@ -315,11 +315,13 @@ CasContainerStrategy::Flush() void CasContainerStrategy::Scrub(ScrubContext& Ctx) { - RwLock::SharedLockScope _(m_LocationMapLock); - - uint64_t TotalChunkCount = m_LocationMap.size(); + std::vector BadKeys; std::vector ChunkLocations; std::vector ChunkIndexToChunkHash; + + RwLock::SharedLockScope _(m_LocationMapLock); + + uint64_t TotalChunkCount = m_LocationMap.size(); ChunkLocations.reserve(TotalChunkCount); ChunkIndexToChunkHash.reserve(TotalChunkCount); { @@ -328,15 +330,12 @@ CasContainerStrategy::Scrub(ScrubContext& Ctx) const IoHash& ChunkHash = Entry.first; const BlockStoreDiskLocation& DiskLocation = Entry.second; BlockStoreLocation Location = DiskLocation.Get(m_PayloadAlignment); - size_t ChunkIndex = ChunkLocations.size(); ChunkLocations.push_back(Location); - ChunkIndexToChunkHash[ChunkIndex] = ChunkHash; + ChunkIndexToChunkHash.push_back(ChunkHash); } } - std::vector BadKeys; - m_BlockStore.IterateChunks( ChunkLocations, [&](size_t ChunkIndex, const void* Data, uint64_t Size) { @@ -367,6 +366,8 @@ CasContainerStrategy::Scrub(ScrubContext& Ctx) } }); + _.ReleaseNow(); + if (BadKeys.empty()) { return; @@ -374,8 +375,6 @@ CasContainerStrategy::Scrub(ScrubContext& Ctx) ZEN_ERROR("Scrubbing found #{} bad chunks in '{}'", BadKeys.size(), m_Config.RootDirectory / m_ContainerBaseName); - _.ReleaseNow(); - if (Ctx.RunRecovery()) { // Deal with bad chunks by removing them from our lookup map -- cgit v1.2.3 From 304bb51b305e10cf2dc1fdda0bba0dec2bd19b2b Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Tue, 14 Jun 2022 15:34:06 +0200 Subject: review feedback --- zenstore/compactcas.cpp | 60 +++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 29 deletions(-) (limited to 'zenstore/compactcas.cpp') diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp index 3b22f5b20..5aed02e7f 100644 --- a/zenstore/compactcas.cpp +++ b/zenstore/compactcas.cpp @@ -336,35 +336,37 @@ CasContainerStrategy::Scrub(ScrubContext& Ctx) } } - m_BlockStore.IterateChunks( - ChunkLocations, - [&](size_t ChunkIndex, const void* Data, uint64_t Size) { - const IoHash& Hash = ChunkIndexToChunkHash[ChunkIndex]; - if (!Data) - { - // ChunkLocation out of range of stored blocks - BadKeys.push_back(Hash); - return; - } - const IoHash ComputedHash = IoHash::HashBuffer(Data, Size); - if (ComputedHash != Hash) - { - // Hash mismatch - BadKeys.push_back(Hash); - return; - } - }, - [&](size_t ChunkIndex, BlockStoreFile& File, uint64_t Offset, uint64_t Size) { - IoHashStream Hasher; - File.StreamByteRange(Offset, Size, [&](const void* Data, uint64_t Size) { Hasher.Append(Data, Size); }); - IoHash ComputedHash = Hasher.GetHash(); - const IoHash& Hash = ChunkIndexToChunkHash[ChunkIndex]; - if (ComputedHash != Hash) - { - // Hash mismatch - BadKeys.push_back(Hash); - } - }); + const auto ValidateSmallChunk = [&](size_t ChunkIndex, const void* Data, uint64_t Size) { + const IoHash& Hash = ChunkIndexToChunkHash[ChunkIndex]; + if (!Data) + { + // ChunkLocation out of range of stored blocks + BadKeys.push_back(Hash); + return; + } + const IoHash ComputedHash = IoHash::HashBuffer(Data, Size); + if (ComputedHash != Hash) + { + // Hash mismatch + BadKeys.push_back(Hash); + return; + } + }; + + const auto ValidateLargeChunk = [&](size_t ChunkIndex, BlockStoreFile& File, uint64_t Offset, uint64_t Size) { + IoHashStream Hasher; + File.StreamByteRange(Offset, Size, [&](const void* Data, uint64_t Size) { Hasher.Append(Data, Size); }); + IoHash ComputedHash = Hasher.GetHash(); + const IoHash& Hash = ChunkIndexToChunkHash[ChunkIndex]; + if (ComputedHash != Hash) + { + // Hash mismatch + BadKeys.push_back(Hash); + return; + } + }; + + m_BlockStore.IterateChunks(ChunkLocations, ValidateSmallChunk, ValidateLargeChunk); _.ReleaseNow(); -- cgit v1.2.3