From 654d5bfcf2f0ccb3ac236e1bc1e7961e12164115 Mon Sep 17 00:00:00 2001 From: shuqiang-zheng Date: Fri, 12 Sep 2025 15:12:02 +0800 Subject: [PATCH] fix(master): fix an issue where token might consume twice during the decommission repair process of two replicaNum dp, due to the master changing the leader. close: #1000336199 Signed-off-by: shuqiang-zheng --- master/data_partition.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/master/data_partition.go b/master/data_partition.go index 4858b363a..536b40793 100644 --- a/master/data_partition.go +++ b/master/data_partition.go @@ -1214,6 +1214,17 @@ func (partition *DataPartition) ReleaseDecommissionFirstHostToken(c *Cluster) { atomic.StoreUint64(&dataNodeToRepairDpInfo.CurParallel, dataNodeParallel) } +func hasDpConsumedFirstHostToken(dataNodeToRepairDpInfo *DataNodeToDecommissionRepairDpInfo, firstReplica *DataReplica, partitionId uint64) bool { + dataNodeToRepairDpInfo.mu.Lock() + defer dataNodeToRepairDpInfo.mu.Unlock() + if diskToRepairDpInfo, found := dataNodeToRepairDpInfo.DiskToDecommissionRepairDpMap[firstReplica.DiskPath]; found { + if _, ok := diskToRepairDpInfo.RepairingDps[partitionId]; ok { + return true + } + } + return false +} + func (partition *DataPartition) AcquireDecommissionFirstHostToken(c *Cluster) bool { var ( ok bool @@ -1254,6 +1265,13 @@ func (partition *DataPartition) AcquireDecommissionFirstHostToken(c *Cluster) bo DiskToDecommissionRepairDpMap: make(map[string]*DiskToDecommissionRepairDpInfo), }) dataNodeToRepairDpInfo = value.(*DataNodeToDecommissionRepairDpInfo) + + if partition.isSpecialReplicaCnt() && hasDpConsumedFirstHostToken(dataNodeToRepairDpInfo, firstReplica, partition.PartitionID) { + log.LogDebugf("action[AcquireDecommissionFirstHostToken] dp %v has first host token when reloading meta", + partition.PartitionID) + return true + } + dataNode, err = c.dataNode(firstReplica.Addr) if err != nil { log.LogErrorf("action[AcquireDecommissionFirstHostToken] failed, dp(%v) err(%v)", partition.PartitionID, err.Error())