@@ -37,6 +37,7 @@ package locate
37
37
import (
38
38
"context"
39
39
"fmt"
40
+ "strconv"
40
41
"sync/atomic"
41
42
"testing"
42
43
"time"
@@ -1142,3 +1143,58 @@ func (s *testRegionRequestToThreeStoresSuite) TestAccessFollowerAfter1TiKVDown()
1142
1143
s .Equal (0 , retryTimes )
1143
1144
}
1144
1145
}
1146
+
1147
+ func (s * testRegionRequestToThreeStoresSuite ) TestStaleReadFallback () {
1148
+ leaderStore , _ := s .loadAndGetLeaderStore ()
1149
+ leaderLabel := []* metapb.StoreLabel {
1150
+ {
1151
+ Key : "id" ,
1152
+ Value : strconv .FormatUint (leaderStore .StoreID (), 10 ),
1153
+ },
1154
+ }
1155
+ regionLoc , err := s .cache .LocateRegionByID (s .bo , s .regionID )
1156
+ s .Nil (err )
1157
+ s .NotNil (regionLoc )
1158
+ value := []byte ("value" )
1159
+ isFirstReq := true
1160
+
1161
+ s .regionRequestSender .client = & fnClient {fn : func (ctx context.Context , addr string , req * tikvrpc.Request , timeout time.Duration ) (response * tikvrpc.Response , err error ) {
1162
+ select {
1163
+ case <- ctx .Done ():
1164
+ return nil , errors .New ("timeout" )
1165
+ default :
1166
+ }
1167
+ // Return `DataIsNotReady` for the first time on leader.
1168
+ if isFirstReq {
1169
+ isFirstReq = false
1170
+ return & tikvrpc.Response {Resp : & kvrpcpb.GetResponse {RegionError : & errorpb.Error {
1171
+ DataIsNotReady : & errorpb.DataIsNotReady {},
1172
+ }}}, nil
1173
+ }
1174
+ return & tikvrpc.Response {Resp : & kvrpcpb.GetResponse {Value : value }}, nil
1175
+ }}
1176
+
1177
+ region := s .cache .getRegionByIDFromCache (regionLoc .Region .GetID ())
1178
+ s .True (region .isValid ())
1179
+
1180
+ req := tikvrpc .NewReplicaReadRequest (tikvrpc .CmdGet , & kvrpcpb.GetRequest {Key : []byte ("key" )}, kv .ReplicaReadLeader , nil )
1181
+ req .ReadReplicaScope = oracle .GlobalTxnScope
1182
+ req .TxnScope = oracle .GlobalTxnScope
1183
+ req .EnableStaleRead ()
1184
+ req .ReplicaReadType = kv .ReplicaReadMixed
1185
+ var ops []StoreSelectorOption
1186
+ ops = append (ops , WithMatchLabels (leaderLabel ))
1187
+
1188
+ ctx , _ := context .WithTimeout (context .Background (), 10 * time .Second )
1189
+ bo := retry .NewBackoffer (ctx , - 1 )
1190
+ s .Nil (err )
1191
+ resp , _ , _ , err := s .regionRequestSender .SendReqCtx (bo , req , regionLoc .Region , time .Second , tikvrpc .TiKV , ops ... )
1192
+ s .Nil (err )
1193
+
1194
+ regionErr , err := resp .GetRegionError ()
1195
+ s .Nil (err )
1196
+ s .Nil (regionErr )
1197
+ getResp , ok := resp .Resp .(* kvrpcpb.GetResponse )
1198
+ s .True (ok )
1199
+ s .Equal (getResp .Value , value )
1200
+ }
0 commit comments