From 1d980d4a82bba40b41041e27d4b65526b3e50f51 Mon Sep 17 00:00:00 2001 From: Yongqiang YANG Date: Sat, 12 Apr 2025 16:57:51 +0800 Subject: [PATCH 1/2] [fix](replica) skip missing version should care catchup --- .../src/main/java/org/apache/doris/catalog/Tablet.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java index 2dfdab1ad3df14..9eceba816c2f53 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java @@ -305,7 +305,7 @@ protected Multimap getNormalReplicaBackendPathMapCloud(String beEndp // for query public List getQueryableReplicas(long visibleVersion, Map> backendAlivePathHashs, - boolean allowFailedVersion) { + boolean allowMissingVersion) { List allQueryableReplica = Lists.newArrayListWithCapacity(replicas.size()); List auxiliaryReplica = Lists.newArrayListWithCapacity(replicas.size()); List deadPathReplica = Lists.newArrayList(); @@ -314,12 +314,7 @@ public List getQueryableReplicas(long visibleVersion, Map 0 && !allowFailedVersion) { - continue; - } - - if (!replica.checkVersionCatchUp(visibleVersion, false)) { + if (!replica.checkVersionCatchUp(visibleVersion, false) && !allowMissingVersion) { continue; } From 46efe5cdb68f90d79c103674d81961c951038b81 Mon Sep 17 00:00:00 2001 From: Yongqiang YANG Date: Mon, 14 Apr 2025 13:55:18 +0800 Subject: [PATCH 2/2] resolve comment --- .../java/org/apache/doris/catalog/Tablet.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java index 9eceba816c2f53..ca7f51da823576 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java @@ -303,18 +303,29 @@ protected Multimap getNormalReplicaBackendPathMapCloud(String beEndp (rep, be) -> ((CloudReplica) rep).getBackendId(be)); } + // When a BE reports a missing version, lastFailedVersion is set. When a write fails on a replica, + // lastFailedVersion is set. // for query public List getQueryableReplicas(long visibleVersion, Map> backendAlivePathHashs, boolean allowMissingVersion) { List allQueryableReplica = Lists.newArrayListWithCapacity(replicas.size()); List auxiliaryReplica = Lists.newArrayListWithCapacity(replicas.size()); List deadPathReplica = Lists.newArrayList(); + List mayMissingVersionReplica = Lists.newArrayList(); + List notCatchupReplica = Lists.newArrayList(); + for (Replica replica : replicas) { if (replica.isBad()) { continue; } - if (!replica.checkVersionCatchUp(visibleVersion, false) && !allowMissingVersion) { + if (replica.getLastFailedVersion() > 0) { + mayMissingVersionReplica.add(replica); + continue; + } + + if (!replica.checkVersionCatchUp(visibleVersion, false)) { + notCatchupReplica.add(replica); continue; } @@ -340,6 +351,15 @@ public List getQueryableReplicas(long visibleVersion, Map 1) { long minVersionCount = allQueryableReplica.stream().mapToLong(Replica::getVisibleVersionCount) .filter(count -> count != -1).min().orElse(Long.MAX_VALUE);