Skip to content

Commit

Permalink
This is an automated cherry-pick of tikv#5458
Browse files Browse the repository at this point in the history
close tikv#5401

Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
  • Loading branch information
HunDunDM authored and ti-chi-bot committed Aug 31, 2022
1 parent 0de1d8c commit 968dd4e
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 2 deletions.
15 changes: 13 additions & 2 deletions server/schedule/operator/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,9 @@ type Builder struct {
targetLeaderStoreID uint64
err error

// skip origin check flags
// skip check flags
skipOriginJointStateCheck bool
skipPlacementRulesCheck bool

// build flags
allowDemote bool
Expand All @@ -80,6 +81,11 @@ func SkipOriginJointStateCheck(b *Builder) {
b.skipOriginJointStateCheck = true
}

// SkipPlacementRulesCheck lets the builder skip the placement rules check for origin and target peers.
func SkipPlacementRulesCheck(b *Builder) {
b.skipPlacementRulesCheck = true
}

// NewBuilder creates a Builder.
func NewBuilder(desc string, cluster opt.Cluster, region *core.RegionInfo, opts ...BuilderOption) *Builder {
b := &Builder{
Expand Down Expand Up @@ -123,8 +129,13 @@ func NewBuilder(desc string, cluster opt.Cluster, region *core.RegionInfo, opts

// placement rules
var rules []*placement.Rule
<<<<<<< HEAD
if err == nil && cluster.GetOpts().IsPlacementRulesEnabled() {
fit := cluster.FitRegion(region)
=======
if err == nil && !b.skipPlacementRulesCheck && b.GetOpts().IsPlacementRulesEnabled() {
fit := b.GetRuleManager().FitRegion(b.GetBasicCluster(), region)
>>>>>>> d8620c975 (operator: allows to skip placement rules checks (#5458))
for _, rf := range fit.RuleFits {
rules = append(rules, rf.Rule)
}
Expand Down Expand Up @@ -734,7 +745,7 @@ func (b *Builder) allowLeader(peer *metapb.Peer, ignoreClusterLimit bool) bool {
}

// placement rules
if len(b.rules) == 0 {
if b.skipPlacementRulesCheck || len(b.rules) == 0 {
return true
}
for _, r := range b.rules {
Expand Down
10 changes: 10 additions & 0 deletions server/schedule/operator/create_operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,13 @@ func CreateTransferLeaderOperator(desc string, cluster opt.Cluster, region *core
}

// CreateForceTransferLeaderOperator creates an operator that transfers the leader from a source store to a target store forcible.
<<<<<<< HEAD
func CreateForceTransferLeaderOperator(desc string, cluster opt.Cluster, region *core.RegionInfo, sourceStoreID uint64, targetStoreID uint64, kind OpKind) (*Operator, error) {
return NewBuilder(desc, cluster, region, SkipOriginJointStateCheck).
=======
func CreateForceTransferLeaderOperator(desc string, ci ClusterInformer, region *core.RegionInfo, sourceStoreID uint64, targetStoreID uint64, kind OpKind) (*Operator, error) {
return NewBuilder(desc, ci, region, SkipOriginJointStateCheck, SkipPlacementRulesCheck).
>>>>>>> d8620c975 (operator: allows to skip placement rules checks (#5458))
SetLeader(targetStoreID).
EnableForceTargetLeader().
Build(kind)
Expand Down Expand Up @@ -210,8 +215,13 @@ func CreateScatterRegionOperator(desc string, cluster opt.Cluster, origin *core.
}

// CreateLeaveJointStateOperator creates an operator that let region leave joint state.
<<<<<<< HEAD
func CreateLeaveJointStateOperator(desc string, cluster opt.Cluster, origin *core.RegionInfo) (*Operator, error) {
b := NewBuilder(desc, cluster, origin, SkipOriginJointStateCheck)
=======
func CreateLeaveJointStateOperator(desc string, ci ClusterInformer, origin *core.RegionInfo) (*Operator, error) {
b := NewBuilder(desc, ci, origin, SkipOriginJointStateCheck, SkipPlacementRulesCheck)
>>>>>>> d8620c975 (operator: allows to skip placement rules checks (#5458))

if b.err == nil && !core.IsInJointState(origin.GetPeers()...) {
b.err = errors.Errorf("cannot build leave joint state operator for region which is not in joint state")
Expand Down
68 changes: 68 additions & 0 deletions server/schedule/operator/create_operator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,22 @@ package operator

import (
"context"
<<<<<<< HEAD
"strings"
=======
"encoding/hex"
"testing"
>>>>>>> d8620c975 (operator: allows to skip placement rules checks (#5458))

. "github.com/pingcap/check"
"github.com/pingcap/errors"
"github.com/pingcap/kvproto/pkg/metapb"
"github.com/pingcap/kvproto/pkg/pdpb"
<<<<<<< HEAD
=======
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
>>>>>>> d8620c975 (operator: allows to skip placement rules checks (#5458))
"github.com/tikv/pd/pkg/mock/mockcluster"
"github.com/tikv/pd/server/config"
"github.com/tikv/pd/server/core"
Expand Down Expand Up @@ -1073,3 +1083,61 @@ func (s *testCreateOperatorSuite) TestMoveRegionWithoutJointConsensus(c *C) {
}
}
}

// Ref https://github.com/tikv/pd/issues/5401
func TestCreateLeaveJointStateOperatorWithoutFitRules(t *testing.T) {
re := require.New(t)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

opts := config.NewTestOptions()
cluster := mockcluster.NewCluster(ctx, opts)
re.NoError(cluster.SetRules([]*placement.Rule{
{
GroupID: "pd",
ID: "default",
StartKeyHex: hex.EncodeToString([]byte("")),
EndKeyHex: hex.EncodeToString([]byte("")),
Role: placement.Voter,
Count: 1,
},
{
GroupID: "t1",
ID: "t1",
StartKeyHex: hex.EncodeToString([]byte("a")),
EndKeyHex: hex.EncodeToString([]byte("b")),
Role: placement.Voter,
Count: 1,
},
{
GroupID: "t2",
ID: "t2",
StartKeyHex: hex.EncodeToString([]byte("b")),
EndKeyHex: hex.EncodeToString([]byte("c")),
Role: placement.Voter,
Count: 1,
},
}))
cluster.AddRegionStore(1, 1)
cluster.AddRegionStore(2, 1)
cluster.AddRegionStore(3, 1)
cluster.AddRegionStore(4, 1)
originPeers := []*metapb.Peer{
{Id: 3, StoreId: 3, Role: metapb.PeerRole_DemotingVoter},
{Id: 4, StoreId: 4, Role: metapb.PeerRole_IncomingVoter},
}

region := core.NewRegionInfo(&metapb.Region{Id: 1, Peers: originPeers, StartKey: []byte("a"), EndKey: []byte("c")}, originPeers[0])
op, err := CreateLeaveJointStateOperator("test", cluster, region)
re.NoError(err)
re.Equal(OpLeader, op.Kind())
re.Len(op.steps, 2)
step0 := op.steps[0].(TransferLeader)
re.Equal(uint64(3), step0.FromStore)
re.Equal(uint64(4), step0.ToStore)
step1 := op.steps[1].(ChangePeerV2Leave)
re.Len(step1.PromoteLearners, 1)
re.Len(step1.DemoteVoters, 1)
re.Equal(uint64(4), step1.PromoteLearners[0].ToStore)
re.Equal(uint64(3), step1.DemoteVoters[0].ToStore)
}

0 comments on commit 968dd4e

Please sign in to comment.