[fix](replica) skip missing version should care catchup (#49999) (#50094) (#52386)

pick  (#49999) (#50094)
This commit is contained in:
Yongqiang YANG
2025-07-03 08:32:06 +08:00
committed by GitHub
parent cabd664c7a
commit d374b6e1e4

View File

@ -280,23 +280,27 @@ public class Tablet extends MetaObject implements Writable {
return map;
}
// When a BE reports a missing version, lastFailedVersion is set. When a write fails on a replica,
// lastFailedVersion is set.
// for query
public List<Replica> getQueryableReplicas(long visibleVersion, Map<Long, Set<Long>> backendAlivePathHashs,
boolean allowFailedVersion) {
boolean allowMissingVersion) {
List<Replica> allQueryableReplica = Lists.newArrayListWithCapacity(replicas.size());
List<Replica> auxiliaryReplica = Lists.newArrayListWithCapacity(replicas.size());
List<Replica> deadPathReplica = Lists.newArrayList();
List<Replica> mayMissingVersionReplica = Lists.newArrayList();
List<Replica> notCatchupReplica = Lists.newArrayList();
for (Replica replica : replicas) {
if (replica.isBad()) {
continue;
}
// Skip the missing version replica
if (replica.getLastFailedVersion() > 0 && !allowFailedVersion) {
if (!replica.checkVersionCatchUp(visibleVersion, false)) {
notCatchupReplica.add(replica);
continue;
}
if (!replica.checkVersionCatchUp(visibleVersion, false)) {
if (replica.getLastFailedVersion() > 0) {
mayMissingVersionReplica.add(replica);
continue;
}
@ -322,6 +326,15 @@ public class Tablet extends MetaObject implements Writable {
allQueryableReplica = deadPathReplica;
}
if (allQueryableReplica.isEmpty()) {
// If be misses a version, be would report failure.
allQueryableReplica = mayMissingVersionReplica;
}
if (allQueryableReplica.isEmpty() && allowMissingVersion) {
allQueryableReplica = notCatchupReplica;
}
if (Config.skip_compaction_slower_replica && allQueryableReplica.size() > 1) {
long minVersionCount = allQueryableReplica.stream().mapToLong(Replica::getVisibleVersionCount)
.filter(count -> count != -1).min().orElse(Long.MAX_VALUE);