Skip to content

Commit 6199b75

Browse files
author
yawzhang
committed
[TEST] for repl dev ut
1 parent 5822372 commit 6199b75

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/lib/replication/repl_dev/raft_repl_dev.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,13 +1414,6 @@ void RaftReplDev::handle_commit(repl_req_ptr_t rreq, bool recovery) {
14141414
m_listener->on_commit(rreq->lsn(), rreq->header(), rreq->key(), {rreq->local_blkid()}, rreq);
14151415
}
14161416

1417-
if (!recovery) {
1418-
auto prev_lsn = m_commit_upto_lsn.exchange(rreq->lsn());
1419-
RD_DBG_ASSERT_GT(rreq->lsn(), prev_lsn,
1420-
"Out of order commit of lsns, it is not expected in RaftReplDev. cur_lsns={}, prev_lsns={}",
1421-
rreq->lsn(), prev_lsn);
1422-
}
1423-
14241417
// Remove the request from repl_key map only after the listener operation is completed.
14251418
// This prevents unnecessary block allocation in the following scenario:
14261419
// 1. The follower processes a commit for LSN 100 and remove rreq from rep_key map before listener commit
@@ -1431,6 +1424,13 @@ void RaftReplDev::handle_commit(repl_req_ptr_t rreq, bool recovery) {
14311424
m_repl_key_req_map.erase(rreq->rkey());
14321425
// Remove the request from lsn map.
14331426
m_state_machine->unlink_lsn_to_req(rreq->lsn(), rreq);
1427+
1428+
if (!recovery) {
1429+
auto prev_lsn = m_commit_upto_lsn.exchange(rreq->lsn());
1430+
RD_DBG_ASSERT_GT(rreq->lsn(), prev_lsn,
1431+
"Out of order commit of lsns, it is not expected in RaftReplDev. cur_lsns={}, prev_lsns={}",
1432+
rreq->lsn(), prev_lsn);
1433+
}
14341434
if (!rreq->is_proposer()) rreq->clear();
14351435
}
14361436

src/tests/test_common/raft_repl_test_base.hpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,19 @@ class RaftReplDevTestBase : public testing::Test {
614614
data_size == nullptr ? std::abs(std::lround(num_blks_gen(g_re))) * block_size : *data_size;
615615
this->generate_writes(size, block_size, db);
616616
});
617-
if (wait_for_commit) { g_helper->runner().execute().get(); }
617+
if (wait_for_commit) {
618+
g_helper->runner().execute().get();
619+
// wait for last_commit_lsn not changed, so all related rreqs have been removed from map.
620+
// this way to avoid rreqs reused in this case:
621+
// 1. follower committing rreq
622+
// 2. follower received a duplicated append log entries from leader, then get the rreq from map
623+
// 3. follower finished commit, clear rreq, then the append thread hold an empty rreq.
624+
repl_lsn_t current_commit_lsn = 0;
625+
while (current_commit_lsn < repl_dev->get_last_commit_lsn()) {
626+
current_commit_lsn = repl_dev->get_last_commit_lsn();
627+
std::this_thread::sleep_for(std::chrono::seconds{5});
628+
}
629+
}
618630
break;
619631
} else {
620632
LOGINFO("{} entries were written on the leader_uuid={} my_uuid={}", num_entries,

0 commit comments

Comments
 (0)