File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -343,6 +343,9 @@ bool CLASS::pop_candidate() NOEXCEPT
343343 // ========================================================================
344344 const auto scope = store_.get_transactor ();
345345
346+ // Candidate pop implies reorg or disorg, which implies future duplicates.
347+ store_.set_dirty ();
348+
346349 // /////////////////////////////////////////////////////////////////////////
347350 std::unique_lock interlock{ candidate_reorganization_mutex_ };
348351 return store_.candidate .truncate (top);
Original file line number Diff line number Diff line change 1919#ifndef LIBBITCOIN_DATABASE_STORE_IPP
2020#define LIBBITCOIN_DATABASE_STORE_IPP
2121
22+ #include < atomic>
2223#include < chrono>
2324#include < unordered_map>
2425#include < bitcoin/database/boost.hpp>
@@ -561,7 +562,7 @@ code CLASS::reload(const event_handler& handler) NOEXCEPT
561562 {
562563 handler (event_t ::load_file, table);
563564 ec = storage.reload ();
564- this ->dirty_ = true ;
565+ this ->dirty_ . store ( true , std::memory_order_relaxed) ;
565566 }
566567 }
567568 };
@@ -774,7 +775,8 @@ code CLASS::open_load(const event_handler& handler) NOEXCEPT
774775 load (ec, filter_tx_body_, table_t ::filter_tx_body);
775776
776777 // create, open, and restore each invoke open_load.
777- dirty_ = header_body_.size () > schema::header::minrow;
778+ const auto dirty = header_body_.size () > schema::header::minrow;
779+ dirty_.store (dirty, std::memory_order_relaxed);
778780 return ec;
779781}
780782
@@ -1164,7 +1166,13 @@ const typename CLASS::transactor CLASS::get_transactor() NOEXCEPT
11641166TEMPLATE
11651167bool CLASS::is_dirty () const NOEXCEPT
11661168{
1167- return dirty_;
1169+ return dirty_.load (std::memory_order_relaxed);
1170+ }
1171+
1172+ TEMPLATE
1173+ void CLASS::set_dirty () NOEXCEPT
1174+ {
1175+ return dirty_.store (true , std::memory_order_relaxed);
11681176}
11691177
11701178TEMPLATE
Original file line number Diff line number Diff line change 1919#ifndef LIBBITCOIN_DATABASE_STORE_HPP
2020#define LIBBITCOIN_DATABASE_STORE_HPP
2121
22+ #include < atomic>
2223#include < filesystem>
2324#include < shared_mutex>
2425#include < unordered_map>
@@ -95,6 +96,7 @@ class store
9596
9697 // / Determine if the store is non-empty/initialized.
9798 bool is_dirty () const NOEXCEPT;
99+ void set_dirty () NOEXCEPT;
98100
99101 // / Get first fault code or error::success.
100102 code get_fault () const NOEXCEPT;
@@ -235,7 +237,9 @@ class store
235237 flush_lock flush_lock_;
236238 interprocess_lock process_lock_;
237239 std::shared_timed_mutex transactor_mutex_{};
238- bool dirty_{ true };
240+
241+ // This is thread safe.
242+ std::atomic_bool dirty_{ true };
239243
240244private:
241245 using path = std::filesystem::path;
Original file line number Diff line number Diff line change @@ -52,7 +52,7 @@ BOOST_AUTO_TEST_CASE(store__is_dirty__uninitialized__true)
5252 BOOST_REQUIRE (instance.is_dirty ());
5353}
5454
55- BOOST_AUTO_TEST_CASE (store__is_dirty__initialized__true )
55+ BOOST_AUTO_TEST_CASE (store__is_dirty__initialized___false )
5656{
5757 settings configuration{};
5858 configuration.path = TEST_DIRECTORY;
@@ -64,6 +64,20 @@ BOOST_AUTO_TEST_CASE(store__is_dirty__initialized__true)
6464 BOOST_REQUIRE (!instance.close (events));
6565}
6666
67+ BOOST_AUTO_TEST_CASE (store__set_dirty__initialized__is_dirty)
68+ {
69+ settings configuration{};
70+ configuration.path = TEST_DIRECTORY;
71+ store<map> instance{ configuration };
72+ query<store<map>> query_{ instance };
73+ BOOST_REQUIRE (!instance.create (events));
74+ BOOST_REQUIRE (query_.initialize (test::genesis));
75+ BOOST_REQUIRE (!instance.is_dirty ());
76+ instance.set_dirty ();
77+ BOOST_REQUIRE (instance.is_dirty ());
78+ BOOST_REQUIRE (!instance.close (events));
79+ }
80+
6781BOOST_AUTO_TEST_CASE (store__is_dirty__open__false)
6882{
6983 settings configuration{};
You can’t perform that action at this time.
0 commit comments