diff --git a/fe/fe-core/src/main/java/com/starrocks/server/GlobalStateMgr.java b/fe/fe-core/src/main/java/com/starrocks/server/GlobalStateMgr.java index 9897725a66157a..01681567031c32 100644 --- a/fe/fe-core/src/main/java/com/starrocks/server/GlobalStateMgr.java +++ b/fe/fe-core/src/main/java/com/starrocks/server/GlobalStateMgr.java @@ -1214,15 +1214,6 @@ public boolean isReady() { return isReady.get(); } - public static String genFeNodeName(String host, int port, boolean isOldStyle) { - String name = host + "_" + port; - if (isOldStyle) { - return name; - } else { - return name + "_" + System.currentTimeMillis(); - } - } - private void transferToLeader() { FrontendNodeType oldType = feType; // stop replayer diff --git a/fe/fe-core/src/main/java/com/starrocks/server/NodeMgr.java b/fe/fe-core/src/main/java/com/starrocks/server/NodeMgr.java index ed4a4dd47d44db..462b79d9e8265f 100644 --- a/fe/fe-core/src/main/java/com/starrocks/server/NodeMgr.java +++ b/fe/fe-core/src/main/java/com/starrocks/server/NodeMgr.java @@ -309,7 +309,7 @@ public void getClusterIdAndRoleOnStartup() throws IOException { // For compatibility. Because this is the very first time to start, so we arbitrarily choose // a new name for this node role = FrontendNodeType.FOLLOWER; - nodeName = GlobalStateMgr.genFeNodeName(selfNode.first, selfNode.second, false /* new style */); + nodeName = genFeNodeName(selfNode.first, selfNode.second, false /* new style */); storage.writeFrontendRoleAndNodeName(role, nodeName); LOG.info("very first time to start this node. role: {}, node name: {}", role.name(), nodeName); } else { @@ -320,9 +320,18 @@ public void getClusterIdAndRoleOnStartup() throws IOException { // But we will get a empty nodeName after upgrading. // So for forward compatibility, we use the "old-style" way of naming: "ip_port", // and update the ROLE file. - nodeName = GlobalStateMgr.genFeNodeName(selfNode.first, selfNode.second, true/* old style */); + nodeName = genFeNodeName(selfNode.first, selfNode.second, true/* old style */); storage.writeFrontendRoleAndNodeName(role, nodeName); LOG.info("forward compatibility. role: {}, node name: {}", role.name(), nodeName); + } else if (Config.bdbje_reset_election_group + && !isFeNodeNameValid(nodeName, selfNode.first, selfNode.second)) { + // Invalid node name, usually happened when the image dir is copied from another node. + // Correct the node name + String oldNodeName = nodeName; + nodeName = genFeNodeName(selfNode.first, selfNode.second, false /* new style */); + storage.writeFrontendRoleAndNodeName(role, nodeName); + LOG.info("correct the node name {} to new node name: {}, role: {}", oldNodeName, nodeName, + role.name()); } } Preconditions.checkNotNull(role); @@ -534,7 +543,7 @@ private boolean getFeNodeTypeAndNameFromHelpers() { if (Strings.isNullOrEmpty(nodeName)) { // For forward compatibility, we use old-style name: "ip_port" - nodeName = GlobalStateMgr.genFeNodeName(selfNode.first, selfNode.second, true /* old style */); + nodeName = genFeNodeName(selfNode.first, selfNode.second, true /* old style */); } } catch (Exception e) { LOG.warn("failed to get fe node type from helper node: {}.", helperNode, e); @@ -750,7 +759,7 @@ public void addFrontend(FrontendNodeType role, String host, int editLogPort) thr throw new DdlException("unknown fqdn host: " + host); } - String nodeName = GlobalStateMgr.genFeNodeName(host, editLogPort, false /* new name style */); + String nodeName = genFeNodeName(host, editLogPort, false /* new name style */); if (removedFrontends.contains(nodeName)) { throw new DdlException("frontend name already exists " + nodeName + ". Try again"); @@ -1255,4 +1264,17 @@ public boolean isElectable() { public void setImageDir(String imageDir) { this.imageDir = imageDir; } + + public static String genFeNodeName(String host, int port, boolean isOldStyle) { + String name = host + "_" + port; + if (isOldStyle) { + return name; + } else { + return name + "_" + System.currentTimeMillis(); + } + } + + public static boolean isFeNodeNameValid(String nodeName, String host, int port) { + return nodeName.startsWith(host + "_" + port); + } }