This is an automated email from the ASF dual-hosted git repository.

deardeng pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new e1d5d9780e7 [fix](cloud) Exclude decommissioning BE from BE selection 
(#65221) (#66070)
e1d5d9780e7 is described below

commit e1d5d9780e7ad5c9e2551bfd05781401c5dcceda
Author: deardeng <[email protected]>
AuthorDate: Thu Jul 30 12:14:08 2026 +0800

    [fix](cloud) Exclude decommissioning BE from BE selection (#65221) (#66070)
    
    pick from https://github.com/apache/doris/pull/65221
    Problem Summary: Cloud decommissioning backends can still be alive
    before they reach the final decommissioned state. These backends could
    still be selected by CloudReplica routing, routine load assignment, and
    Kafka proxy backend selection. This change treats decommissioning
    backends the same as decommissioned backends in those selection paths,
    while preserving current master behavior such as direct multi-replica
    hashing and routine load blacklist stale-backend cleanup.
    
    Cloud backend selection avoids routing new replica, routine load, and
    Kafka proxy work to decommissioning backends.
---
 .../apache/doris/cloud/catalog/CloudReplica.java   | 27 +++++++++++++++++-----
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudReplica.java 
b/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudReplica.java
index 583f64ab795..e6772c3c39d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudReplica.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudReplica.java
@@ -120,11 +120,16 @@ public class CloudReplica extends Replica implements 
GsonPostProcessable {
         boolean decommissioned = be.isDecommissioned();
         if ((decommissioning || decommissioned) && LOG.isDebugEnabled()) {
             LOG.debug("backend {} is filtered by decommission state, 
decommissioning={}, decommissioned={}, "
-                    + "backend={}", be.getId(), decommissioning, 
decommissioned, be);
+                            + "replica info {}",
+                    be.getId(), decommissioning, decommissioned, this);
         }
         return decommissioning || decommissioned;
     }
 
+    private boolean isQueryAvailableAndNotDecommissioning(Backend be) {
+        return be != null && be.isQueryAvailable() && 
!isDecommissioningOrDecommissioned(be);
+    }
+
     public long getColocatedBeId(String clusterId) throws 
ComputeGroupException {
         List<Backend> clusterBackends = ((CloudSystemInfoService) 
Env.getCurrentSystemInfo())
                 .getBackendsByClusterId(clusterId);
@@ -149,7 +154,7 @@ public class CloudReplica extends Replica implements 
GsonPostProcessable {
         List<Backend> decommissionAvailBes = new ArrayList<>();
         for (Backend be : bes) {
             if (be.isAlive()) {
-                if (be.isDecommissioned()) {
+                if (isDecommissioningOrDecommissioned(be)) {
                     decommissionAvailBes.add(be);
                 } else {
                     availableBes.add(be);
@@ -358,6 +363,10 @@ public class CloudReplica extends Replica implements 
GsonPostProcessable {
             }
 
             List<Long> res = hashReplicaToBes(clusterId, false, 
Config.cloud_replica_num);
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("rehash multi replica backend, clusterId {}, replica 
info {}, indexRand {}, hashedBes {}",
+                        clusterId, this, indexRand, res);
+            }
             if (res.size() < indexRand + 1) {
                 if (res.isEmpty()) {
                     return -1;
@@ -371,14 +380,14 @@ public class CloudReplica extends Replica implements 
GsonPostProcessable {
 
         // use primaryClusterToBackends, if find be normal
         Backend be = getPrimaryBackend(clusterId, false);
-        if (be != null && be.isQueryAvailable()) {
+        if (isQueryAvailableAndNotDecommissioning(be)) {
             return be.getId();
         }
 
         if (!Config.enable_immediate_be_assign) {
             // use secondaryClusterToBackends, if find be normal
             be = getSecondaryBackend(clusterId);
-            if (be != null && be.isQueryAvailable()) {
+            if (isQueryAvailableAndNotDecommissioning(be)) {
                 return be.getId();
             }
         }
@@ -390,6 +399,12 @@ public class CloudReplica extends Replica implements 
GsonPostProcessable {
 
         // be abnormal, rehash it. configure settings to different maps
         long pickBeId = hashReplicaToBe(clusterId, false);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("rehash replica backend, clusterId {}, pickedBeId {}, 
immediateAssign {}, replica info {}, "
+                            + "primaryBackend {}, secondaryBackend {}",
+                    clusterId, pickBeId, Config.enable_immediate_be_assign, 
this, getPrimaryBackend(clusterId, false),
+                    getSecondaryBackend(clusterId));
+        }
         if (Config.enable_immediate_be_assign) {
             updateClusterToPrimaryBe(clusterId, pickBeId);
         } else {
@@ -448,7 +463,7 @@ public class CloudReplica extends Replica implements 
GsonPostProcessable {
         List<Backend> decommissionAvailBes = new ArrayList<>();
         for (Backend be : clusterBes) {
             if (be.isQueryAvailable() && !be.isSmoothUpgradeSrc()) {
-                if (be.isDecommissioned()) {
+                if (isDecommissioningOrDecommissioned(be)) {
                     decommissionAvailBes.add(be);
                 } else {
                     availableBes.add(be);
@@ -514,7 +529,7 @@ public class CloudReplica extends Replica implements 
GsonPostProcessable {
             // be core or restart must in heartbeat_interval_second
             if ((be.isAlive() || missTimeMs <= 
Config.heartbeat_interval_second * 1000L)
                     && !be.isSmoothUpgradeSrc()) {
-                if (be.isDecommissioned()) {
+                if (isDecommissioningOrDecommissioned(be)) {
                     decommissionAvailBes.add(be);
                 } else {
                     availableBes.add(be);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to