This is an automated email from the ASF dual-hosted git repository.
tanxinyu pushed a commit to branch rc/1.3.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rc/1.3.3 by this push:
new 8ed0603df6b [To rc/1.3.3] Add clusterId check when restarting nodes
(#13346)
8ed0603df6b is described below
commit 8ed0603df6b82e069ae8a54cbd00d63270c135d3
Author: Xiangpeng Hu <[email protected]>
AuthorDate: Thu Aug 29 23:16:14 2024 +0800
[To rc/1.3.3] Add clusterId check when restarting nodes (#13346)
---
.../iotdb/confignode/conf/ConfigNodeConfig.java | 2 +-
.../iotdb/confignode/manager/ConfigManager.java | 2 ++
.../manager/node/ClusterNodeStartUtils.java | 19 +++++++++++++++++++
.../iotdb/confignode/manager/node/NodeManager.java | 11 ++++++++---
.../apache/iotdb/confignode/service/ConfigNode.java | 2 +-
.../org/apache/iotdb/db/conf/IoTDBStartCheck.java | 8 ++++++++
.../java/org/apache/iotdb/db/service/DataNode.java | 20 +++++++++++++++-----
.../src/main/thrift/confignode.thrift | 2 ++
8 files changed, 56 insertions(+), 10 deletions(-)
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java
index 1257e9246e9..86bc4e579ed 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java
@@ -35,7 +35,7 @@ import java.util.Arrays;
public class ConfigNodeConfig {
- /** ClusterId, the default value "defaultCluster" will be changed after join
cluster. */
+ /** ClusterName, the default value "defaultCluster" will be changed after
join cluster. */
private volatile String clusterName = "defaultCluster";
/** ConfigNodeId, the default value -1 will be changed after join cluster. */
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 2e40eb4c572..cccc5d3751a 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -445,6 +445,7 @@ public class ConfigManager implements IManager {
ClusterNodeStartUtils.confirmNodeRestart(
NodeType.DataNode,
req.getClusterName(),
+ req.getClusterId(),
req.getDataNodeConfiguration().getLocation().getDataNodeId(),
req.getDataNodeConfiguration().getLocation(),
this);
@@ -477,6 +478,7 @@ public class ConfigManager implements IManager {
ClusterNodeStartUtils.confirmNodeRestart(
NodeType.AINode,
req.getClusterName(),
+ req.getClusterId(),
req.getAiNodeConfiguration().getLocation().getAiNodeId(),
req.getAiNodeConfiguration().getLocation(),
this);
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
index df6e2d80305..877696cd0d9 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
@@ -211,6 +211,7 @@ public class ClusterNodeStartUtils {
public static TSStatus confirmNodeRestart(
NodeType nodeType,
String clusterName,
+ String clusterId,
int nodeId,
Object nodeLocation,
ConfigManager configManager) {
@@ -314,6 +315,24 @@ public class ClusterNodeStartUtils {
break;
}
+ // check clusterId if not empty
+ if (clusterId != null
+ && !clusterId.isEmpty()
+ &&
!clusterId.equals(configManager.getClusterManager().getClusterId())) {
+ status.setCode(TSStatusCode.REJECT_NODE_START.getStatusCode());
+ status.setMessage(
+ String.format(
+ "Reject %s restart. Because the clusterId of the current %s and
the target cluster are inconsistent. "
+ + "ClusterId of the current Node: %s, ClusterId of the
target cluster: %s."
+ + POSSIBLE_SOLUTIONS
+ + "\t1. Please check if the node configuration or path is
correct.",
+ nodeType.getNodeType(),
+ nodeType.getNodeType(),
+ clusterId,
+ configManager.getClusterManager().getClusterId()));
+ return status;
+ }
+
if (!acceptRestart) {
/* Reject restart because some internal TEndPoints have been changed */
status.setCode(TSStatusCode.REJECT_NODE_START.getStatusCode());
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
index 0217d392098..f7cf5a78e5d 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -61,6 +61,7 @@ import
org.apache.iotdb.confignode.consensus.response.datanode.ConfigurationResp
import
org.apache.iotdb.confignode.consensus.response.datanode.DataNodeConfigurationResp;
import
org.apache.iotdb.confignode.consensus.response.datanode.DataNodeRegisterResp;
import
org.apache.iotdb.confignode.consensus.response.datanode.DataNodeToStatusResp;
+import org.apache.iotdb.confignode.manager.ClusterManager;
import org.apache.iotdb.confignode.manager.ConfigManager;
import org.apache.iotdb.confignode.manager.IManager;
import org.apache.iotdb.confignode.manager.TTLManager;
@@ -260,6 +261,7 @@ public class NodeManager {
getPipeManager().getPipePluginCoordinator().getPipePluginTable().getAllPipePluginMeta());
runtimeConfiguration.setAllTTLInformation(
DataNodeRegisterResp.convertAllTTLInformation(getTTLManager().getAllTTL()));
+ runtimeConfiguration.setClusterId(getClusterManager().getClusterId());
return runtimeConfiguration;
} finally {
getTriggerManager().getTriggerInfo().releaseTriggerTableLock();
@@ -313,8 +315,7 @@ public class NodeManager {
resp.setStatus(ClusterNodeStartUtils.ACCEPT_NODE_REGISTRATION);
resp.setDataNodeId(
registerDataNodePlan.getDataNodeConfiguration().getLocation().getDataNodeId());
- String clusterId = configManager.getClusterManager().getClusterId();
-
resp.setRuntimeConfiguration(getRuntimeConfiguration().setClusterId(clusterId));
+ resp.setRuntimeConfiguration(getRuntimeConfiguration());
return resp;
}
@@ -358,7 +359,7 @@ public class NodeManager {
}
resp.setStatus(ClusterNodeStartUtils.ACCEPT_NODE_RESTART);
-
resp.setRuntimeConfiguration(getRuntimeConfiguration().setClusterId(clusterId));
+ resp.setRuntimeConfiguration(getRuntimeConfiguration());
List<TConsensusGroupId> consensusGroupIds =
getPartitionManager().getAllReplicaSets(nodeId).stream()
.map(TRegionReplicaSet::getRegionId)
@@ -1102,6 +1103,10 @@ public class NodeManager {
return configManager.getClusterSchemaManager();
}
+ private ClusterManager getClusterManager() {
+ return configManager.getClusterManager();
+ }
+
private PartitionManager getPartitionManager() {
return configManager.getPartitionManager();
}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
index a7f9d3d69a0..4b9daca9f55 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
@@ -232,7 +232,7 @@ public class ConfigNode extends ServerCommandLine
implements ConfigNodeMBean {
"The current {} is now starting as the Seed-ConfigNode.",
ConfigNodeConstant.GLOBAL_NAME);
- /* Always set ClusterId and ConfigNodeId before initConsensusManager */
+ /* Always set ConfigNodeId before initConsensusManager */
CONF.setConfigNodeId(SEED_CONFIG_NODE_ID);
configManager.initConsensusManager();
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
index 989a3328aa7..1795ffc4a8f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
@@ -95,6 +95,7 @@ public class IoTDBStartCheck {
private static final String IOTDB_VERSION_STRING = "iotdb_version";
private static final String COMMIT_ID_STRING = "commit_id";
private static final String DATA_NODE_ID = "data_node_id";
+ private static final String CLUSTER_ID = "cluster_id";
private static final String SCHEMA_REGION_CONSENSUS_PROTOCOL =
"schema_region_consensus_protocol";
private static final String DATA_REGION_CONSENSUS_PROTOCOL =
"data_region_consensus_protocol";
// endregion
@@ -267,6 +268,9 @@ public class IoTDBStartCheck {
if (properties.containsKey(DATA_NODE_ID)) {
config.setDataNodeId(Integer.parseInt(properties.getProperty(DATA_NODE_ID)));
}
+ if (properties.containsKey(CLUSTER_ID)) {
+ config.setClusterId(properties.getProperty(CLUSTER_ID));
+ }
if (properties.containsKey(SCHEMA_REGION_CONSENSUS_PROTOCOL)) {
config.setSchemaRegionConsensusProtocolClass(
properties.getProperty(SCHEMA_REGION_CONSENSUS_PROTOCOL));
@@ -289,6 +293,10 @@ public class IoTDBStartCheck {
systemPropertiesHandler.put(DATA_NODE_ID, String.valueOf(dataNodeId));
}
+ public void serializeClusterID(String clusterId) throws IOException {
+ systemPropertiesHandler.put(CLUSTER_ID, clusterId);
+ }
+
public boolean checkConsensusProtocolExists(TConsensusGroupType type) {
if (type == TConsensusGroupType.DataRegion) {
return properties.containsKey(DATA_REGION_CONSENSUS_PROTOCOL);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
index 31df10be7c5..fab7eb620d3 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
@@ -176,10 +176,7 @@ public class DataNode extends ServerCommandLine implements
DataNodeMBean {
public static void reinitializeStatics() {
registerManager = new RegisterManager();
DataNodeSystemPropertiesHandler.getInstance()
- .resetFilePath(
- IoTDBDescriptor.getInstance().getConfig().getSystemDir()
- + File.separator
- + PROPERTIES_FILE_NAME);
+ .resetFilePath(config.getSystemDir() + File.separator +
PROPERTIES_FILE_NAME);
}
private static RegisterManager registerManager = new RegisterManager();
@@ -448,7 +445,8 @@ public class DataNode extends ServerCommandLine implements
DataNodeMBean {
initTTLInformation(runtimeConfiguration.getAllTTLInformation());
/* Store cluster ID */
-
IoTDBDescriptor.getInstance().getConfig().setClusterId(runtimeConfiguration.getClusterId());
+ String clusterId = runtimeConfiguration.getClusterId();
+ storeClusterID(clusterId);
}
/**
@@ -581,6 +579,7 @@ public class DataNode extends ServerCommandLine implements
DataNodeMBean {
config.getClusterName() == null ? DEFAULT_CLUSTER_NAME :
config.getClusterName());
req.setDataNodeConfiguration(generateDataNodeConfiguration());
req.setVersionInfo(new TNodeVersionInfo(IoTDBConstant.VERSION,
IoTDBConstant.BUILD_INFO));
+ req.setClusterId(config.getClusterId());
TDataNodeRestartResp dataNodeRestartResp = null;
while (retry > 0) {
try (ConfigNodeClient configNodeClient =
@@ -1077,6 +1076,17 @@ public class DataNode extends ServerCommandLine
implements DataNodeMBean {
}
}
+ private void storeClusterID(String clusterID) throws StartupException {
+ try {
+ if (config.getClusterId().isEmpty()) {
+ config.setClusterId(clusterID);
+ IoTDBStartCheck.getInstance().serializeClusterID(clusterID);
+ }
+ } catch (IOException e) {
+ throw new StartupException(e);
+ }
+ }
+
private void initSchemaEngine() {
long startTime = System.currentTimeMillis();
SchemaEngine.getInstance().init();
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index 65a85960246..c040b300747 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -126,6 +126,7 @@ struct TDataNodeRestartReq {
1: required string clusterName
2: required common.TDataNodeConfiguration dataNodeConfiguration
3: optional TNodeVersionInfo versionInfo
+ 4: optional string clusterId
}
struct TDataNodeRestartResp {
@@ -1004,6 +1005,7 @@ struct TAINodeRestartReq{
1: required string clusterName
2: required common.TAINodeConfiguration aiNodeConfiguration
3: optional TNodeVersionInfo versionInfo
+ 4: optional string clusterId
}
struct TAINodeRestartResp{