@@ -770,15 +770,15 @@ TEST_F_CORO(raft_fixture, leadership_transfer_delay) {
770
770
auto leader_id = get_leader ().value ();
771
771
auto & leader_node = node (leader_id);
772
772
auto current_term = leader_node.raft ()->term ();
773
+ clock_t ::time_point start = clock_t::now ();
773
774
auto r = co_await leader_node.raft ()->transfer_leadership (
774
775
transfer_leadership_request{.group = leader_node.raft ()->group ()});
775
776
ASSERT_TRUE_CORO (r.success );
776
777
// here we wait for all the replicas to notify about the leadership changes,
777
- // each replica will notify two times, one when there is no leader, second
778
- // time when the leader is elected. We have 4 replicas so in total we expect
779
- // 8 notifications to be fired.
778
+ // each replica will notify one time only when the leader is elected. We
779
+ // have 4 replicas so in total we expect 4 notifications to be fired.
780
780
co_await tests::cooperative_spin_wait_with_timeout (
781
- 10s, [&] { return events.size () >= 8 ; });
781
+ 10s, [&] { return events.size () >= 4 ; });
782
782
783
783
// calculate the time needed to transfer leadership, in our case it is the
784
784
// time between first notification reporting no leader and first reporting
@@ -789,8 +789,7 @@ TEST_F_CORO(raft_fixture, leadership_transfer_delay) {
789
789
&& ev.status .term > current_term;
790
790
});
791
791
792
- auto transfer_time = new_leader_reported_ev->timestamp
793
- - events.begin ()->timestamp ;
792
+ auto transfer_time = new_leader_reported_ev->timestamp - start;
794
793
vlog (
795
794
tstlog.info ,
796
795
" leadership_transfer - new leader reported after: {} ms" ,
@@ -806,10 +805,19 @@ TEST_F_CORO(raft_fixture, leadership_transfer_delay) {
806
805
co_await new_leader_node.raft ()->replace_configuration (
807
806
std::vector<vnode>{new_nodes.begin (), new_nodes.end ()},
808
807
model::revision_id (2 ));
809
- // analogically to the previous case we wait for 6 notifications as
808
+ // wait for no leader to be reported
809
+ co_await tests::cooperative_spin_wait_with_timeout (10s, [&] {
810
+ if (new_leader_node.raft ()->get_leader_id () == std::nullopt) {
811
+ return true ;
812
+ }
813
+ return new_leader_node.raft ()->term () > current_term;
814
+ });
815
+
816
+ start = clock_t::now ();
817
+ // analogically to the previous case we wait for 3 notifications as
810
818
// currently the group has only 3 replicas
811
819
co_await tests::cooperative_spin_wait_with_timeout (
812
- 10s, [&] { return events.size () >= 6 ; });
820
+ 10s, [&] { return events.size () >= 3 ; });
813
821
814
822
auto leader_reported_after_reconfiguration = std::find_if (
815
823
events.begin (), events.end (), [&](leadership_changed_event& ev) {
@@ -818,7 +826,7 @@ TEST_F_CORO(raft_fixture, leadership_transfer_delay) {
818
826
});
819
827
820
828
auto election_time = leader_reported_after_reconfiguration->timestamp
821
- - events. begin ()-> timestamp ;
829
+ - start ;
822
830
vlog (
823
831
tstlog.info ,
824
832
" reconfiguration - new leader reported after: {} ms" ,
@@ -834,7 +842,6 @@ TEST_F_CORO(raft_fixture, leadership_transfer_delay) {
834
842
* time needed for leadership transfer
835
843
*/
836
844
ASSERT_LE_CORO (election_time * 1.0 , transfer_time * tolerance_multiplier);
837
- ASSERT_GE_CORO (election_time * 1.0 , transfer_time / tolerance_multiplier);
838
845
}
839
846
840
847
TEST_F_CORO (raft_fixture, test_no_stepdown_on_append_entries_timeout) {
0 commit comments