diff --git a/fe/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java b/fe/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java index aa97f65677d32d..453a2c9a0bba02 100644 --- a/fe/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java +++ b/fe/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java @@ -474,7 +474,7 @@ public List getReplicasByTabletId(long tabletId) { if (replicaMetaTable.containsRow(tabletId)) { return Lists.newArrayList(replicaMetaTable.row(tabletId).values()); } - return null; + return Lists.newArrayList(); } finally { readUnlock(); } diff --git a/fe/src/main/java/org/apache/doris/clone/BackendLoadStatistic.java b/fe/src/main/java/org/apache/doris/clone/BackendLoadStatistic.java index 8740396f7fc964..a95b8124c93d60 100644 --- a/fe/src/main/java/org/apache/doris/clone/BackendLoadStatistic.java +++ b/fe/src/main/java/org/apache/doris/clone/BackendLoadStatistic.java @@ -25,6 +25,7 @@ import org.apache.doris.common.util.DebugUtil; import org.apache.doris.system.Backend; import org.apache.doris.system.SystemInfoService; +import org.apache.doris.thrift.TStorageMedium; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; @@ -241,15 +242,14 @@ public boolean hasAvailDisk() { /* * Classify the paths into 'low', 'mid' and 'high', - * and skip offline path + * and skip offline path, and path with different storage medium */ public void getPathStatisticByClass( - Set low, - Set mid, - Set high) { + Set low, Set mid, Set high, TStorageMedium storageMedium) { for (RootPathLoadStatistic pathStat : pathStatistics) { - if (pathStat.getDiskState() == DiskState.OFFLINE) { + if (pathStat.getDiskState() == DiskState.OFFLINE + || (storageMedium != null && pathStat.getStorageMedium() != storageMedium)) { continue; } diff --git a/fe/src/main/java/org/apache/doris/clone/LoadBalancer.java b/fe/src/main/java/org/apache/doris/clone/LoadBalancer.java index abf81181bf6043..c597e436836f7f 100644 --- a/fe/src/main/java/org/apache/doris/clone/LoadBalancer.java +++ b/fe/src/main/java/org/apache/doris/clone/LoadBalancer.java @@ -119,7 +119,7 @@ private List selectAlternativeTabletsForCluster( Set pathLow = Sets.newHashSet(); Set pathMid = Sets.newHashSet(); Set pathHigh = Sets.newHashSet(); - beStat.getPathStatisticByClass(pathLow, pathMid, pathHigh); + beStat.getPathStatisticByClass(pathLow, pathMid, pathHigh, null); // we only select tablets from available mid and high load path pathHigh.addAll(pathMid); @@ -273,7 +273,7 @@ public void createBalanceTask(TabletSchedCtx tabletCtx, Map back Set pathLow = Sets.newHashSet(); Set pathMid = Sets.newHashSet(); Set pathHigh = Sets.newHashSet(); - beStat.getPathStatisticByClass(pathLow, pathMid, pathHigh); + beStat.getPathStatisticByClass(pathLow, pathMid, pathHigh, tabletCtx.getStorageMedium()); pathLow.addAll(pathMid); long pathHash = slot.takeAnAvailBalanceSlotFrom(pathLow); diff --git a/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java b/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java index 73e5279c74d873..ca4204ebb1cd24 100644 --- a/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java +++ b/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java @@ -494,7 +494,9 @@ public void chooseDestReplicaForVersionIncomplete(Map backendsWo continue; } - if (replica.getLastFailedVersion() <= 0) { + if (replica.getLastFailedVersion() <= 0 && replica.getVersion() == visibleVersion + && replica.getVersionHash() == visibleVersionHash) { + // skip healthy replica continue; }