aboutsummaryrefslogtreecommitdiff
path: root/zenstore/compactcas.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-03-14 08:38:06 +0100
committerDan Engelbrecht <[email protected]>2022-03-31 11:28:31 +0200
commit816081909465d15464040ec754a9680e6a1e3976 (patch)
tree4432799c4700bac7807ec82f30a2474bc206ad23 /zenstore/compactcas.cpp
parentFix insert offset when moving last chunk (diff)
downloadzen-816081909465d15464040ec754a9680e6a1e3976.tar.xz
zen-816081909465d15464040ec754a9680e6a1e3976.zip
Add AlignPositon helper
Diffstat (limited to 'zenstore/compactcas.cpp')
-rw-r--r--zenstore/compactcas.cpp24
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();
}