diff --git a/test/raft/replication_test.cc b/test/raft/replication_test.cc index 3a8a981140..4c969c54f6 100644 --- a/test/raft/replication_test.cc +++ b/test/raft/replication_test.cc @@ -748,6 +748,11 @@ future<> raft_cluster::elect_new_leader(size_t new_leader) { if (new_leader != _leader) { do { + if ((*_connected)(to_raft_id(_leader), to_raft_id(new_leader))) { + co_await wait_log(new_leader); + } + + pause_tickers(); // Leader could be already partially disconnected, save current connectivity state struct connected prev_disconnected = *_connected; // Disconnect current leader from everyone @@ -761,7 +766,9 @@ future<> raft_cluster::elect_new_leader(size_t new_leader) { _connected->connect(to_raft_id(_leader)); // Disconnect old leader from all nodes except new leader _connected->disconnect(to_raft_id(_leader), to_raft_id(new_leader)); + restart_tickers(); co_await _servers[new_leader].server->wait_election_done(); + // Restore connections to the original setting *_connected = prev_disconnected; } while (!_servers[new_leader].server->is_leader()); @@ -945,10 +952,7 @@ future<> run_test(test_case test, bool prevote, bool packet_drops) { co_await rafts.add_entries(n); } else if (std::holds_alternative(update)) { unsigned next_leader = std::get(update).id; - co_await rafts.wait_log(next_leader); - rafts.pause_tickers(); co_await rafts.elect_new_leader(next_leader); - rafts.restart_tickers(); } else if (std::holds_alternative(update)) { co_await rafts.partition(std::get(update)); } else if (std::holds_alternative(update)) { @@ -1344,9 +1348,7 @@ SEASTAR_TEST_CASE(rpc_leader_election) { // Elect 2nd node a leader constexpr size_t new_leader = 1; - rafts.pause_tickers(); co_await rafts.elect_new_leader(new_leader); - rafts.restart_tickers(); // Check that no attempts to update RPC were made. for (size_t s = 0; s < rafts.size(); ++s) { @@ -1446,9 +1448,7 @@ SEASTAR_TEST_CASE(rpc_configuration_truncate_restore_from_snp) { BOOST_CHECK(rafts[0].rpc->known_peers() == extended_conf); // Elect B as leader - rafts.pause_tickers(); co_await rafts.elect_new_leader(1); - rafts.restart_tickers(); // Heal network partition. connected->connect_all(); @@ -1550,9 +1550,7 @@ SEASTAR_TEST_CASE(rpc_configuration_truncate_restore_from_log) { BOOST_CHECK(rafts[0].rpc->known_peers() == committed_conf); // Elect B as leader - rafts.pause_tickers(); co_await rafts.elect_new_leader(1); - rafts.restart_tickers(); // Heal network partition. connected->connect_all(); @@ -1575,9 +1573,7 @@ SEASTAR_TEST_CASE(rpc_configuration_truncate_restore_from_log) { // // Elect A leader again. - rafts.pause_tickers(); co_await rafts.elect_new_leader(initial_leader); - rafts.restart_tickers(); co_await rafts.wait_log_all(); @@ -1609,9 +1605,7 @@ SEASTAR_TEST_CASE(rpc_configuration_truncate_restore_from_log) { BOOST_CHECK(rafts[0].rpc->known_peers() == all_nodes); // Elect B as leader - rafts.pause_tickers(); co_await rafts.elect_new_leader(1); - rafts.restart_tickers(); // Heal network partition. connected->connect_all();