diff options
| author | Dan Engelbrecht <[email protected]> | 2022-03-14 08:38:06 +0100 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-03-31 11:28:31 +0200 |
| commit | 816081909465d15464040ec754a9680e6a1e3976 (patch) | |
| tree | 4432799c4700bac7807ec82f30a2474bc206ad23 /zenstore/compactcas.cpp | |
| parent | Fix insert offset when moving last chunk (diff) | |
| download | zen-816081909465d15464040ec754a9680e6a1e3976.tar.xz zen-816081909465d15464040ec754a9680e6a1e3976.zip | |
Add AlignPositon helper
Diffstat (limited to 'zenstore/compactcas.cpp')
| -rw-r--r-- | zenstore/compactcas.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp index cc2657ddb..5cf0d3ae1 100644 --- a/zenstore/compactcas.cpp +++ b/zenstore/compactcas.cpp @@ -31,6 +31,11 @@ namespace zen { +static uint64_t AlignPositon(uint64_t Offset, uint64_t Alignment) +{ + return (Offset + Alignment - 1) & ~(Alignment - 1); +} + CasContainerStrategy::CasContainerStrategy(const CasStoreConfiguration& Config, CasGc& Gc) : GcStorage(Gc) , m_Config(Config) @@ -75,7 +80,7 @@ CasContainerStrategy::InsertChunk(const void* ChunkData, size_t ChunkSize, const const uint64_t InsertOffset = m_CurrentInsertOffset; m_SmallObjectFile.Write(ChunkData, ChunkSize, InsertOffset); - m_CurrentInsertOffset = (m_CurrentInsertOffset + ChunkSize + m_PayloadAlignment - 1) & ~(m_PayloadAlignment - 1); + m_CurrentInsertOffset = AlignPositon(m_CurrentInsertOffset + ChunkSize, m_PayloadAlignment); const CasDiskLocation Location{InsertOffset, ChunkSize}; CasDiskIndexEntry IndexEntry{.Key = ChunkHash, .Location = Location}; @@ -378,8 +383,7 @@ CasContainerStrategy::CollectGarbage(GcContext& GcCtx) IoHash ChunkHash = ChunkHashes[ChunkIndex]; const auto& ChunkLocation = ChunkLocations[ChunkIndex]; - uint64_t NextChunkOffset = - (ChunkLocation.GetOffset() + ChunkLocation.GetSize() + m_PayloadAlignment - 1) & ~(m_PayloadAlignment - 1); + uint64_t NextChunkOffset = AlignPositon(ChunkLocation.GetOffset() + ChunkLocation.GetSize(), m_PayloadAlignment); uint64_t FreeChunkSize = ChunkLocation.GetOffset() - WriteOffset; @@ -404,7 +408,7 @@ CasContainerStrategy::CollectGarbage(GcContext& GcCtx) std::vector<uint8_t> Chunk; Chunk.resize(LastChunkLocation.GetSize()); m_SmallObjectFile.Read(Chunk.data(), Chunk.size(), LastChunkLocation.GetOffset()); - CasDiskLocation NewChunkLocation(WriteOffset, LastChunkLocation.GetSize()); + CasDiskLocation NewChunkLocation(WriteOffset, Chunk.size()); m_SmallObjectFile.Write(Chunk.data(), Chunk.size(), NewChunkLocation.GetOffset()); CasDiskIndexEntry IndexEntry{.Key = ChunkHash, .Location = NewChunkLocation}; @@ -412,13 +416,11 @@ CasContainerStrategy::CollectGarbage(GcContext& GcCtx) m_LocationMap[LastChunkHash] = NewChunkLocation; ChunkHashes.pop_back(); - uint64_t LastChunkNextChunkOffset = - (LastChunkLocation.GetOffset() + Chunk.size() + m_PayloadAlignment - 1) & ~(m_PayloadAlignment - 1); - - WriteOffset = (WriteOffset + NewChunkLocation.GetSize() + m_PayloadAlignment - 1) & ~(m_PayloadAlignment - 1); + WriteOffset = AlignPositon(WriteOffset + Chunk.size(), m_PayloadAlignment); FreeChunkSize = ChunkLocation.GetOffset() - WriteOffset; MovedChunks.push_back(LastChunkHash); + uint64_t LastChunkNextChunkOffset = AlignPositon(LastChunkLocation.GetOffset() + Chunk.size(), m_PayloadAlignment); if (m_CurrentInsertOffset == LastChunkNextChunkOffset) { m_CurrentInsertOffset = LastChunkLocation.GetOffset(); @@ -431,7 +433,7 @@ CasContainerStrategy::CollectGarbage(GcContext& GcCtx) std::vector<uint8_t> Chunk; Chunk.resize(ChunkLocation.GetSize()); m_SmallObjectFile.Read(Chunk.data(), Chunk.size(), ChunkLocation.GetOffset()); - CasDiskLocation NewChunkLocation(WriteOffset, ChunkLocation.GetSize()); + CasDiskLocation NewChunkLocation(WriteOffset, Chunk.size()); m_SmallObjectFile.Write(Chunk.data(), Chunk.size(), NewChunkLocation.GetOffset()); CasDiskIndexEntry IndexEntry{.Key = ChunkHash, .Location = NewChunkLocation}; @@ -439,7 +441,7 @@ CasContainerStrategy::CollectGarbage(GcContext& GcCtx) m_LocationMap[ChunkHash] = NewChunkLocation; MovedChunks.push_back(ChunkHash); - WriteOffset = (NewChunkLocation.GetOffset() + ChunkLocation.GetSize() + m_PayloadAlignment - 1) & ~(m_PayloadAlignment - 1); + WriteOffset = AlignPositon(NewChunkLocation.GetOffset() + Chunk.size(), m_PayloadAlignment); } else { @@ -556,7 +558,7 @@ CasContainerStrategy::OpenContainer(bool IsNewStore) m_TotalSize.fetch_add(Location.GetSize()); } - m_CurrentInsertOffset = (MaxFileOffset + m_PayloadAlignment - 1) & ~(m_PayloadAlignment - 1); + m_CurrentInsertOffset = AlignPositon(MaxFileOffset, m_PayloadAlignment); // m_CurrentIndexOffset = m_SmallObjectIndex.FileSize(); } |