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]