From ed8a9db2ae6d2a8412c30385fd786af0fece69c6 Mon Sep 17 00:00:00 2001 From: Wojtek Date: Fri, 21 Nov 2025 20:17:07 +0100 Subject: [PATCH 1/2] flush fixes --- dbzero/dbzero/dbzero.py | 2 +- src/dbzero/core/storage/BDevStorage.cpp | 9 +++++--- src/dbzero/core/storage/BlockIOStream.cpp | 2 +- src/dbzero/core/storage/BlockIOStream.hpp | 14 +++++++----- src/dbzero/core/storage/ChangeLogIOStream.cpp | 4 ++-- src/dbzero/object_model/index/Index.cpp | 22 ++++++++++++------- 6 files changed, 33 insertions(+), 20 deletions(-) diff --git a/dbzero/dbzero/dbzero.py b/dbzero/dbzero/dbzero.py index 21899e3d..c9e4f4dc 100644 --- a/dbzero/dbzero/dbzero.py +++ b/dbzero/dbzero/dbzero.py @@ -10,7 +10,7 @@ def load_dynamic(name, path): def __bootstrap__(): global __bootstrap__, __loader__, __file__ - paths = [os.path.join(os.path.split(__file__)[0]), "/src/dev/build/debug", "/usr/local/lib/python3/dist-packages/dbzero/"] + paths = [os.path.join(os.path.split(__file__)[0]), "/src/dev/build/release", "/usr/local/lib/python3/dist-packages/dbzero/"] __file__ = None for path in paths: if os.path.isdir(path): diff --git a/src/dbzero/core/storage/BDevStorage.cpp b/src/dbzero/core/storage/BDevStorage.cpp index d58ab5af..a2a7c01b 100644 --- a/src/dbzero/core/storage/BDevStorage.cpp +++ b/src/dbzero/core/storage/BDevStorage.cpp @@ -332,11 +332,14 @@ namespace db0 m_sparse_pair.extractChangeLog(m_dp_changelog_io); m_dram_io.flushUpdates(state_num, m_dram_changelog_io); m_dp_changelog_io.flush(); - // flush changelog AFTER all updates from dram_io have been flushed - m_dram_changelog_io.flush(); m_page_io.flush(); // NOTE: fsync has stronger guarantees than flush in a multi-process environments m_file.fsync(); + // flush changelog AFTER all updates from all other streams have been flushed + m_dram_changelog_io.flush(); + // the last fsync finalizes the commit + m_file.fsync(); + // commit to collect future updates correctly m_sparse_pair.commit(); return true; @@ -458,7 +461,7 @@ namespace db0 { assert(m_access_type == AccessType::READ_ONLY); std::uint64_t result = 0; - // continue refreshing until all updates retrieved to guarantee a consistent state + // continue refreshing until all updates are retrieved to guarantee a consistent state do { // safe stream positions for rollback on file read failure auto dram_changelog_io_pos = m_dram_changelog_io.getStreamPos(); diff --git a/src/dbzero/core/storage/BlockIOStream.cpp b/src/dbzero/core/storage/BlockIOStream.cpp index 418cb358..448292d1 100644 --- a/src/dbzero/core/storage/BlockIOStream.cpp +++ b/src/dbzero/core/storage/BlockIOStream.cpp @@ -457,7 +457,7 @@ namespace db0 bool BlockIOStream::eos() const { return m_eos; } - + bool BlockIOStream::readBlock(std::uint64_t address, void *buffer) { if (m_checksums_enabled) { diff --git a/src/dbzero/core/storage/BlockIOStream.hpp b/src/dbzero/core/storage/BlockIOStream.hpp index b316d98e..6729c5ea 100644 --- a/src/dbzero/core/storage/BlockIOStream.hpp +++ b/src/dbzero/core/storage/BlockIOStream.hpp @@ -13,7 +13,6 @@ namespace db0 { -DB0_PACKED_BEGIN /** * Calculate a buffer's checksum (must be aligned to 8 bytes) @@ -21,6 +20,7 @@ DB0_PACKED_BEGIN std::uint64_t checksum(const void *begin, const void *end); // block level header +DB0_PACKED_BEGIN struct DB0_PACKED_ATTR o_block_io_block_header: public o_fixed { std::uint64_t m_next_block_address = 0; @@ -34,8 +34,10 @@ DB0_PACKED_BEGIN m_next_block_address = address; } }; - +DB0_PACKED_END + // block level header with a checksum +DB0_PACKED_BEGIN struct DB0_PACKED_ATTR o_block_io_cs_block_header: public o_fixed_ext { @@ -47,9 +49,11 @@ DB0_PACKED_BEGIN // calculate checksum of this object excluding the checksum field return checksum((const char*)this, (const char*)this + sizeOf() - sizeof(m_block_checksum)); } - }; - + }; +DB0_PACKED_END + // chunk level header +DB0_PACKED_BEGIN struct DB0_PACKED_ATTR o_block_io_chunk_header: public o_fixed { std::uint32_t m_chunk_size = 0; @@ -64,6 +68,7 @@ DB0_PACKED_BEGIN return m_chunk_size != 0; } }; +DB0_PACKED_END /** * Stream of blocks embeddable into the .db0 file @@ -282,5 +287,4 @@ DB0_PACKED_BEGIN std::uint64_t nextAddress() const; }; -DB0_PACKED_END } diff --git a/src/dbzero/core/storage/ChangeLogIOStream.cpp b/src/dbzero/core/storage/ChangeLogIOStream.cpp index 2d72cd4c..3f8475ef 100644 --- a/src/dbzero/core/storage/ChangeLogIOStream.cpp +++ b/src/dbzero/core/storage/ChangeLogIOStream.cpp @@ -7,11 +7,11 @@ namespace db0 ChangeLogIOStream::ChangeLogIOStream(CFile &m_file, std::uint64_t begin, std::uint32_t block_size, std::function tail_function, AccessType access_type) - // enable checksums + // enable checksums by default : BlockIOStream(m_file, begin, block_size, tail_function, access_type, true) { } - + ChangeLogIOStream::ChangeLogIOStream(BlockIOStream &&io_stream) : BlockIOStream(std::move(io_stream)) { diff --git a/src/dbzero/object_model/index/Index.cpp b/src/dbzero/object_model/index/Index.cpp index 2dd16bbd..4ed9667b 100644 --- a/src/dbzero/object_model/index/Index.cpp +++ b/src/dbzero/object_model/index/Index.cpp @@ -66,14 +66,20 @@ namespace db0::object_model Index::~Index() { - // in case of index we need to unregister first because otherwise - // it may trigger discard of unflushed data (which has to be performed before destruction of 'builder') - unregister(); - - // after unregister object might still have unflushed data, we need to flush them - if (hasInstance() && isDirty()) { - _flush(); - } + try { + // in case of index we need to unregister first because otherwise + // it may trigger discard of unflushed data (which has to be performed before destruction of 'builder') + unregister(); + + // after unregister object might still have unflushed data, we need to flush them + if (hasInstance() && isDirty()) { + _flush(); + } + } catch (...) { + // Suppress all exceptions in destructor to avoid std::terminate() + // Exceptions during destruction indicate a serious issue but we cannot + // safely propagate them from a destructor + } } Index::Builder::Builder(Index &index) From b55d10ba1873e957f3f3bcd67d57509b94abfcf3 Mon Sep 17 00:00:00 2001 From: Wojtek Date: Fri, 21 Nov 2025 22:10:36 +0100 Subject: [PATCH 2/2] sync --- dbzero/dbzero/dbzero.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbzero/dbzero/dbzero.py b/dbzero/dbzero/dbzero.py index 21899e3d..c9e4f4dc 100644 --- a/dbzero/dbzero/dbzero.py +++ b/dbzero/dbzero/dbzero.py @@ -10,7 +10,7 @@ def load_dynamic(name, path): def __bootstrap__(): global __bootstrap__, __loader__, __file__ - paths = [os.path.join(os.path.split(__file__)[0]), "/src/dev/build/debug", "/usr/local/lib/python3/dist-packages/dbzero/"] + paths = [os.path.join(os.path.split(__file__)[0]), "/src/dev/build/release", "/usr/local/lib/python3/dist-packages/dbzero/"] __file__ = None for path in paths: if os.path.isdir(path):