From 158a6b7c3d37945bab217f265adfa707f21ff085 Mon Sep 17 00:00:00 2001 From: Wojtek Date: Sat, 15 Nov 2025 20:25:07 +0100 Subject: [PATCH] Workspace::close performance analysis and improvements --- src/dbzero/bindings/python/PyAPI.cpp | 2 +- src/dbzero/bindings/python/PyToolkit.hpp | 1 + src/dbzero/bindings/python/PyTypeManager.cpp | 9 +++++++-- src/dbzero/bindings/python/PyTypeManager.hpp | 10 +++++++++- src/dbzero/bindings/python/PyWorkspace.cpp | 10 +++++++--- src/dbzero/bindings/python/PyWorkspace.hpp | 3 ++- src/dbzero/core/dram/DRAM_Prefix.cpp | 2 +- src/dbzero/core/dram/DRAM_Prefix.hpp | 2 +- src/dbzero/core/memory/Memspace.cpp | 2 +- src/dbzero/core/memory/Prefix.hpp | 2 +- src/dbzero/core/memory/PrefixImpl.cpp | 9 +++++++-- src/dbzero/core/memory/PrefixImpl.hpp | 2 +- src/dbzero/core/memory/PrefixViewImpl.cpp | 2 +- src/dbzero/core/memory/PrefixViewImpl.hpp | 2 +- tests/utils/PrefixProxy.hpp | 2 +- 15 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/dbzero/bindings/python/PyAPI.cpp b/src/dbzero/bindings/python/PyAPI.cpp index d5b5896d..a6b419fa 100644 --- a/src/dbzero/bindings/python/PyAPI.cpp +++ b/src/dbzero/bindings/python/PyAPI.cpp @@ -392,7 +392,7 @@ namespace db0::python if (prefix_name) { PyToolkit::getPyWorkspace().getWorkspace().close(db0::PrefixName(prefix_name)); } else { - PyToolkit::getPyWorkspace().close(); + PyToolkit::getPyWorkspace().close(); } Py_RETURN_NONE; } diff --git a/src/dbzero/bindings/python/PyToolkit.hpp b/src/dbzero/bindings/python/PyToolkit.hpp index 1db6e52b..da54588d 100644 --- a/src/dbzero/bindings/python/PyToolkit.hpp +++ b/src/dbzero/bindings/python/PyToolkit.hpp @@ -20,6 +20,7 @@ namespace db0 { class Fixture; + class ProcessTimer; } diff --git a/src/dbzero/bindings/python/PyTypeManager.cpp b/src/dbzero/bindings/python/PyTypeManager.cpp index 6300378a..7bc9ec66 100644 --- a/src/dbzero/bindings/python/PyTypeManager.cpp +++ b/src/dbzero/bindings/python/PyTypeManager.cpp @@ -32,6 +32,7 @@ #include #include #include +#include namespace db0::python @@ -485,8 +486,12 @@ namespace db0::python } } - void PyTypeManager::close() - { + void PyTypeManager::close(db0::ProcessTimer *timer_ptr) + { + std::unique_ptr timer; + if (timer_ptr) { + timer = std::make_unique("PyTypeManager::close", *timer_ptr); + } // close Enum's but don't remove from cache // this is to allow future creation / retrieval of dbzero enums while keeping python objects alive for (auto &item : m_enum_cache) { diff --git a/src/dbzero/bindings/python/PyTypeManager.hpp b/src/dbzero/bindings/python/PyTypeManager.hpp index 7d7d6cbd..72733eb7 100644 --- a/src/dbzero/bindings/python/PyTypeManager.hpp +++ b/src/dbzero/bindings/python/PyTypeManager.hpp @@ -11,6 +11,14 @@ #include #include +namespace db0 + +{ + + class ProcessTimer; + +} + namespace db0::object_model { class Object; @@ -185,7 +193,7 @@ namespace db0::python // Decode either of: None, False or True from a lo-fi code ObjectSharedPtr getLangConstant(unsigned int) const; - void close(); + void close(db0::ProcessTimer *timer_ptr = nullptr); private: static std::vector > m_string_pool; diff --git a/src/dbzero/bindings/python/PyWorkspace.cpp b/src/dbzero/bindings/python/PyWorkspace.cpp index ac3e0b0c..603e62f2 100644 --- a/src/dbzero/bindings/python/PyWorkspace.cpp +++ b/src/dbzero/bindings/python/PyWorkspace.cpp @@ -91,14 +91,18 @@ namespace db0::python return m_workspace; } - void PyWorkspace::close() + void PyWorkspace::close(db0::ProcessTimer *timer_ptr) { + std::unique_ptr timer; + if (timer_ptr) { + timer = std::make_unique("PyWorkspace::close", *timer_ptr); + } if (m_workspace) { - getWorkspace().close(); + getWorkspace().close(false, timer.get()); // NOTE: must unlock API because workspace destroy may trigger db0 object deletions m_workspace = nullptr; } - PyToolkit::getTypeManager().close(); + PyToolkit::getTypeManager().close(timer.get()); m_config = nullptr; m_workspace = nullptr; } diff --git a/src/dbzero/bindings/python/PyWorkspace.hpp b/src/dbzero/bindings/python/PyWorkspace.hpp index 76c1a809..b0760d27 100644 --- a/src/dbzero/bindings/python/PyWorkspace.hpp +++ b/src/dbzero/bindings/python/PyWorkspace.hpp @@ -16,6 +16,7 @@ namespace db0 { class Config; class Fixture; class Memspace; + class ProcessTimer; } @@ -70,7 +71,7 @@ namespace db0::python std::shared_ptr getWorkspaceSharedPtr() const; - void close(); + void close(ProcessTimer *timer = nullptr); bool refresh(); diff --git a/src/dbzero/core/dram/DRAM_Prefix.cpp b/src/dbzero/core/dram/DRAM_Prefix.cpp index 88c78157..8f580a7b 100644 --- a/src/dbzero/core/dram/DRAM_Prefix.cpp +++ b/src/dbzero/core/dram/DRAM_Prefix.cpp @@ -117,7 +117,7 @@ namespace db0 return m_pages.empty(); } - void DRAM_Prefix::close() + void DRAM_Prefix::close(ProcessTimer *) { for (auto &page: m_pages) { page.second.resetDirtyFlag(); diff --git a/src/dbzero/core/dram/DRAM_Prefix.hpp b/src/dbzero/core/dram/DRAM_Prefix.hpp index 3106c93d..8be8df6f 100644 --- a/src/dbzero/core/dram/DRAM_Prefix.hpp +++ b/src/dbzero/core/dram/DRAM_Prefix.hpp @@ -34,7 +34,7 @@ namespace db0 std::uint64_t commit(ProcessTimer * = nullptr) override; - void close() override; + void close(ProcessTimer *timer_ptr = nullptr) override; std::size_t getDirtySize() const override; diff --git a/src/dbzero/core/memory/Memspace.cpp b/src/dbzero/core/memory/Memspace.cpp index bc9fd1de..f3722554 100644 --- a/src/dbzero/core/memory/Memspace.cpp +++ b/src/dbzero/core/memory/Memspace.cpp @@ -78,7 +78,7 @@ namespace db0 getAllocatorForUpdate().close(); m_allocator_ptr = nullptr; m_allocator = nullptr; - m_prefix->close(); + m_prefix->close(timer.get()); m_prefix = nullptr; } diff --git a/src/dbzero/core/memory/Prefix.hpp b/src/dbzero/core/memory/Prefix.hpp index 7c12d443..4c515843 100644 --- a/src/dbzero/core/memory/Prefix.hpp +++ b/src/dbzero/core/memory/Prefix.hpp @@ -55,7 +55,7 @@ namespace db0 */ virtual std::uint64_t commit(ProcessTimer * = nullptr) = 0; - virtual void close() = 0; + virtual void close(ProcessTimer *timer_ptr = nullptr) = 0; /** * Get last update timestamp diff --git a/src/dbzero/core/memory/PrefixImpl.cpp b/src/dbzero/core/memory/PrefixImpl.cpp index 6c4af42b..33aa7901 100644 --- a/src/dbzero/core/memory/PrefixImpl.cpp +++ b/src/dbzero/core/memory/PrefixImpl.cpp @@ -307,9 +307,14 @@ namespace db0 return m_head_state_num; } - void PrefixImpl::close() + void PrefixImpl::close(ProcessTimer *timer_ptr) { - m_cache.release(); + std::unique_ptr timer; + if (timer_ptr) { + timer = std::make_unique("Prefix::close", timer_ptr); + } + // FIXME: log + // m_cache.release(); m_storage_ptr->close(); } diff --git a/src/dbzero/core/memory/PrefixImpl.hpp b/src/dbzero/core/memory/PrefixImpl.hpp index b750402b..ac7ee9bf 100644 --- a/src/dbzero/core/memory/PrefixImpl.hpp +++ b/src/dbzero/core/memory/PrefixImpl.hpp @@ -63,7 +63,7 @@ namespace db0 * this method should be called before closing the prefix to clean up used resources * Finally close the corresponding storage. */ - void close() override; + void close(ProcessTimer *timer_ptr = nullptr) override; bool beginRefresh() override; diff --git a/src/dbzero/core/memory/PrefixViewImpl.cpp b/src/dbzero/core/memory/PrefixViewImpl.cpp index cba16b59..f284c5b7 100644 --- a/src/dbzero/core/memory/PrefixViewImpl.cpp +++ b/src/dbzero/core/memory/PrefixViewImpl.cpp @@ -74,7 +74,7 @@ namespace db0 << "PrefixViewImpl::getLastUpdated: cannot get last updated timestamp from snapshot" << THROWF_END; } - void PrefixViewImpl::close() { + void PrefixViewImpl::close(ProcessTimer *) { // close does nothing } diff --git a/src/dbzero/core/memory/PrefixViewImpl.hpp b/src/dbzero/core/memory/PrefixViewImpl.hpp index c7576af3..a71e5606 100644 --- a/src/dbzero/core/memory/PrefixViewImpl.hpp +++ b/src/dbzero/core/memory/PrefixViewImpl.hpp @@ -32,7 +32,7 @@ namespace db0 std::uint64_t getLastUpdated() const override; - void close() override; + void close(ProcessTimer *timer_ptr = nullptr) override; AccessType getAccessType() const override; diff --git a/tests/utils/PrefixProxy.hpp b/tests/utils/PrefixProxy.hpp index 5b29608e..fd8636a9 100644 --- a/tests/utils/PrefixProxy.hpp +++ b/tests/utils/PrefixProxy.hpp @@ -39,7 +39,7 @@ namespace db0::tests return m_prefix->commit(timer); } - void close() override { + void close(ProcessTimer * = nullptr) override { m_prefix->close(); }