aboutsummaryrefslogtreecommitdiff
path: root/zenstore/compactcas.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-06-13 23:15:09 +0200
committerDan Engelbrecht <[email protected]>2022-06-13 23:15:09 +0200
commit83b1cd4c44b96819588828137bcf5edf9452a9bb (patch)
treef3cedd4ff8767b65dc5fbdb86ab9f8837b135a0d /zenstore/compactcas.cpp
parentImproved BlockStore::IterateChunks (diff)
downloadzen-83b1cd4c44b96819588828137bcf5edf9452a9bb.tar.xz
zen-83b1cd4c44b96819588828137bcf5edf9452a9bb.zip
Add validation to ZenCacheDiskLayer::CacheBucket::Scrub
Diffstat (limited to 'zenstore/compactcas.cpp')
-rw-r--r--zenstore/compactcas.cpp17
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