@@ -2189,6 +2189,75 @@ fn test_read_only_option_safe() {
2189
2189
}
2190
2190
}
2191
2191
2192
+ #[ test]
2193
+ fn test_read_only_with_learner ( ) {
2194
+ setup_for_test ( ) ;
2195
+ let a = new_test_learner_raft ( 1 , vec ! [ 1 ] , vec ! [ 2 ] , 10 , 1 , new_storage ( ) ) ;
2196
+ let b = new_test_learner_raft ( 2 , vec ! [ 1 ] , vec ! [ 2 ] , 10 , 1 , new_storage ( ) ) ;
2197
+
2198
+ let mut nt = Network :: new ( vec ! [ Some ( a) , Some ( b) ] ) ;
2199
+
2200
+ // we can not let system choose the value of randomizedElectionTimeout
2201
+ // otherwise it will introduce some uncertainty into this test case
2202
+ // we need to ensure randomizedElectionTimeout > electionTimeout here
2203
+ let b_election_timeout = nt. peers [ & 2 ] . get_election_timeout ( ) ;
2204
+ nt. peers
2205
+ . get_mut ( & 2 )
2206
+ . unwrap ( )
2207
+ . set_randomized_election_timeout ( b_election_timeout + 1 ) ;
2208
+
2209
+ for _ in 0 ..b_election_timeout {
2210
+ nt. peers . get_mut ( & 2 ) . unwrap ( ) . tick ( ) ;
2211
+ }
2212
+ nt. send ( vec ! [ new_message( 1 , 1 , MessageType :: MsgHup , 0 ) ] ) ;
2213
+
2214
+ assert_eq ! ( nt. peers[ & 1 ] . state, StateRole :: Leader ) ;
2215
+ assert_eq ! ( nt. peers[ & 2 ] . state, StateRole :: Follower ) ;
2216
+
2217
+ let mut tests = vec ! [
2218
+ ( 1 , 10 , 11 , "ctx1" ) ,
2219
+ ( 2 , 10 , 21 , "ctx2" ) ,
2220
+ ( 1 , 10 , 31 , "ctx3" ) ,
2221
+ ( 2 , 10 , 41 , "ctx4" ) ,
2222
+ ] ;
2223
+
2224
+ for ( i, ( id, proposals, wri, wctx) ) in tests. drain ( ..) . enumerate ( ) {
2225
+ for _ in 0 ..proposals {
2226
+ nt. send ( vec ! [ new_message( 1 , 1 , MessageType :: MsgPropose , 1 ) ] ) ;
2227
+ }
2228
+
2229
+ let e = new_entry ( 0 , 0 , Some ( wctx) ) ;
2230
+ nt. send ( vec ! [ new_message_with_entries(
2231
+ id,
2232
+ id,
2233
+ MessageType :: MsgReadIndex ,
2234
+ vec![ e] ,
2235
+ ) ] ) ;
2236
+
2237
+ let read_states: Vec < ReadState > = nt
2238
+ . peers
2239
+ . get_mut ( & id)
2240
+ . unwrap ( )
2241
+ . read_states
2242
+ . drain ( ..)
2243
+ . collect ( ) ;
2244
+ if read_states. is_empty ( ) {
2245
+ panic ! ( "#{}: read_states is empty, want non-empty" , i) ;
2246
+ }
2247
+ let rs = & read_states[ 0 ] ;
2248
+ if rs. index != wri {
2249
+ panic ! ( "#{}: read_index = {}, want {}" , i, rs. index, wri)
2250
+ }
2251
+ let vec_wctx = wctx. as_bytes ( ) . to_vec ( ) ;
2252
+ if rs. request_ctx != vec_wctx {
2253
+ panic ! (
2254
+ "#{}: request_ctx = {:?}, want {:?}" ,
2255
+ i, rs. request_ctx, vec_wctx
2256
+ )
2257
+ }
2258
+ }
2259
+ }
2260
+
2192
2261
#[ test]
2193
2262
fn test_read_only_option_lease ( ) {
2194
2263
setup_for_test ( ) ;
0 commit comments