From d0b757c03a04b38150aa5b050cc4c2cd2367b373 Mon Sep 17 00:00:00 2001 From: Lei Zhang <1091517373@qq.com> Date: Fri, 1 Jul 2022 11:12:36 +0800 Subject: [PATCH] [bugfix](fe) fix add follower failed due to conflict socket . (#10429) --- .../org/apache/doris/catalog/Catalog.java | 4 +++- .../main/java/org/apache/doris/ha/BDBHA.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java index 534bb7fad0..b1818105ff 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java @@ -2464,10 +2464,12 @@ public class Catalog { fe = new Frontend(role, nodeName, host, editLogPort); frontends.put(nodeName, fe); + BDBHA bdbha = (BDBHA) haProtocol; if (role == FrontendNodeType.FOLLOWER || role == FrontendNodeType.REPLICA) { - ((BDBHA) getHaProtocol()).addHelperSocket(host, editLogPort); + bdbha.addHelperSocket(host, editLogPort); helperNodes.add(Pair.create(host, editLogPort)); } + bdbha.removeConflictNodeIfExist(host, editLogPort); editLog.logAddFrontend(fe); } finally { unlock(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/ha/BDBHA.java b/fe/fe-core/src/main/java/org/apache/doris/ha/BDBHA.java index e6fbcd3183..22d15373d8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/ha/BDBHA.java +++ b/fe/fe-core/src/main/java/org/apache/doris/ha/BDBHA.java @@ -221,4 +221,23 @@ public class BDBHA implements HAProtocol { LOG.info("add {}:{} to helper sockets", ip, port); } } + + public void removeConflictNodeIfExist(String host, int port) { + ReplicationGroupAdmin replicationGroupAdmin = environment.getReplicationGroupAdmin(); + if (replicationGroupAdmin == null) { + return; + } + + List conflictNodes = Lists.newArrayList(); + Set replicationNodes = replicationGroupAdmin.getGroup().getElectableNodes(); + for (ReplicationNode replicationNode : replicationNodes) { + if (replicationNode.getHostName().equals(host) && replicationNode.getPort() == port) { + conflictNodes.add(replicationNode.getName()); + } + } + + for (String conflictNode : conflictNodes) { + removeElectableNode(conflictNode); + } + } }