diff options
| author | Dan Engelbrecht <[email protected]> | 2024-04-15 09:11:13 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2024-04-15 09:11:13 +0200 |
| commit | f721840f9918a875b9458995d4e274bb0b3b9bea (patch) | |
| tree | 5d08cbf62b4c31fa60b242302a8d400f44e6ef0d /src/zenstore/blockstore.cpp | |
| parent | more cleanup (diff) | |
| parent | gc v2 disk freed space fix and oplog stats report improvement (#45) (diff) | |
| download | zen-de/zen-as-oplog-store.tar.xz zen-de/zen-as-oplog-store.zip | |
Merge remote-tracking branch 'origin/main' into de/zen-as-oplog-storede/zen-as-oplog-store
Diffstat (limited to 'src/zenstore/blockstore.cpp')
| -rw-r--r-- | src/zenstore/blockstore.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/zenstore/blockstore.cpp b/src/zenstore/blockstore.cpp index a576ff022..644ddf7b4 100644 --- a/src/zenstore/blockstore.cpp +++ b/src/zenstore/blockstore.cpp @@ -1093,7 +1093,6 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState, NiceBytes(MovedSize)); }); - uint64_t WriteOffset = m_MaxBlockSize + 1u; // Force detect a new block uint32_t NewBlockIndex = 0; MovedChunksArray MovedChunks; @@ -1188,8 +1187,11 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState, std::sort(SortedChunkIndexes.begin(), SortedChunkIndexes.end(), [&ChunkLocations](size_t Lhs, size_t Rhs) { return ChunkLocations[Lhs].Offset < ChunkLocations[Rhs].Offset; }); - BasicFileBuffer SourceFileBuffer(OldBlockFile->GetBasicFile(), Min(65536u, OldBlockSize)); - uint64_t MovedFromBlock = 0; + BasicFileBuffer SourceFileBuffer(OldBlockFile->GetBasicFile(), Min(65536u, OldBlockSize)); + + uint64_t WriteOffset = m_MaxBlockSize + 1u; // Force detect a new block + uint64_t WrittenBytesToBlock = 0; + uint64_t MovedFromBlock = 0; std::vector<uint8_t> Chunk; for (const size_t& ChunkIndex : SortedChunkIndexes) { @@ -1295,19 +1297,22 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState, NiceBytes(Space.Free + ReclaimedSpace)); } NewBlockFile->Create(m_MaxBlockSize); - NewBlockIndex = NextBlockIndex; - WriteOffset = 0; - TargetFileBuffer = std::make_unique<BasicFileWriter>(NewBlockFile->GetBasicFile(), Min(65536u, m_MaxBlockSize)); + NewBlockIndex = NextBlockIndex; + WriteOffset = 0; + AddedSize += WrittenBytesToBlock; + WrittenBytesToBlock = 0; + TargetFileBuffer = std::make_unique<BasicFileWriter>(NewBlockFile->GetBasicFile(), Min(65536u, m_MaxBlockSize)); } TargetFileBuffer->Write(Chunk.data(), ChunkLocation.Size, WriteOffset); MovedChunks.push_back( {ChunkIndex, {.BlockIndex = NewBlockIndex, .Offset = gsl::narrow<uint32_t>(WriteOffset), .Size = ChunkLocation.Size}}); - uint64_t WriteEndOffset = WriteOffset + ChunkLocation.Size; - MovedFromBlock += (WriteEndOffset - WriteOffset); - WriteOffset = RoundUp(WriteEndOffset, PayloadAlignment); - AddedSize += Chunk.size(); + WrittenBytesToBlock = WriteOffset + ChunkLocation.Size; + + MovedFromBlock += RoundUp(ChunkLocation.Offset + ChunkLocation.Size, PayloadAlignment) - ChunkLocation.Offset; + WriteOffset = RoundUp(WriteOffset + ChunkLocation.Size, PayloadAlignment); } + AddedSize += WrittenBytesToBlock; ZEN_INFO("{}moved {} chunks ({}) from '{}' to new block, freeing {}", LogPrefix, KeepChunkIndexes.size(), |