aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/blockstore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenstore/blockstore.cpp')
-rw-r--r--src/zenstore/blockstore.cpp50
1 files changed, 43 insertions, 7 deletions
diff --git a/src/zenstore/blockstore.cpp b/src/zenstore/blockstore.cpp
index 71e306eca..73a8ad538 100644
--- a/src/zenstore/blockstore.cpp
+++ b/src/zenstore/blockstore.cpp
@@ -51,6 +51,7 @@ BlockStoreFile::GetPath() const
void
BlockStoreFile::Open()
{
+ ZEN_TRACE_CPU("BlockStoreFile::Open");
uint32_t RetriesLeft = 3;
m_File.Open(m_Path, BasicFile::Mode::kDelete, [&](std::error_code& Ec) {
if (RetriesLeft == 0)
@@ -149,6 +150,11 @@ BlockStoreFile::StreamByteRange(uint64_t FileOffset, uint64_t Size, std::functio
{
m_File.StreamByteRange(FileOffset, Size, std::move(ChunkFun));
}
+bool
+BlockStoreFile::IsOpen() const
+{
+ return !!m_IoBuffer;
+}
constexpr uint64_t ScrubSmallChunkWindowSize = 4 * 1024 * 1024;
@@ -285,6 +291,7 @@ BlockStore::SyncExistingBlocksOnDisk(const BlockIndexSet& KnownLocations)
BlockStore::BlockEntryCountMap
BlockStore::GetBlocksToCompact(const BlockUsageMap& BlockUsage, uint32_t BlockUsageThresholdPercent)
{
+ ZEN_TRACE_CPU("BlockStoreFile::GetBlocksToCompact");
BlockEntryCountMap Result;
{
RwLock::SharedLockScope InsertLock(m_InsertLock);
@@ -345,6 +352,7 @@ BlockStore::GetBlocksToCompact(const BlockUsageMap& BlockUsage, uint32_t BlockUs
void
BlockStore::Close()
{
+ ZEN_TRACE_CPU("BlockStore::Close");
RwLock::ExclusiveLockScope InsertLock(m_InsertLock);
m_WriteBlock = nullptr;
m_CurrentInsertOffset = 0;
@@ -666,7 +674,7 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
ZEN_TRACE_CPU("BlockStore::ReclaimSpace::Compact");
Ref<BlockStoreFile> NewBlockFile;
auto NewBlockFileGuard = MakeGuard([&]() {
- if (NewBlockFile)
+ if (NewBlockFile && NewBlockFile->IsOpen())
{
ZEN_DEBUG("dropping incomplete cas block store file '{}'", NewBlockFile->GetPath());
m_TotalSize.fetch_sub(NewBlockFile->FileSize(), std::memory_order::relaxed);
@@ -754,10 +762,26 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
if (OldBlockFile)
{
ZEN_TRACE_CPU("BlockStore::ReclaimSpace::MoveBlock");
+
+ ZEN_INFO("Moving {} chunks from '{}' to new block", KeepMap.size(), GetBlockPath(m_BlocksBasePath, BlockIndex));
+
+ uint64_t OldBlockSize = OldBlockFile->FileSize();
std::vector<uint8_t> Chunk;
for (const size_t& ChunkIndex : KeepMap)
{
const BlockStoreLocation ChunkLocation = ChunkLocations[ChunkIndex];
+ if (ChunkLocation.Offset + ChunkLocation.Size > OldBlockSize)
+ {
+ ZEN_WARN(
+ "ReclaimSpace skipping chunk outside of block range in '{}', Chunk start {}, Chunk size {} in Block {}, Block "
+ "size {}",
+ m_BlocksBasePath,
+ ChunkLocation.Offset,
+ ChunkLocation.Size,
+ OldBlockFile->GetPath(),
+ OldBlockSize);
+ continue;
+ }
Chunk.resize(ChunkLocation.Size);
OldBlockFile->Read(Chunk.data(), ChunkLocation.Size, ChunkLocation.Offset);
@@ -767,6 +791,7 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
NewBlockFile = nullptr;
}
@@ -820,8 +845,8 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
ReadBlockLongestTimeUs = std::max(ElapsedUs, ReadBlockLongestTimeUs);
});
ZEN_ASSERT(m_ChunkBlocks[NextBlockIndex] == NewBlockFile);
+ ZEN_ASSERT_SLOW(!NewBlockFile->IsOpen());
m_ChunkBlocks.erase(NextBlockIndex);
- NewBlockFile->MarkAsDeleteOnClose();
return;
}
@@ -846,6 +871,7 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
Chunk.clear();
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
}
}
@@ -880,6 +906,7 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
}
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
NewBlockFile = nullptr;
}
@@ -1044,6 +1071,8 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
const CompactCallback& ChangeCallback,
const ClaimDiskReserveCallback& DiskReserveCallback)
{
+ ZEN_TRACE_CPU("BlockStore::CompactBlocks");
+
uint64_t DeletedSize = 0;
uint64_t MovedCount = 0;
uint64_t MovedSize = 0;
@@ -1069,7 +1098,6 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
auto NewBlockFileGuard = MakeGuard([&]() {
if (NewBlockFile)
{
- ZEN_DEBUG("Dropping incomplete cas block store file '{}'", NewBlockFile->GetPath());
{
RwLock::ExclusiveLockScope _l(m_InsertLock);
if (m_ChunkBlocks[NewBlockIndex] == NewBlockFile)
@@ -1077,7 +1105,11 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
m_ChunkBlocks.erase(NewBlockIndex);
}
}
- NewBlockFile->MarkAsDeleteOnClose();
+ if (NewBlockFile->IsOpen())
+ {
+ ZEN_DEBUG("Dropping incomplete cas block store file '{}'", NewBlockFile->GetPath());
+ NewBlockFile->MarkAsDeleteOnClose();
+ }
}
});
@@ -1100,6 +1132,7 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
CompactState.IterateBlocks([&](uint32_t BlockIndex,
const std::vector<size_t>& KeepChunkIndexes,
const std::vector<BlockStoreLocation>& ChunkLocations) -> bool {
+ ZEN_TRACE_CPU("BlockStore::CompactBlock");
Ref<BlockStoreFile> OldBlockFile;
{
RwLock::SharedLockScope _(m_InsertLock);
@@ -1125,6 +1158,8 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
}
ZEN_ASSERT(OldBlockFile);
+ ZEN_INFO("Moving {} chunks from '{}' to new block", KeepChunkIndexes.size(), GetBlockPath(m_BlocksBasePath, BlockIndex));
+
uint64_t OldBlockSize = OldBlockFile->FileSize();
std::vector<uint8_t> Chunk;
@@ -1151,6 +1186,7 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
{
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
MovedSize += NewBlockFile->FileSize();
NewBlockFile = nullptr;
@@ -1179,7 +1215,6 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
NewBlockFile = new BlockStoreFile(NewBlockPath);
m_ChunkBlocks[NextBlockIndex] = NewBlockFile;
}
- ZEN_ASSERT(NewBlockFile);
std::error_code Error;
DiskSpace Space = DiskSpaceInfo(m_BlocksBasePath, Error);
@@ -1191,7 +1226,7 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
ZEN_ASSERT(m_ChunkBlocks[NextBlockIndex] == NewBlockFile);
m_ChunkBlocks.erase(NextBlockIndex);
}
- NewBlockFile->MarkAsDeleteOnClose();
+ ZEN_ASSERT_SLOW(!NewBlockFile->IsOpen());
NewBlockFile = nullptr;
return false;
}
@@ -1210,7 +1245,7 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
ZEN_ASSERT(m_ChunkBlocks[NextBlockIndex] == NewBlockFile);
m_ChunkBlocks.erase(NextBlockIndex);
}
- NewBlockFile->MarkAsDeleteOnClose();
+ ZEN_ASSERT_SLOW(!NewBlockFile->IsOpen());
NewBlockFile = nullptr;
return false;
}
@@ -1251,6 +1286,7 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
MovedSize += NewBlockFile->FileSize();
NewBlockFile = nullptr;