Skip to content

Commit 0c935f9

Browse files
committed
Address comment
Signed-off-by: ZenoTan <zenotan1998@gmail.com>
1 parent 2d1adee commit 0c935f9

4 files changed

Lines changed: 23 additions & 6 deletions

File tree

server/schedule/checker/learner_checker.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,15 @@ func NewLearnerChecker(cluster opt.Cluster) *LearnerChecker {
3636
// Check verifies a region's role, creating an Operator if need.
3737
func (l *LearnerChecker) Check(region *core.RegionInfo) *operator.Operator {
3838
for _, p := range region.GetLearners() {
39+
//if region.GetPendingLearner(p.GetId()) != nil {
40+
// continue
41+
//}
3942
op, err := operator.CreatePromoteLearnerOperator("promote-learner", l.cluster, region, p)
4043
if err != nil {
4144
log.Debug("fail to create promote learner operator", errs.ZapError(err))
4245
return nil
4346
}
44-
if op != nil {
45-
return op
46-
}
47+
return op
4748
}
4849
return nil
4950
}

server/schedule/operator/builder.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type Builder struct {
4545

4646
// operation record
4747
originPeers peersMap
48+
pendingPeers peersMap
4849
originLeaderStoreID uint64
4950
targetPeers peersMap
5051
targetLeaderStoreID uint64
@@ -95,6 +96,7 @@ func NewBuilder(desc string, cluster opt.Cluster, region *core.RegionInfo, opts
9596
// origin peers
9697
err := b.err
9798
originPeers := newPeersMap()
99+
pendingPeers := newPeersMap()
98100

99101
for _, p := range region.GetPeers() {
100102
if p == nil || p.GetStoreId() == 0 {
@@ -104,6 +106,10 @@ func NewBuilder(desc string, cluster opt.Cluster, region *core.RegionInfo, opts
104106
originPeers.Set(p)
105107
}
106108

109+
for _, p := range region.GetPendingPeers() {
110+
pendingPeers.Set(p)
111+
}
112+
107113
// origin leader
108114
originLeaderStoreID := region.GetLeader().GetStoreId()
109115
if _, ok := originPeers[originLeaderStoreID]; err == nil && !ok {
@@ -132,6 +138,7 @@ func NewBuilder(desc string, cluster opt.Cluster, region *core.RegionInfo, opts
132138

133139
b.rules = rules
134140
b.originPeers = originPeers
141+
b.pendingPeers = pendingPeers
135142
b.originLeaderStoreID = originLeaderStoreID
136143
b.targetPeers = originPeers.Copy()
137144
b.allowDemote = supportJointConsensus
@@ -182,6 +189,8 @@ func (b *Builder) PromoteLearner(storeID uint64) *Builder {
182189
b.err = errors.Errorf("cannot promote peer %d: not found", storeID)
183190
} else if !core.IsLearner(peer) {
184191
b.err = errors.Errorf("cannot promote peer %d: is not learner", storeID)
192+
} else if _, ok := b.pendingPeers[storeID]; ok {
193+
b.err = errors.Errorf("cannot promote peer %d: pending", storeID)
185194
} else {
186195
b.targetPeers.Set(&metapb.Peer{
187196
Id: peer.GetId(),

server/schedule/operator/builder_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,3 +442,13 @@ func (s *testBuilderSuite) TestBuild(c *C) {
442442
}
443443
}
444444
}
445+
446+
// Test for issue 3039
447+
func (s *testBuilderSuite) TestPromotePending(c *C) {
448+
p := &metapb.Peer{Id: 2, StoreId: 2, Role: metapb.PeerRole_Learner}
449+
region := core.NewRegionInfo(&metapb.Region{Id: 1, Peers: []*metapb.Peer{{Id: 1, StoreId: 1},
450+
p}}, &metapb.Peer{Id: 1, StoreId: 1}, core.WithPendingPeers([]*metapb.Peer{p}))
451+
builder := NewBuilder("test", s.cluster, region)
452+
builder.PromoteLearner(2)
453+
c.Assert(builder.err, NotNil)
454+
}

server/schedule/operator/create_operator.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ func CreateAddPeerOperator(desc string, cluster opt.Cluster, region *core.Region
3434

3535
// CreatePromoteLearnerOperator creates an operator that promotes a learner.
3636
func CreatePromoteLearnerOperator(desc string, cluster opt.Cluster, region *core.RegionInfo, peer *metapb.Peer) (*Operator, error) {
37-
if region.GetPendingPeer(peer.GetId()) != nil {
38-
return nil, nil
39-
}
4037
return NewBuilder(desc, cluster, region).
4138
PromoteLearner(peer.GetStoreId()).
4239
Build(0)

0 commit comments

Comments
 (0)