aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/blockstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-12-18 10:07:32 -0500
committerGitHub <[email protected]>2023-12-18 16:07:32 +0100
commitcc8b464751e243d80d54588bd2cec79d8009dc54 (patch)
treed6c5a6cade5ca239190cb767c4b5f7a993efdc8f /src/zenstore/blockstore.cpp
parentMake sure we initialize the pattern of FileSink before it is added as a usabl... (diff)
downloadzen-cc8b464751e243d80d54588bd2cec79d8009dc54.tar.xz
zen-cc8b464751e243d80d54588bd2cec79d8009dc54.zip
Fix crash bug when trying to inspect non-open block file in GC (#614)
Diffstat (limited to 'src/zenstore/blockstore.cpp')
-rw-r--r--src/zenstore/blockstore.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/zenstore/blockstore.cpp b/src/zenstore/blockstore.cpp
index 7a09d349a..73a8ad538 100644
--- a/src/zenstore/blockstore.cpp
+++ b/src/zenstore/blockstore.cpp
@@ -150,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;
@@ -669,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);
@@ -786,6 +791,7 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
NewBlockFile = nullptr;
}
@@ -839,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;
}
@@ -865,6 +871,7 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
Chunk.clear();
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
}
}
@@ -899,6 +906,7 @@ BlockStore::ReclaimSpace(const ReclaimSnapshotState& Snapshot,
}
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
NewBlockFile = nullptr;
}
@@ -1090,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)
@@ -1098,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();
+ }
}
});
@@ -1175,6 +1186,7 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
{
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
MovedSize += NewBlockFile->FileSize();
NewBlockFile = nullptr;
@@ -1203,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);
@@ -1215,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;
}
@@ -1234,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;
}
@@ -1275,6 +1286,7 @@ BlockStore::CompactBlocks(const BlockStoreCompactState& CompactState,
if (NewBlockFile)
{
+ ZEN_ASSERT_SLOW(NewBlockFile->IsOpen());
NewBlockFile->Flush();
MovedSize += NewBlockFile->FileSize();
NewBlockFile = nullptr;