From 0faf59b6634a064cba10541149b8cd42af6e12c6 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Fri, 1 Jul 2022 20:43:35 -0500 Subject: [PATCH] GH-590 Fix race condition on shutdown --- .../include/eosio/trace_api/store_provider.hpp | 4 ++-- plugins/trace_api_plugin/store_provider.cpp | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/plugins/trace_api_plugin/include/eosio/trace_api/store_provider.hpp b/plugins/trace_api_plugin/include/eosio/trace_api/store_provider.hpp index 1acf288b15..adfbac6892 100644 --- a/plugins/trace_api_plugin/include/eosio/trace_api/store_provider.hpp +++ b/plugins/trace_api_plugin/include/eosio/trace_api/store_provider.hpp @@ -251,11 +251,11 @@ namespace eosio::trace_api { std::optional _last_compressed_slice; const size_t _compression_seek_point_stride; - std::atomic _best_known_lib{0}; std::mutex _maintenance_mtx; std::condition_variable _maintenance_condition; std::thread _maintenance_thread; - std::atomic_bool _maintenance_shutdown{false}; + bool _maintenance_shutdown{false}; + uint32_t _best_known_lib{0}; }; /** diff --git a/plugins/trace_api_plugin/store_provider.cpp b/plugins/trace_api_plugin/store_provider.cpp index 7dfc4efc41..f87f79b006 100644 --- a/plugins/trace_api_plugin/store_provider.cpp +++ b/plugins/trace_api_plugin/store_provider.cpp @@ -289,7 +289,10 @@ namespace eosio::trace_api { } void slice_directory::set_lib(uint32_t lib) { - _best_known_lib = lib; + { + std::scoped_lock lock(_maintenance_mtx); + _best_known_lib = lib; + } _maintenance_condition.notify_one(); } @@ -306,6 +309,7 @@ namespace eosio::trace_api { uint32_t best_known_lib = _best_known_lib; bool shutdown = _maintenance_shutdown; + lock.unlock(); log(std::string("Waking up to handle lib: ") + std::to_string(best_known_lib)); @@ -324,7 +328,10 @@ namespace eosio::trace_api { } void slice_directory::stop_maintenance_thread() { - _maintenance_shutdown = true; + { + std::scoped_lock lock(_maintenance_mtx); + _maintenance_shutdown = true; + } _maintenance_condition.notify_one(); _maintenance_thread.join(); }