@@ -1066,27 +1066,40 @@ func (s *testRegionRequestToThreeStoresSuite) TestStaleReadFallback() {
1066
1066
s .Nil (err )
1067
1067
s .NotNil (regionLoc )
1068
1068
value := []byte ("value" )
1069
- isFirstReq := true
1070
1069
1070
+ type testState struct {
1071
+ tryTimes uint8
1072
+ succ bool
1073
+ }
1074
+
1075
+ state := & testState {}
1071
1076
s .regionRequestSender .client = & fnClient {fn : func (ctx context.Context , addr string , req * tikvrpc.Request , timeout time.Duration ) (response * tikvrpc.Response , err error ) {
1072
1077
select {
1073
1078
case <- ctx .Done ():
1074
1079
return nil , errors .New ("timeout" )
1075
1080
default :
1076
1081
}
1077
1082
// Return `DataIsNotReady` for the first time on leader.
1078
- if isFirstReq {
1079
- isFirstReq = false
1083
+ if state . tryTimes == 0 {
1084
+ state . tryTimes ++
1080
1085
return & tikvrpc.Response {Resp : & kvrpcpb.GetResponse {RegionError : & errorpb.Error {
1081
1086
DataIsNotReady : & errorpb.DataIsNotReady {},
1082
1087
}}}, nil
1088
+ } else if state .tryTimes == 1 && state .succ {
1089
+ state .tryTimes ++
1090
+ return & tikvrpc.Response {Resp : & kvrpcpb.GetResponse {Value : value }}, nil
1083
1091
}
1084
- return & tikvrpc.Response {Resp : & kvrpcpb.GetResponse {Value : value }}, nil
1092
+ state .tryTimes ++
1093
+ return & tikvrpc.Response {Resp : & kvrpcpb.GetResponse {RegionError : & errorpb.Error {
1094
+ DiskFull : & errorpb.DiskFull {},
1095
+ }}}, nil
1085
1096
}}
1086
1097
1087
1098
region := s .cache .getRegionByIDFromCache (regionLoc .Region .GetID ())
1088
1099
s .True (region .isValid ())
1089
1100
1101
+ // Test the successful path.
1102
+ state .succ = true
1090
1103
req := tikvrpc .NewReplicaReadRequest (tikvrpc .CmdGet , & kvrpcpb.GetRequest {Key : []byte ("key" )}, kv .ReplicaReadLeader , nil )
1091
1104
req .ReadReplicaScope = oracle .GlobalTxnScope
1092
1105
req .TxnScope = oracle .GlobalTxnScope
@@ -1107,4 +1120,17 @@ func (s *testRegionRequestToThreeStoresSuite) TestStaleReadFallback() {
1107
1120
getResp , ok := resp .Resp .(* kvrpcpb.GetResponse )
1108
1121
s .True (ok )
1109
1122
s .Equal (getResp .Value , value )
1123
+
1124
+ // Test the fail path leader retry limit is reached, epoch not match error would be returned.
1125
+ state .tryTimes = 0
1126
+ state .succ = false
1127
+ req .EnableStaleRead ()
1128
+ resp , _ , _ , err = s .regionRequestSender .SendReqCtx (bo , req , regionLoc .Region , time .Second , tikvrpc .TiKV , ops ... )
1129
+ s .Nil (err )
1130
+
1131
+ regionErr , err = resp .GetRegionError ()
1132
+ s .Nil (err )
1133
+ s .NotNil (regionErr )
1134
+ s .NotNil (regionErr .GetEpochNotMatch ())
1135
+ s .Nil (regionErr .GetDiskFull ())
1110
1136
}
0 commit comments