Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Enhancement] Correct fe node name if needed when fe start with bdbje_reset_election_group (backport #54399) #54436

Merged
merged 1 commit into from
Dec 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 26 additions & 4 deletions fe/fe-core/src/main/java/com/starrocks/server/NodeMgr.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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);
}
}
Loading