Skip to content

Commit

Permalink
Possible fix for refresh node lock problem
Browse files Browse the repository at this point in the history
  • Loading branch information
shosseinimotlagh committed Feb 21, 2024
1 parent 84f94ee commit fa5de4b
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 18 deletions.
2 changes: 1 addition & 1 deletion conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
74 changes: 57 additions & 17 deletions src/tests/btree_helpers/btree_test_helper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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";
Expand Down Expand Up @@ -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));
Expand All @@ -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);
Expand Down

0 comments on commit fa5de4b

Please sign in to comment.