From b2cb0d01258a84af0dbd3ba4efda6eb4cecf1c8e Mon Sep 17 00:00:00 2001 From: morningman Date: Tue, 13 Aug 2019 17:59:32 +0800 Subject: [PATCH] Fix bug that bad replica can not be synchronized when report When the replica is recovered from bad on BE, the report process should change the bad status of replica on FE to false, or the replica can not be recovered. --- fe/src/main/java/org/apache/doris/catalog/Catalog.java | 1 + .../org/apache/doris/catalog/TabletInvertedIndex.java | 10 ++++++++-- .../java/org/apache/doris/master/ReportHandler.java | 6 ++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/fe/src/main/java/org/apache/doris/catalog/Catalog.java b/fe/src/main/java/org/apache/doris/catalog/Catalog.java index 0cc9aa638ae7e4..26330385e36b6f 100644 --- a/fe/src/main/java/org/apache/doris/catalog/Catalog.java +++ b/fe/src/main/java/org/apache/doris/catalog/Catalog.java @@ -4227,6 +4227,7 @@ private void unprotectUpdateReplica(ReplicaPersistInfo info) { Replica replica = tablet.getReplicaByBackendId(info.getBackendId()); Preconditions.checkNotNull(replica, info); replica.updateVersionInfo(info.getVersion(), info.getVersionHash(), info.getDataSize(), info.getRowCount()); + replica.setBad(false); } public void replayAddReplica(ReplicaPersistInfo info) { 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 b87a5f3d69e307..a6006620554bff 100644 --- a/fe/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java +++ b/fe/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java @@ -349,11 +349,17 @@ private boolean needSync(Replica replicaInFe, TTabletInfo backendTabletInfo) { } long versionInFe = replicaInFe.getVersion(); long versionHashInFe = replicaInFe.getVersionHash(); + if (backendTabletInfo.getVersion() > versionInFe - || (versionInFe == backendTabletInfo.getVersion() - && versionHashInFe != backendTabletInfo.getVersion_hash())) { + || (versionInFe == backendTabletInfo.getVersion() && versionHashInFe != backendTabletInfo.getVersion_hash())) { + // backend replica's version is larger or newer than replica in FE, sync it. + return true; + } else if (versionInFe == backendTabletInfo.getVersion() && versionHashInFe == backendTabletInfo.getVersion_hash() + && replicaInFe.isBad()) { + // backend replica's version is equal to replica in FE, but replica in FE is bad, while backend replica is good, sync it return true; } + return false; } diff --git a/fe/src/main/java/org/apache/doris/master/ReportHandler.java b/fe/src/main/java/org/apache/doris/master/ReportHandler.java index a040ad70a70d35..462ddde216144e 100644 --- a/fe/src/main/java/org/apache/doris/master/ReportHandler.java +++ b/fe/src/main/java/org/apache/doris/master/ReportHandler.java @@ -436,7 +436,8 @@ private static void sync(Map backendTablets, ListMultimap backendTablets, ListMultimap