@@ -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 (),
0 commit comments