diff options
| author | Dan Engelbrecht <[email protected]> | 2023-12-18 10:07:32 -0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-12-18 16:07:32 +0100 |
| commit | cc8b464751e243d80d54588bd2cec79d8009dc54 (patch) | |
| tree | d6c5a6cade5ca239190cb767c4b5f7a993efdc8f /src/zenstore/blockstore.cpp | |
| parent | Make sure we initialize the pattern of FileSink before it is added as a usabl... (diff) | |
| download | zen-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.cpp | 26 |
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; |