diff options
| author | Dan Engelbrecht <[email protected]> | 2022-06-13 23:15:09 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-06-13 23:15:09 +0200 |
| commit | 83b1cd4c44b96819588828137bcf5edf9452a9bb (patch) | |
| tree | f3cedd4ff8767b65dc5fbdb86ab9f8837b135a0d /zenstore/compactcas.cpp | |
| parent | Improved BlockStore::IterateChunks (diff) | |
| download | zen-83b1cd4c44b96819588828137bcf5edf9452a9bb.tar.xz zen-83b1cd4c44b96819588828137bcf5edf9452a9bb.zip | |
Add validation to ZenCacheDiskLayer::CacheBucket::Scrub
Diffstat (limited to 'zenstore/compactcas.cpp')
| -rw-r--r-- | zenstore/compactcas.cpp | 17 |
1 files changed, 8 insertions, 9 deletions
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<IoHash> BadKeys; std::vector<BlockStoreLocation> ChunkLocations; std::vector<IoHash> 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<IoHash> 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 |