@@ -621,7 +621,9 @@ cluster_restart(Config) ->
621621 epoch => 1 ,
622622 replica_nodes => Replicas ,
623623 leader_node => LeaderNode },
624- {ok , #{leader_pid := Leader } = Conf } = osiris :start_cluster (Conf0 ),
624+ {ok , #{leader_pid := Leader ,
625+ replica_pids := [Replica1 , Replica2 ]} = Conf } =
626+ osiris :start_cluster (Conf0 ),
625627 WriterId = <<" wid1" >>,
626628 ok = osiris :write (Leader , WriterId , 42 , <<" before-restart" >>),
627629 receive
@@ -632,12 +634,36 @@ cluster_restart(Config) ->
632634 exit (osiris_written_timeout )
633635 end ,
634636
637+ timer :sleep (1 ),
638+ RangesBeforeRecovery =
639+ [begin
640+ #{committed_chunk_id := E ,
641+ first_chunk_id := S } = osiris :get_stats (P ),
642+ {S , E }
643+ end || P <- [Leader , Replica1 , Replica2 ]],
644+
645+ ? assertEqual ([{0 ,0 }, {0 ,0 }, {0 ,0 }], RangesBeforeRecovery ),
646+
635647 osiris :stop_cluster (Conf ),
636- {ok , #{leader_pid := Leader1 }} =
648+ {ok , #{leader_pid := Leader1 ,
649+ replica_pids := [ReplicaPid1 , ReplicaPid2 ]}} =
637650 osiris :start_cluster (Conf0 #{epoch => 2 }),
638651 % % give leader some time to discover the committed offset
639652 timer :sleep (1000 ),
640- ok = validate_log (Leader1 , [{0 , <<" before-restart" >>}]),
653+
654+ % % get all log ranges after recovery for each member and validate they are all
655+ % % the same
656+ RangesAfterRecovery =
657+ [begin
658+ #{committed_chunk_id := E ,
659+ first_chunk_id := S } = osiris :get_stats (P ),
660+ {S , E }
661+ end || P <- [Leader1 , ReplicaPid1 , ReplicaPid2 ]],
662+ ? assertEqual ([{0 ,0 }, {0 ,0 }, {0 ,0 }], RangesAfterRecovery ),
663+ ct :pal (" ~p ~p " , [RangesBeforeRecovery , RangesAfterRecovery ]),
664+ ok = validate_log_offset_reader (Leader1 , [{0 , <<" before-restart" >>}]),
665+ ok = validate_log_offset_reader (ReplicaPid1 , [{0 , <<" before-restart" >>}]),
666+ ok = validate_log_offset_reader (ReplicaPid2 , [{0 , <<" before-restart" >>}]),
641667
642668 ok = osiris :write (Leader1 , WriterId , 43 , <<" after-restart" >>),
643669 receive
@@ -648,9 +674,11 @@ cluster_restart(Config) ->
648674 exit (osiris_written_timeout )
649675 end ,
650676
651- ok =
652- validate_log (Leader1 ,
653- [{0 , <<" before-restart" >>}, {1 , <<" after-restart" >>}]),
677+ ExpectedLog = [{0 , <<" before-restart" >>}, {1 , <<" after-restart" >>}],
678+
679+ ok = validate_log_offset_reader (Leader1 , ExpectedLog ),
680+ ok = validate_log_offset_reader (ReplicaPid1 , ExpectedLog ),
681+ ok = validate_log_offset_reader (ReplicaPid2 , ExpectedLog ),
654682 [stop_peer (Ref ) || {Ref , _ } <- PeerStates ],
655683 ok .
656684
@@ -1835,7 +1863,8 @@ search_paths() ->
18351863validate_log (Leader , Exp ) when is_pid (Leader ) ->
18361864 case node (Leader ) == node () of
18371865 true ->
1838- {ok , Log0 } = osiris_writer :init_data_reader (Leader , {0 , empty }, #{counter_spec => {'test' , []}}),
1866+ {ok , Log0 } = osiris_writer :init_data_reader (Leader , {0 , empty },
1867+ #{counter_spec => {'test' , []}}),
18391868 validate_log (Log0 , Exp );
18401869 false ->
18411870 ok = erpc :call (node (Leader ), ? MODULE , ? FUNCTION_NAME , [Leader , Exp ])
@@ -1851,6 +1880,25 @@ validate_log(Log0, Expected) ->
18511880 validate_log (Log , Expected -- Entries )
18521881 end .
18531882
1883+ validate_log_offset_reader (Leader , Exp ) when is_pid (Leader ) ->
1884+ case node (Leader ) == node () of
1885+ true ->
1886+ {ok , Log0 } = osiris :init_reader (Leader , first , {'test' , []}),
1887+ validate_log_offset_reader (Log0 , Exp );
1888+ false ->
1889+ ok = erpc :call (node (Leader ), ? MODULE , ? FUNCTION_NAME , [Leader , Exp ])
1890+ end ;
1891+ validate_log_offset_reader (Log , []) ->
1892+ ok = osiris_log :close (Log ),
1893+ ok ;
1894+ validate_log_offset_reader (Log0 , Expected ) ->
1895+ case osiris_log :read_chunk_parsed (Log0 ) of
1896+ {end_of_stream , _ } ->
1897+ ct :fail (" validate log failed, rem: ~p " , [Expected ]);
1898+ {Entries , Log } ->
1899+ validate_log_offset_reader (Log , Expected -- Entries )
1900+ end .
1901+
18541902print_counters () ->
18551903 [begin
18561904 ct :pal (" ~w counters ~p " ,
0 commit comments