Skip to content

Commit 9c32f96

Browse files
ti-chi-botokJiang
andauthored
placement-rule: move placement rule initialization after LoadStores (#9616) (#9758)
close #9602 Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io> Signed-off-by: okjiang <819421878@qq.com> Co-authored-by: okJiang <819421878@qq.com>
1 parent f69dc0c commit 9c32f96

File tree

4 files changed

+81
-14
lines changed

4 files changed

+81
-14
lines changed

client/http/interface.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ type Client interface {
5050
GetStores(context.Context) (*StoresInfo, error)
5151
GetStore(context.Context, uint64) (*StoreInfo, error)
5252
SetStoreLabels(context.Context, int64, map[string]string) error
53+
DeleteStoreLabel(ctx context.Context, storeID int64, labelKey string) error
5354
/* Config-related interfaces */
5455
GetConfig(context.Context) (map[string]any, error)
5556
SetConfig(context.Context, map[string]any, ...float64) error
@@ -337,6 +338,19 @@ func (c *client) SetStoreLabels(ctx context.Context, storeID int64, storeLabels
337338
WithBody(jsonInput))
338339
}
339340

341+
// DeleteStoreLabel deletes the labels of a store.
342+
func (c *client) DeleteStoreLabel(ctx context.Context, storeID int64, labelKey string) error {
343+
jsonInput, err := json.Marshal(labelKey)
344+
if err != nil {
345+
return errors.Trace(err)
346+
}
347+
return c.request(ctx, newRequestInfo().
348+
WithName(deleteStoreLabelName).
349+
WithURI(LabelByStoreID(storeID)).
350+
WithMethod(http.MethodDelete).
351+
WithBody(jsonInput))
352+
}
353+
340354
// GetConfig gets the configurations.
341355
func (c *client) GetConfig(ctx context.Context) (map[string]any, error) {
342356
var config map[string]any

client/http/request_info.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const (
4040
getStoresName = "GetStores"
4141
getStoreName = "GetStore"
4242
setStoreLabelsName = "SetStoreLabels"
43+
deleteStoreLabelName = "DeleteStoreLabel"
4344
getConfigName = "GetConfig"
4445
setConfigName = "SetConfig"
4546
getScheduleConfigName = "GetScheduleConfig"

server/cluster/cluster.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -272,12 +272,6 @@ func (c *RaftCluster) InitCluster(
272272
c.keyspaceGroupManager = keyspaceGroupManager
273273
c.hbstreams = hbstreams
274274
c.ruleManager = placement.NewRuleManager(c.ctx, c.storage, c, c.GetOpts())
275-
if c.opt.IsPlacementRulesEnabled() {
276-
err := c.ruleManager.Initialize(c.opt.GetMaxReplicas(), c.opt.GetLocationLabels(), c.opt.GetIsolationLevel())
277-
if err != nil {
278-
return err
279-
}
280-
}
281275
c.schedulingController = newSchedulingController(c.ctx, c.core, c.opt, c.ruleManager)
282276
return nil
283277
}
@@ -304,6 +298,12 @@ func (c *RaftCluster) Start(s Server) error {
304298
if cluster == nil {
305299
return nil
306300
}
301+
if c.opt.IsPlacementRulesEnabled() {
302+
err := c.ruleManager.Initialize(c.opt.GetMaxReplicas(), c.opt.GetLocationLabels(), c.opt.GetIsolationLevel())
303+
if err != nil {
304+
return err
305+
}
306+
}
307307

308308
c.regionLabeler, err = labeler.NewRegionLabeler(c.ctx, c.storage, regionLabelGCInterval)
309309
if err != nil {

tests/integrations/client/http_client_test.go

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

353396
func (suite *httpClientTestSuite) checkRuleResult(
@@ -593,20 +636,25 @@ func (suite *httpClientTestSuite) TestSetStoreLabels() {
593636
}
594637

595638
func (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

620669
func (suite *httpClientTestSuite) TestTransferLeader() {
621670
suite.RunTestInTwoModes(suite.checkTransferLeader)
622671
}
623672

624673
func (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

Comments
 (0)