diff options
| author | Dan Engelbrecht <[email protected]> | 2022-06-13 20:51:41 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-06-13 20:51:41 +0200 |
| commit | bf25f7aa746ab14d5e89c34973a43c8711b840e7 (patch) | |
| tree | 0f874e3bbbfb1fa9591767de55105fa1107546a2 /zenstore/compactcas.cpp | |
| parent | added _WIN32_WINNT define to be consistent with xmake file (diff) | |
| download | zen-bf25f7aa746ab14d5e89c34973a43c8711b840e7.tar.xz zen-bf25f7aa746ab14d5e89c34973a43c8711b840e7.zip | |
Improved BlockStore::IterateChunks
Simplified interface
Go through one block at a time
Report back out of range ChunkLocations
Diffstat (limited to 'zenstore/compactcas.cpp')
| -rw-r--r-- | zenstore/compactcas.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
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<BlockStoreFile> 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); } }); |