@@ -348,6 +348,49 @@ func (suite *httpClientTestSuite) checkRule(mode mode, client pd.Client) {
348348 err = client .SetPlacementRule (env .ctx , testRule )
349349 re .NoError (err )
350350 suite .checkRuleResult (re , env , client , testRule , 1 , true )
351+
352+ // ***** Test placement rule failed passing check after transfer leader
353+ // Transfer the leader to another store to ensure the PD follower
354+ // exists stale store labels.
355+ suite .transferLeader (env , client )
356+ tranferLeaderRule := []* pd.GroupBundle {
357+ {
358+ ID : "test-transfer-leader" ,
359+ Rules : []* pd.Rule {
360+ {
361+ GroupID : "test-transfer-leader" ,
362+ ID : "readonly" ,
363+ Role : pd .Voter ,
364+ Count : 3 ,
365+ StartKey : []byte {},
366+ EndKey : []byte {},
367+ LabelConstraints : []pd.LabelConstraint {
368+ {
369+ Key : "$mode" ,
370+ Op : pd .In ,
371+ Values : []string {"readonly" },
372+ },
373+ },
374+ },
375+ },
376+ },
377+ }
378+ err = client .SetPlacementRuleBundles (env .ctx , tranferLeaderRule , true )
379+ re .Error (err )
380+ re .ErrorContains (err , "invalid rule content, rule 'readonly' from rule group 'test-transfer-leader' can not match any store" )
381+ storeID := suite .setStoreLabels (env .ctx , client , map [string ]string {
382+ "$mode" : "readonly" ,
383+ })
384+ err = client .SetPlacementRuleBundles (env .ctx , tranferLeaderRule , true )
385+ re .NoError (err )
386+ suite .checkRuleResult (re , env , client , tranferLeaderRule [0 ].Rules [0 ], 1 , true )
387+
388+ suite .transferLeader (env , client )
389+ suite .checkRuleResult (re , env , client , tranferLeaderRule [0 ].Rules [0 ], 1 , true )
390+ re .NoError (client .DeleteStoreLabel (env .ctx , storeID , "$mode" ))
391+ store , err := client .GetStore (env .ctx , uint64 (storeID ))
392+ re .NoError (err )
393+ re .Empty (store .Store .Labels )
351394}
352395
353396func (suite * httpClientTestSuite ) checkRuleResult (
@@ -593,20 +636,25 @@ func (suite *httpClientTestSuite) TestSetStoreLabels() {
593636}
594637
595638func (suite * httpClientTestSuite ) checkSetStoreLabels (mode mode , client pd.Client ) {
596- re := suite .Require ()
597639 env := suite .env [mode ]
598640
599- resp , err := client .GetStores (env .ctx )
641+ suite .setStoreLabels (env .ctx , client , map [string ]string {
642+ "zone" : "zone1" ,
643+ })
644+ }
645+
646+ func (suite * httpClientTestSuite ) setStoreLabels (ctx context.Context , client pd.Client , storeLabels map [string ]string ) int64 {
647+ re := suite .Require ()
648+
649+ resp , err := client .GetStores (ctx )
600650 re .NoError (err )
601651 setStore := resp .Stores [0 ]
602652 re .Empty (setStore .Store .Labels , nil )
603- storeLabels := map [string ]string {
604- "zone" : "zone1" ,
605- }
606- err = client .SetStoreLabels (env .ctx , 1 , storeLabels )
653+
654+ err = client .SetStoreLabels (ctx , 1 , storeLabels )
607655 re .NoError (err )
608656
609- resp , err = client .GetStores (env . ctx )
657+ resp , err = client .GetStores (ctx )
610658 re .NoError (err )
611659 for _ , store := range resp .Stores {
612660 if store .Store .ID == setStore .Store .ID {
@@ -615,16 +663,20 @@ func (suite *httpClientTestSuite) checkSetStoreLabels(mode mode, client pd.Clien
615663 }
616664 }
617665 }
666+ return setStore .Store .ID
618667}
619668
620669func (suite * httpClientTestSuite ) TestTransferLeader () {
621670 suite .RunTestInTwoModes (suite .checkTransferLeader )
622671}
623672
624673func (suite * httpClientTestSuite ) checkTransferLeader (mode mode , client pd.Client ) {
625- re := suite .Require ()
626674 env := suite .env [mode ]
675+ suite .transferLeader (env , client )
676+ }
627677
678+ func (suite * httpClientTestSuite ) transferLeader (env * httpClientTestEnv , client pd.Client ) {
679+ re := suite .Require ()
628680 members , err := client .GetMembers (env .ctx )
629681 re .NoError (err )
630682 re .Len (members .Members , 2 )
0 commit comments