diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java index fd3668938cc3b2..8e3ab510660b23 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java +++ b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java @@ -489,8 +489,10 @@ public void chooseSrcReplica(Map backendsWorkingSlots) throws Sc if (candidates.isEmpty()) { throw new SchedException(Status.UNRECOVERABLE, "unable to find source replica"); } - + // choose a replica which slot is available from candidates. + long minVersionCount = Long.MAX_VALUE; + boolean findSrcReplica = false; for (Replica srcReplica : candidates) { PathSlot slot = backendsWorkingSlots.get(srcReplica.getBackendId()); if (slot == null) { @@ -499,10 +501,26 @@ public void chooseSrcReplica(Map backendsWorkingSlots) throws Sc long srcPathHash = slot.takeSlot(srcReplica.getPathHash()); if (srcPathHash != -1) { - setSrc(srcReplica); - return; + if (!findSrcReplica) { + // version count is set by report process, so it may not be set yet and default value is -1. + // so we need to check it. + minVersionCount = srcReplica.getVersionCount() == -1 ? Long.MAX_VALUE : srcReplica.getVersionCount(); + setSrc(srcReplica); + findSrcReplica = true; + } else { + long curVerCount = srcReplica.getVersionCount() == -1 ? Long.MAX_VALUE : srcReplica.getVersionCount(); + if (curVerCount < minVersionCount) { + minVersionCount = curVerCount; + setSrc(srcReplica); + findSrcReplica = true; + } + } } } + + if (findSrcReplica) { + return; + } throw new SchedException(Status.SCHEDULE_FAILED, "unable to find source slot"); }