@@ -10,6 +10,7 @@ import (
10
10
"time"
11
11
12
12
"github.com/golang/protobuf/proto"
13
+ "github.com/pingcap/failpoint"
13
14
backuppb "github.com/pingcap/kvproto/pkg/brpb"
14
15
"github.com/pingcap/kvproto/pkg/encryptionpb"
15
16
"github.com/pingcap/kvproto/pkg/errorpb"
@@ -41,6 +42,7 @@ type testBackup struct {
41
42
cancel context.CancelFunc
42
43
43
44
mockPDClient pd.Client
45
+ mockCluster * testutils.MockCluster
44
46
mockGlue * gluetidb.MockGlue
45
47
backupClient * backup.Client
46
48
@@ -49,11 +51,12 @@ type testBackup struct {
49
51
}
50
52
51
53
func createBackupSuite (t * testing.T ) * testBackup {
52
- tikvClient , _ , pdClient , err := testutils .NewMockTiKV ("" , nil )
54
+ tikvClient , mockCluster , pdClient , err := testutils .NewMockTiKV ("" , nil )
53
55
require .NoError (t , err )
54
56
s := new (testBackup )
55
57
s .mockGlue = & gluetidb.MockGlue {}
56
58
s .mockPDClient = pdClient
59
+ s .mockCluster = mockCluster
57
60
s .ctx , s .cancel = context .WithCancel (context .Background ())
58
61
mockMgr := & conn.Mgr {PdController : & pdutil.PdController {}}
59
62
mockMgr .SetPDClient (s .mockPDClient )
@@ -334,3 +337,63 @@ func TestCheckBackupIsLocked(t *testing.T) {
334
337
require .Error (t , err )
335
338
require .Regexp (t , "backup lock file and sst file exist in(.+)" , err .Error ())
336
339
}
340
+
341
+ func TestFindTargetPeer (t * testing.T ) {
342
+ s := createBackupSuite (t )
343
+
344
+ ctx := context .Background ()
345
+ testutils .BootstrapWithMultiRegions (s .mockCluster , []byte ("g" ), []byte ("n" ), []byte ("t" ))
346
+
347
+ leader1 , err := s .backupClient .FindTargetPeer (ctx , []byte ("a" ), false , nil )
348
+ require .NoError (t , err )
349
+
350
+ leader2 , err := s .backupClient .FindTargetPeer (ctx , []byte ("b" ), false , nil )
351
+ require .NoError (t , err )
352
+
353
+ // check passed keys on same region
354
+ require .Equal (t , leader1 .GetId (), leader2 .GetId ())
355
+
356
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" , "return(2)" )
357
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" , "1*return(\" nil\" )->1*return(\" hasLeader\" )" )
358
+
359
+ leader , err := s .backupClient .FindTargetPeer (ctx , []byte ("m" ), false , nil )
360
+ require .NoError (t , err )
361
+ // check passed keys on find leader after retry
362
+ require .Equal (t , 42 , int (leader .GetId ()))
363
+
364
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" )
365
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" )
366
+
367
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" , "return(2)" )
368
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" , "return(\" noLeader\" )" )
369
+
370
+ leader , err = s .backupClient .FindTargetPeer (ctx , []byte ("m" ), false , nil )
371
+ // check passed keys with error on find leader after retry
372
+ require .ErrorContains (t , err , "cannot find leader" )
373
+
374
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" )
375
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" )
376
+
377
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" , "return(2)" )
378
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" , "1*return(\" nil\" )->1*return(\" hasPeer\" )" )
379
+
380
+ storeIDMap := make (map [uint64 ]struct {})
381
+ storeIDMap [42 ] = struct {}{}
382
+ leader , err = s .backupClient .FindTargetPeer (ctx , []byte ("m" ), false , storeIDMap )
383
+ require .NoError (t , err )
384
+ // check passed keys with target peer
385
+ require .Equal (t , 43 , int (leader .GetId ()))
386
+
387
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" )
388
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" )
389
+
390
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" , "return(2)" )
391
+ failpoint .Enable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" , "1*return(\" nil\" )->1*return(\" noPeer\" )" )
392
+
393
+ leader , err = s .backupClient .FindTargetPeer (ctx , []byte ("m" ), false , storeIDMap )
394
+ // check passed keys with error and cannot find target peer
395
+ require .ErrorContains (t , err , "cannot find leader" )
396
+
397
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer" )
398
+ failpoint .Disable ("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer" )
399
+ }
0 commit comments