@@ -2205,6 +2205,79 @@ fn test_read_only_option_safe() {
22052205 }
22062206}
22072207
2208+ #[ test]
2209+ fn test_read_only_with_learner ( ) {
2210+ setup_for_test ( ) ;
2211+ let a = new_test_learner_raft ( 1 , vec ! [ 1 ] , vec ! [ 2 ] , 10 , 1 , new_storage ( ) ) ;
2212+ let b = new_test_learner_raft ( 2 , vec ! [ 1 ] , vec ! [ 2 ] , 10 , 1 , new_storage ( ) ) ;
2213+
2214+ let mut nt = Network :: new ( vec ! [ Some ( a) , Some ( b) ] ) ;
2215+
2216+ // we can not let system choose the value of randomizedElectionTimeout
2217+ // otherwise it will introduce some uncertainty into this test case
2218+ // we need to ensure randomizedElectionTimeout > electionTimeout here
2219+ let b_election_timeout = nt. peers [ & 2 ] . get_election_timeout ( ) ;
2220+ nt. peers
2221+ . get_mut ( & 2 )
2222+ . unwrap ( )
2223+ . set_randomized_election_timeout ( b_election_timeout + 1 ) ;
2224+
2225+ for _ in 0 ..b_election_timeout {
2226+ nt. peers . get_mut ( & 2 ) . unwrap ( ) . tick ( ) ;
2227+ }
2228+ nt. send ( vec ! [ new_message( 1 , 1 , MessageType :: MsgHup , 0 ) ] ) ;
2229+
2230+ assert_eq ! ( nt. peers[ & 1 ] . state, StateRole :: Leader ) ;
2231+ assert_eq ! ( nt. peers[ & 2 ] . state, StateRole :: Follower ) ;
2232+
2233+ let mut tests = vec ! [
2234+ ( 1 , 10 , 11 , "ctx1" ) ,
2235+ ( 2 , 10 , 21 , "ctx2" ) ,
2236+ ( 1 , 10 , 31 , "ctx3" ) ,
2237+ ( 2 , 10 , 41 , "ctx4" ) ,
2238+ ] ;
2239+
2240+ for ( i, ( id, proposals, wri, wctx) ) in tests. drain ( ..) . enumerate ( ) {
2241+ for _ in 0 ..proposals {
2242+ nt. send ( vec ! [ new_message( 1 , 1 , MessageType :: MsgPropose , 1 ) ] ) ;
2243+ }
2244+
2245+ let e = new_entry ( 0 , 0 , Some ( wctx) ) ;
2246+ nt. send ( vec ! [ new_message_with_entries(
2247+ id,
2248+ id,
2249+ MessageType :: MsgReadIndex ,
2250+ vec![ e] ,
2251+ ) ] ) ;
2252+
2253+ let read_states: Vec < ReadState > = nt
2254+ . peers
2255+ . get_mut ( & id)
2256+ . unwrap ( )
2257+ . read_states
2258+ . drain ( ..)
2259+ . collect ( ) ;
2260+ assert_eq ! (
2261+ read_states. is_empty( ) ,
2262+ false ,
2263+ "#{}: read_states is empty, want non-empty" ,
2264+ i
2265+ ) ;
2266+ let rs = & read_states[ 0 ] ;
2267+ assert_eq ! (
2268+ rs. index, wri,
2269+ "#{}: read_index = {}, want {}" ,
2270+ i, rs. index, wri
2271+ ) ;
2272+ let vec_wctx = wctx. as_bytes ( ) . to_vec ( ) ;
2273+ assert_eq ! (
2274+ rs. request_ctx, vec_wctx,
2275+ "#{}: request_ctx = {:?}, want {:?}" ,
2276+ i, rs. request_ctx, vec_wctx
2277+ ) ;
2278+ }
2279+ }
2280+
22082281#[ test]
22092282fn test_read_only_option_lease ( ) {
22102283 setup_for_test ( ) ;
0 commit comments