From fa5de4ba13d30de740f9fe84355d1e619589f2a1 Mon Sep 17 00:00:00 2001 From: shosseinimotlagh Date: Tue, 20 Feb 2024 15:27:19 -0800 Subject: [PATCH] Possible fix for refresh node lock problem --- conanfile.py | 2 +- src/tests/btree_helpers/btree_test_helper.hpp | 74 ++++++++++++++----- 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/conanfile.py b/conanfile.py index 69cf3a1e9..369fcbbdb 100644 --- a/conanfile.py +++ b/conanfile.py @@ -5,7 +5,7 @@ class HomestoreConan(ConanFile): name = "homestore" - version = "5.1.5" + version = "5.1.6" homepage = "https://github.com/eBay/Homestore" description = "HomeStore Storage Engine" diff --git a/src/tests/btree_helpers/btree_test_helper.hpp b/src/tests/btree_helpers/btree_test_helper.hpp index 9c142ffe5..23e9c070e 100644 --- a/src/tests/btree_helpers/btree_test_helper.hpp +++ b/src/tests/btree_helpers/btree_test_helper.hpp @@ -92,9 +92,37 @@ struct BtreeTestHelper { for (std::size_t i = 0; i < n_fibers; ++i) { const auto start_range = i * chunk_size; const auto end_range = start_range + ((i == n_fibers - 1) ? last_chunk_size : chunk_size); - iomanager.run_on_forget(m_fibers[i], [this, start_range, end_range, &test_count]() { + auto fiber_id = i; + iomanager.run_on_forget(m_fibers[i], [this, start_range, end_range, &test_count, fiber_id]() { + double progress_interval = + (double)(end_range - start_range) / 20; // 5% of the total number of iterations + double progress_thresh = progress_interval; // threshold for progress interval + double elapsed_time, progress_percent, last_progress_time = 0; + auto m_start_time = Clock::now(); + for (uint32_t i = start_range; i < end_range; i++) { put(i, btree_put_type::INSERT); + if (fiber_id == 0) { + elapsed_time = get_elapsed_time_sec(m_start_time); + progress_percent = (double)(i - start_range) / (end_range - start_range) * 100; + + // check progress every 5% of the total number of iterations or every 30 seconds + bool print_time = false; + if (i >= progress_thresh) { + progress_thresh += progress_interval; + print_time = true; + } + if (elapsed_time - last_progress_time > 30) { + last_progress_time = elapsed_time; + print_time = true; + } + if (print_time) { + LOGINFO( + "Progress: iterations completed ({:.2f}%)- Elapsed time: {:.0f} seconds of total " + "{} - total entries: {}", + progress_percent, elapsed_time, m_run_time, m_shadow_map.size()); + } + } } { std::unique_lock lg(m_test_done_mtx); @@ -127,11 +155,14 @@ struct BtreeTestHelper { K start_key = K{start_k}; K end_key = K{end_k}; auto const nkeys = end_k - start_k + 1; - - auto preq = BtreeRangePutRequest< K >{BtreeKeyRange< K >{start_key, true, end_key, true}, - update ? btree_put_type::UPDATE : btree_put_type::UPSERT, &value}; - preq.enable_route_tracing(); - ASSERT_EQ(m_bt->put(preq), btree_status_t::success) << "range_put failed for " << start_k << "-" << end_k; + auto ret = btree_status_t::success; + do { + auto preq = BtreeRangePutRequest< K >{BtreeKeyRange< K >{start_key, true, end_key, true}, + update ? btree_put_type::UPDATE : btree_put_type::UPSERT, &value}; + preq.enable_route_tracing(); + ret = m_bt->put(preq); + } while (ret == btree_status_t::cp_mismatch); + ASSERT_EQ(ret, btree_status_t::success) << "range_put failed for " << start_k << "-" << end_k; if (update) { m_shadow_map.range_update(start_key, nkeys, value); @@ -157,10 +188,13 @@ struct BtreeTestHelper { void remove_one(uint32_t k) { auto existing_v = std::make_unique< V >(); auto pk = std::make_unique< K >(k); - - auto rreq = BtreeSingleRemoveRequest{pk.get(), existing_v.get()}; - rreq.enable_route_tracing(); - bool removed = (m_bt->remove(rreq) == btree_status_t::success); + auto ret = btree_status_t::success; + do { + auto rreq = BtreeSingleRemoveRequest{pk.get(), existing_v.get()}; + rreq.enable_route_tracing(); + ret = m_bt->remove(rreq); + } while (ret == btree_status_t::cp_mismatch); + bool removed = (ret == btree_status_t::success); ASSERT_EQ(removed, m_shadow_map.exists(*pk)) << "Removal of key " << pk->key() << " status doesn't match with shadow"; @@ -338,9 +372,13 @@ struct BtreeTestHelper { void do_put(uint64_t k, btree_put_type put_type, V const& value) { auto existing_v = std::make_unique< V >(); K key = K{k}; - auto sreq = BtreeSinglePutRequest{&key, &value, put_type, existing_v.get()}; - sreq.enable_route_tracing(); - bool done = (m_bt->put(sreq) == btree_status_t::success); + auto ret = btree_status_t::success; + do { + auto sreq = BtreeSinglePutRequest{&key, &value, put_type, existing_v.get()}; + sreq.enable_route_tracing(); + ret = m_bt->put(sreq); + } while (ret == btree_status_t::cp_mismatch); + bool done = (ret == btree_status_t::success); if (put_type == btree_put_type::INSERT) { ASSERT_EQ(done, !m_shadow_map.exists(key)); @@ -354,10 +392,12 @@ struct BtreeTestHelper { void do_range_remove(uint64_t start_k, uint64_t end_k, bool all_existing) { K start_key = K{start_k}; K end_key = K{end_k}; - - auto rreq = BtreeRangeRemoveRequest< K >{BtreeKeyRange< K >{start_key, true, end_key, true}}; - rreq.enable_route_tracing(); - auto const ret = m_bt->remove(rreq); + auto ret = btree_status_t::success; + do { + auto rreq = BtreeRangeRemoveRequest< K >{BtreeKeyRange< K >{start_key, true, end_key, true}}; + rreq.enable_route_tracing(); + ret = m_bt->remove(rreq); + } while (ret == btree_status_t::cp_mismatch); if (all_existing) { m_shadow_map.range_erase(start_key, end_key);