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{

Reply via email to