This is an automated email from the ASF dual-hosted git repository.

qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 2469c0b1cf [IOTDB-3108] Optimize register process of datanode (#5818)
2469c0b1cf is described below

commit 2469c0b1cfaeba0bbe9f150af42d0820bb8df0e4
Author: Mrquan <[email protected]>
AuthorDate: Sun May 8 22:36:34 2022 +0800

    [IOTDB-3108] Optimize register process of datanode (#5818)
---
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     |  4 +-
 .../iotdb/confignode/manager/ConfigManager.java    |  3 +-
 .../iotdb/confignode/manager/NodeManager.java      |  2 +-
 .../iotdb/db/integration/IoTDBCheckConfigIT.java   |  8 ++--
 .../org/apache/iotdb/db/auth/AuthorityChecker.java |  5 +-
 .../apache/iotdb/db/client/ConfigNodeClient.java   | 19 +++++---
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 26 +++++-----
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  | 56 ++++++----------------
 ...{IoTDBConfigCheck.java => IoTDBStartCheck.java} | 54 ++++++++++++++++++---
 .../mpp/plan/analyze/ClusterPartitionFetcher.java  |  3 +-
 .../execution/config/AuthorizerConfigTask.java     |  5 +-
 .../execution/config/CountStorageGroupTask.java    |  3 +-
 .../plan/execution/config/SetStorageGroupTask.java |  3 +-
 .../db/mpp/plan/execution/config/SetTTLTask.java   |  3 +-
 .../execution/config/ShowStorageGroupTask.java     |  3 +-
 .../db/mpp/plan/execution/config/ShowTTLTask.java  |  3 +-
 .../java/org/apache/iotdb/db/service/DataNode.java | 33 ++++++++-----
 .../java/org/apache/iotdb/db/service/IoTDB.java    |  4 +-
 18 files changed, 130 insertions(+), 107 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java 
b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
index 9138a98ca2..2910a3fd47 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
@@ -65,8 +65,8 @@ import org.apache.iotdb.commons.service.RegisterManager;
 import org.apache.iotdb.commons.service.ThriftServiceThread;
 import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBConfig;
-import org.apache.iotdb.db.conf.IoTDBConfigCheck;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.conf.IoTDBStartCheck;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.service.basic.ServiceProvider;
@@ -225,7 +225,7 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
   }
 
   protected boolean serverCheckAndInit() throws ConfigurationException, 
IOException {
-    IoTDBConfigCheck.getInstance().checkConfig();
+    IoTDBStartCheck.getInstance().checkConfig();
     IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
     // init server's configuration first, because the cluster configuration 
may read settings from
     // the server's configuration.
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 824800e937..9d992c5cf2 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -46,6 +46,7 @@ import 
org.apache.iotdb.confignode.consensus.response.DataPartitionResp;
 import org.apache.iotdb.confignode.consensus.response.PermissionInfoResp;
 import org.apache.iotdb.confignode.consensus.response.SchemaPartitionResp;
 import org.apache.iotdb.confignode.consensus.response.StorageGroupSchemaResp;
+import org.apache.iotdb.confignode.persistence.NodeInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterResp;
 import org.apache.iotdb.consensus.common.DataSet;
@@ -103,7 +104,7 @@ public class ConfigManager implements Manager {
     } else {
       DataNodeConfigurationResp dataSet = new DataNodeConfigurationResp();
       dataSet.setStatus(status);
-      
dataSet.setConfigNodeList(ConfigNodeDescriptor.getInstance().getConf().getConfigNodeList());
+      dataSet.setConfigNodeList(NodeInfo.getInstance().getOnlineConfigNodes());
       return dataSet;
     }
   }
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java
index 059450f691..47d3aa7d77 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java
@@ -97,7 +97,7 @@ public class NodeManager {
     }
 
     dataSet.setDataNodeId(req.getLocation().getDataNodeId());
-    
dataSet.setConfigNodeList(ConfigNodeDescriptor.getInstance().getConf().getConfigNodeList());
+    dataSet.setConfigNodeList(nodeInfo.getOnlineConfigNodes());
     setGlobalConfig(dataSet);
     return dataSet;
   }
diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBCheckConfigIT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBCheckConfigIT.java
index 43572d1aa6..488522cf59 100644
--- 
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBCheckConfigIT.java
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBCheckConfigIT.java
@@ -20,8 +20,8 @@ package org.apache.iotdb.db.integration;
 
 import org.apache.iotdb.commons.exception.ConfigurationException;
 import org.apache.iotdb.commons.file.SystemFileFactory;
-import org.apache.iotdb.db.conf.IoTDBConfigCheck;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.conf.IoTDBStartCheck;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.itbase.category.LocalStandaloneTest;
@@ -90,7 +90,7 @@ public class IoTDBCheckConfigIT {
 
   @Test
   public void testSaveTimeEncoderToSystemProperties() throws Exception {
-    IoTDBConfigCheck.getInstance().checkConfig();
+    IoTDBStartCheck.getInstance().checkConfig();
     // read properties from system.properties
     try (FileInputStream inputStream = new FileInputStream(propertiesFile);
         InputStreamReader inputStreamReader =
@@ -110,7 +110,7 @@ public class IoTDBCheckConfigIT {
     writeSystemFile();
     EnvironmentUtils.reactiveDaemon();
     try {
-      IoTDBConfigCheck.getInstance().checkConfig();
+      IoTDBStartCheck.getInstance().checkConfig();
     } catch (ConfigurationException t) {
       assertEquals("time_encoder", t.getParameter());
       assertEquals("REGULAR", t.getCorrectValue());
@@ -128,7 +128,7 @@ public class IoTDBCheckConfigIT {
     writeSystemFile();
     EnvironmentUtils.reactiveDaemon();
     try {
-      IoTDBConfigCheck.getInstance().checkConfig();
+      IoTDBStartCheck.getInstance().checkConfig();
     } catch (Throwable t) {
       fail(t.getMessage());
     }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java 
b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
index 990ec5bb9b..6a42fd8f54 100644
--- a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
+++ b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java
@@ -24,7 +24,6 @@ import 
org.apache.iotdb.commons.auth.authorizer.AuthorizerManager;
 import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.confignode.rpc.thrift.TCheckUserPrivilegesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TLoginReq;
@@ -163,7 +162,7 @@ public class AuthorityChecker {
       configNodeClient = new ConfigNodeClient();
       // Send request to some API server
       status = configNodeClient.login(req);
-    } catch (IoTDBConnectionException | BadNodeUrlException e) {
+    } catch (IoTDBConnectionException e) {
       throw new ConfigNodeConnectionException("Couldn't connect config node");
     } finally {
       if (configNodeClient != null) {
@@ -216,7 +215,7 @@ public class AuthorityChecker {
       configNodeClient = new ConfigNodeClient();
       // Send request to some API server
       status = configNodeClient.checkUserPrivileges(req);
-    } catch (IoTDBConnectionException | BadNodeUrlException e) {
+    } catch (IoTDBConnectionException e) {
       throw new ConfigNodeConnectionException("Couldn't connect config node");
     } finally {
       if (configNodeClient != null) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java 
b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index 455a5df3e1..d04767a98f 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -21,12 +21,11 @@ package org.apache.iotdb.db.client;
 
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
-import org.apache.iotdb.commons.utils.NodeUrlUtils;
 import org.apache.iotdb.confignode.rpc.thrift.ConfigIService;
 import org.apache.iotdb.confignode.rpc.thrift.TAuthorizerReq;
 import org.apache.iotdb.confignode.rpc.thrift.TAuthorizerResp;
 import org.apache.iotdb.confignode.rpc.thrift.TCheckUserPrivilegesReq;
+import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeLocation;
 import org.apache.iotdb.confignode.rpc.thrift.TCountStorageGroupResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeLocationResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterReq;
@@ -53,6 +52,7 @@ import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class ConfigNodeClient {
@@ -75,11 +75,9 @@ public class ConfigNodeClient {
 
   private int cursor = 0;
 
-  public ConfigNodeClient() throws BadNodeUrlException, 
IoTDBConnectionException {
+  public ConfigNodeClient() throws IoTDBConnectionException {
     // Read config nodes from configuration
-    configNodes =
-        NodeUrlUtils.parseTEndPointUrls(
-            IoTDBDescriptor.getInstance().getConfig().getConfigNodeUrls());
+    configNodes = 
IoTDBDescriptor.getInstance().getConfig().getConfigNodeList();
     init();
   }
 
@@ -169,10 +167,17 @@ public class ConfigNodeClient {
     for (int i = 0; i < RETRY_NUM; i++) {
       try {
         TDataNodeRegisterResp resp = client.registerDataNode(req);
+
         if (!updateConfigNodeLeader(resp.status)) {
           return resp;
         }
-        logger.info("Register current node using request {} with response {}", 
req, resp);
+
+        // set latest config node list
+        List<TEndPoint> newConfigNodes = new ArrayList<>();
+        for (TConfigNodeLocation configNodeLocation : 
resp.getConfigNodeList()) {
+          newConfigNodes.add(configNodeLocation.getInternalEndPoint());
+        }
+        configNodes = newConfigNodes;
       } catch (TException e) {
         configLeader = null;
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index af37ea72d5..b93929e35f 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.conf;
 
+import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.engine.compaction.constant.CompactionPriority;
@@ -813,11 +814,6 @@ public class IoTDBConfig {
   /** cache size for pages in one schema file */
   private int pageCacheSizeInSchemaFile = 1024;
 
-  /**
-   * Ip and port of config nodes. each one is a {internalIp | domain 
name}:{meta port} string tuple.
-   */
-  private List<String> configNodeUrls = 
Collections.singletonList("127.0.0.1:22277");
-
   /** Internal ip for data node */
   private String internalIp = "127.0.0.1";
 
@@ -827,6 +823,10 @@ public class IoTDBConfig {
   /** Internal port for consensus protocol */
   private int consensusPort = 40010;
 
+  /** Ip and port of config nodes. */
+  private List<TEndPoint> configNodeList =
+      Collections.singletonList(new TEndPoint("127.0.0.1", 22277));
+
   /** The max time of data node waiting to join into the cluster */
   private long joinClusterTimeOutMs = TimeUnit.SECONDS.toMillis(5);
 
@@ -2618,14 +2618,6 @@ public class IoTDBConfig {
     this.pageCacheSizeInSchemaFile = pageCacheSizeInSchemaFile;
   }
 
-  public List<String> getConfigNodeUrls() {
-    return configNodeUrls;
-  }
-
-  public void setConfigNodeUrls(List<String> configNodeUrls) {
-    this.configNodeUrls = configNodeUrls;
-  }
-
   public String getInternalIp() {
     return internalIp;
   }
@@ -2650,6 +2642,14 @@ public class IoTDBConfig {
     this.consensusPort = consensusPort;
   }
 
+  public List<TEndPoint> getConfigNodeList() {
+    return configNodeList;
+  }
+
+  public void setConfigNodeList(List<TEndPoint> configNodeList) {
+    this.configNodeList = configNodeList;
+  }
+
   public long getJoinClusterTimeOutMs() {
     return joinClusterTimeOutMs;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java 
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index 866b786e6f..162fdf0af6 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -18,8 +18,11 @@
  */
 package org.apache.iotdb.db.conf;
 
+import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
+import org.apache.iotdb.commons.exception.BadNodeUrlException;
+import org.apache.iotdb.commons.utils.NodeUrlUtils;
 import org.apache.iotdb.confignode.rpc.thrift.TGlobalConfig;
 import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.engine.StorageEngine;
@@ -57,9 +60,6 @@ import java.net.InetAddress;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
 import java.util.Properties;
 
 public class IoTDBDescriptor {
@@ -947,27 +947,19 @@ public class IoTDBDescriptor {
       
conf.setInternalIp(InetAddress.getByName(conf.getInternalIp()).getHostAddress());
     }
 
-    List<String> newConfigNodeUrls = new ArrayList<>();
-    for (String nodeUrl : conf.getConfigNodeUrls()) {
-      String[] splits = nodeUrl.split(":");
-      if (splits.length != 2) {
-        throw new BadNodeUrlFormatException(nodeUrl);
-      }
-      String nodeIP = splits[0];
-      boolean isInvalidNodeIp = InetAddresses.isInetAddress(nodeIP);
+    for (TEndPoint configNode : conf.getConfigNodeList()) {
+      boolean isInvalidNodeIp = InetAddresses.isInetAddress(configNode.ip);
       if (!isInvalidNodeIp) {
-        String newNodeIP = InetAddress.getByName(nodeIP).getHostAddress();
-        newConfigNodeUrls.add(newNodeIP + ":" + splits[1]);
-      } else {
-        newConfigNodeUrls.add(nodeUrl);
+        String newNodeIP = 
InetAddress.getByName(configNode.ip).getHostAddress();
+        configNode.setIp(newNodeIP);
       }
     }
-    conf.setConfigNodeUrls(newConfigNodeUrls);
+
     logger.debug(
         "after replace, the rpcIP={}, internalIP={}, configNodeUrls={}",
         conf.getRpcAddress(),
         conf.getInternalIp(),
-        conf.getConfigNodeUrls());
+        conf.getConfigNodeList());
   }
 
   private void loadWALProps(Properties properties) {
@@ -1576,8 +1568,12 @@ public class IoTDBDescriptor {
   public void loadClusterProps(Properties properties) {
     String configNodeUrls = properties.getProperty("config_nodes");
     if (configNodeUrls != null) {
-      List<String> urlList = getNodeUrlList(configNodeUrls);
-      conf.setConfigNodeUrls(urlList);
+      try {
+        
conf.setConfigNodeList(NodeUrlUtils.parseTEndPointUrls(configNodeUrls));
+      } catch (BadNodeUrlException e) {
+        logger.error(
+            "Config nodes are set in wrong format, please set them like 
0.0.0.0:22277,0.0.0.0:22281");
+      }
     }
 
     conf.setInternalIp(properties.getProperty("internal_ip", 
conf.getInternalIp()));
@@ -1636,28 +1632,6 @@ public class IoTDBDescriptor {
     }
   }
 
-  /**
-   * Split the node urls as one list.
-   *
-   * @param nodeUrls the config node urls.
-   * @return the node urls as a list.
-   */
-  public static List<String> getNodeUrlList(String nodeUrls) {
-    if (nodeUrls == null) {
-      return Collections.emptyList();
-    }
-    List<String> urlList = new ArrayList<>();
-    String[] split = nodeUrls.split(",");
-    for (String nodeUrl : split) {
-      nodeUrl = nodeUrl.trim();
-      if ("".equals(nodeUrl)) {
-        continue;
-      }
-      urlList.add(nodeUrl);
-    }
-    return urlList;
-  }
-
   // These configurations are received from config node when registering
   public void loadGlobalConfig(TGlobalConfig globalConfig) {
     
conf.setSeriesPartitionExecutorClass(globalConfig.getSeriesPartitionExecutorClass());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java 
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
similarity index 89%
rename from server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
rename to server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
index 49e5ace2a3..bd408eea38 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
@@ -18,9 +18,12 @@
  */
 package org.apache.iotdb.db.conf;
 
+import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
+import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.ConfigurationException;
 import org.apache.iotdb.commons.file.SystemFileFactory;
+import org.apache.iotdb.commons.utils.NodeUrlUtils;
 import org.apache.iotdb.db.metadata.upgrade.MetadataUpgrader;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
@@ -38,13 +41,14 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.nio.file.Files;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 
-public class IoTDBConfigCheck {
+public class IoTDBStartCheck {
 
-  private static final Logger logger = 
LoggerFactory.getLogger(IoTDBConfigCheck.class);
+  private static final Logger logger = 
LoggerFactory.getLogger(IoTDBStartCheck.class);
 
   private static final IoTDBConfig config = 
IoTDBDescriptor.getInstance().getConfig();
 
@@ -108,18 +112,20 @@ public class IoTDBConfigCheck {
 
   private static final String DATA_NODE_ID = "data_node_id";
 
+  private static final String CONFIG_NODE_LIST = "config_node_list";
+
   private static final String IOTDB_VERSION_STRING = "iotdb_version";
 
-  public static IoTDBConfigCheck getInstance() {
+  public static IoTDBStartCheck getInstance() {
     return IoTDBConfigCheckHolder.INSTANCE;
   }
 
   private static class IoTDBConfigCheckHolder {
 
-    private static final IoTDBConfigCheck INSTANCE = new IoTDBConfigCheck();
+    private static final IoTDBStartCheck INSTANCE = new IoTDBStartCheck();
   }
 
-  private IoTDBConfigCheck() {
+  private IoTDBStartCheck() {
     logger.info("Starting IoTDB " + IoTDBConstant.VERSION);
 
     // check whether SCHEMA_DIR exists, create if not exists
@@ -180,10 +186,10 @@ public class IoTDBConfigCheck {
   public void checkConfig() throws ConfigurationException, IOException {
     propertiesFile =
         SystemFileFactory.INSTANCE.getFile(
-            IoTDBConfigCheck.SCHEMA_DIR + File.separator + 
PROPERTIES_FILE_NAME);
+            IoTDBStartCheck.SCHEMA_DIR + File.separator + 
PROPERTIES_FILE_NAME);
     tmpPropertiesFile =
         SystemFileFactory.INSTANCE.getFile(
-            IoTDBConfigCheck.SCHEMA_DIR + File.separator + 
PROPERTIES_FILE_NAME + ".tmp");
+            IoTDBStartCheck.SCHEMA_DIR + File.separator + PROPERTIES_FILE_NAME 
+ ".tmp");
 
     // system init first time, no need to check, write system.properties and 
return
     if (!propertiesFile.exists() && !tmpPropertiesFile.exists()) {
@@ -409,4 +415,38 @@ public class IoTDBConfigCheck {
     // rename system.properties.tmp to system.properties
     FileUtils.moveFile(tmpPropertiesFile, propertiesFile);
   }
+
+  /** call this method to serialize config node list */
+  public void serializeConfigNodeList(List<TEndPoint> configNodeList) throws 
IOException {
+    // create an empty tmpPropertiesFile
+    if (tmpPropertiesFile.createNewFile()) {
+      logger.info("Create system.properties.tmp {}.", tmpPropertiesFile);
+    } else {
+      logger.error("Create system.properties.tmp {} failed.", 
tmpPropertiesFile);
+      System.exit(-1);
+    }
+
+    try (FileOutputStream tmpFOS = new 
FileOutputStream(tmpPropertiesFile.toString())) {
+      properties.setProperty(CONFIG_NODE_LIST, 
NodeUrlUtils.convertTEndPointUrls(configNodeList));
+      properties.store(tmpFOS, SYSTEM_PROPERTIES_STRING);
+      // serialize finished, delete old system.properties file
+      if (propertiesFile.exists()) {
+        Files.delete(propertiesFile.toPath());
+      }
+    }
+    // rename system.properties.tmp to system.properties
+    FileUtils.moveFile(tmpPropertiesFile, propertiesFile);
+  }
+
+  public void loadConfigNodeList() {
+    // properties contain CONFIG_NODE_LIST only when start as Data node
+    try {
+      if (properties.containsKey(CONFIG_NODE_LIST)) {
+        config.setConfigNodeList(
+            
NodeUrlUtils.parseTEndPointUrls(properties.getProperty(CONFIG_NODE_LIST)));
+      }
+    } catch (BadNodeUrlException e) {
+      logger.error("Cannot parse config node list in system.properties");
+    }
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
index 3dffffb032..9ea66f3776 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.mpp.plan.analyze;
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.commons.partition.DataPartitionQueryParam;
@@ -86,7 +85,7 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
   private ClusterPartitionFetcher() {
     try {
       client = new ConfigNodeClient();
-    } catch (IoTDBConnectionException | BadNodeUrlException e) {
+    } catch (IoTDBConnectionException e) {
       throw new StatementAnalyzeException("Couldn't connect config node");
     }
     this.partitionExecutor =
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/AuthorizerConfigTask.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/AuthorizerConfigTask.java
index bc1c4a0236..e3d43e18a7 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/AuthorizerConfigTask.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/AuthorizerConfigTask.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.mpp.plan.execution.config;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.auth.AuthException;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.confignode.rpc.thrift.TAuthorizerReq;
 import org.apache.iotdb.confignode.rpc.thrift.TAuthorizerResp;
 import org.apache.iotdb.db.client.ConfigNodeClient;
@@ -109,7 +108,7 @@ public class AuthorizerConfigTask implements IConfigTask {
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
-    } catch (IoTDBConnectionException | BadNodeUrlException e) {
+    } catch (IoTDBConnectionException e) {
       LOGGER.error("Failed to connect to config node.");
       future.setException(e);
     } finally {
@@ -169,7 +168,7 @@ public class AuthorizerConfigTask implements IConfigTask {
         future.set(
             new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), 
datasetHeader));
       }
-    } catch (IoTDBConnectionException | BadNodeUrlException e) {
+    } catch (IoTDBConnectionException e) {
       LOGGER.error("Failed to connect to config node.");
       future.setException(e);
     } finally {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/CountStorageGroupTask.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/CountStorageGroupTask.java
index 2c51e8dfe7..5f08ae0cce 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/CountStorageGroupTask.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/CountStorageGroupTask.java
@@ -20,7 +20,6 @@
 package org.apache.iotdb.db.mpp.plan.execution.config;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.confignode.rpc.thrift.TCountStorageGroupResp;
 import org.apache.iotdb.db.client.ConfigNodeClient;
@@ -67,7 +66,7 @@ public class CountStorageGroupTask implements IConfigTask {
         client = new ConfigNodeClient();
         TCountStorageGroupResp resp = 
client.countMatchedStorageGroups(storageGroupPathPattern);
         storageGroupNum = resp.getCount();
-      } catch (IoTDBConnectionException | BadNodeUrlException e) {
+      } catch (IoTDBConnectionException e) {
         LOGGER.error("Failed to connect to config node.");
         future.setException(e);
       }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetStorageGroupTask.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetStorageGroupTask.java
index b391254696..f3e5ed34e5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetStorageGroupTask.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetStorageGroupTask.java
@@ -20,7 +20,6 @@
 package org.apache.iotdb.db.mpp.plan.execution.config;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
@@ -73,7 +72,7 @@ public class SetStorageGroupTask implements IConfigTask {
         } else {
           future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
         }
-      } catch (IoTDBConnectionException | BadNodeUrlException e) {
+      } catch (IoTDBConnectionException e) {
         LOGGER.error("Failed to connect to config node.");
         future.setException(e);
       } finally {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetTTLTask.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetTTLTask.java
index 7a56e587f6..0a3af19191 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetTTLTask.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetTTLTask.java
@@ -20,7 +20,6 @@
 package org.apache.iotdb.db.mpp.plan.execution.config;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.confignode.rpc.thrift.TSetTTLReq;
 import org.apache.iotdb.db.client.ConfigNodeClient;
@@ -74,7 +73,7 @@ public class SetTTLTask implements IConfigTask {
         } else {
           future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
         }
-      } catch (IoTDBConnectionException | BadNodeUrlException e) {
+      } catch (IoTDBConnectionException e) {
         LOGGER.error("Failed to connect to config node.");
         future.setException(e);
       } finally {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowStorageGroupTask.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowStorageGroupTask.java
index a2cc411b7b..853a0136a1 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowStorageGroupTask.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowStorageGroupTask.java
@@ -20,7 +20,6 @@
 package org.apache.iotdb.db.mpp.plan.execution.config;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp;
@@ -71,7 +70,7 @@ public class ShowStorageGroupTask implements IConfigTask {
         TStorageGroupSchemaResp resp =
             client.getMatchedStorageGroupSchemas(storageGroupPathPattern);
         storageGroupPaths = new 
ArrayList<>(resp.getStorageGroupSchemaMap().keySet());
-      } catch (IoTDBConnectionException | BadNodeUrlException e) {
+      } catch (IoTDBConnectionException e) {
         LOGGER.error("Failed to connect to config node.");
         future.setException(e);
       } finally {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowTTLTask.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowTTLTask.java
index 6a1c031385..1cb7b0f978 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowTTLTask.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowTTLTask.java
@@ -19,7 +19,6 @@
 
 package org.apache.iotdb.db.mpp.plan.execution.config;
 
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
@@ -88,7 +87,7 @@ public class ShowTTLTask implements IConfigTask {
             }
           }
         }
-      } catch (IoTDBConnectionException | BadNodeUrlException e) {
+      } catch (IoTDBConnectionException e) {
         LOGGER.error("Failed to connect to config node.");
         future.setException(e);
       } finally {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java 
b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
index d6cce8c638..61b764e2eb 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
@@ -22,18 +22,18 @@ import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.commons.concurrent.IoTDBDefaultThreadExceptionHandler;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
-import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.exception.ConfigurationException;
 import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.service.JMXService;
 import org.apache.iotdb.commons.service.RegisterManager;
 import org.apache.iotdb.commons.service.StartupChecks;
+import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeLocation;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterResp;
 import org.apache.iotdb.db.client.ConfigNodeClient;
 import org.apache.iotdb.db.conf.IoTDBConfig;
-import org.apache.iotdb.db.conf.IoTDBConfigCheck;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.conf.IoTDBStartCheck;
 import org.apache.iotdb.db.conf.rest.IoTDBRestServiceDescriptor;
 import org.apache.iotdb.db.consensus.ConsensusImpl;
 import org.apache.iotdb.db.engine.StorageEngineV2;
@@ -64,6 +64,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class DataNode implements DataNodeMBean {
   private static final Logger logger = LoggerFactory.getLogger(DataNode.class);
@@ -98,7 +100,7 @@ public class DataNode implements DataNodeMBean {
   }
 
   protected void serverCheckAndInit() throws ConfigurationException, 
IOException {
-    IoTDBConfigCheck.getInstance().checkConfig();
+    IoTDBStartCheck.getInstance().checkConfig();
     IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
     // TODO: check configuration for data node
 
@@ -134,16 +136,11 @@ public class DataNode implements DataNodeMBean {
 
   public void joinCluster() throws StartupException {
     int retry = DEFAULT_JOIN_RETRY;
-    ConfigNodeClient configNodeClient = null;
-    try {
-      configNodeClient = new ConfigNodeClient();
-    } catch (IoTDBConnectionException | BadNodeUrlException e) {
-      throw new StartupException(e.getMessage());
-    }
 
     while (retry > 0) {
       logger.info("start joining the cluster.");
       try {
+        ConfigNodeClient configNodeClient = new ConfigNodeClient();
         IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
         TDataNodeRegisterReq req = new TDataNodeRegisterReq();
         TDataNodeLocation location = new TDataNodeLocation();
@@ -158,21 +155,35 @@ public class DataNode implements DataNodeMBean {
         req.setDataNodeLocation(location);
 
         TDataNodeRegisterResp dataNodeRegisterResp = 
configNodeClient.registerDataNode(req);
+
+        // store config node lists from resp
+        List<TEndPoint> configNodeList = new ArrayList<>();
+        for (TConfigNodeLocation configNodeLocation : 
dataNodeRegisterResp.getConfigNodeList()) {
+          configNodeList.add(configNodeLocation.getInternalEndPoint());
+        }
+        config.setConfigNodeList(configNodeList);
+        IoTDBStartCheck.getInstance().serializeConfigNodeList(configNodeList);
+
         if (dataNodeRegisterResp.getStatus().getCode()
                 == TSStatusCode.SUCCESS_STATUS.getStatusCode()
             || dataNodeRegisterResp.getStatus().getCode()
                 == TSStatusCode.DATANODE_ALREADY_REGISTERED.getStatusCode()) {
+          logger.info(dataNodeRegisterResp.getStatus().getMessage());
           int dataNodeID = dataNodeRegisterResp.getDataNodeId();
           if (dataNodeID != config.getDataNodeId()) {
-            IoTDBConfigCheck.getInstance().serializeDataNodeId(dataNodeID);
+            IoTDBStartCheck.getInstance().serializeDataNodeId(dataNodeID);
             config.setDataNodeId(dataNodeID);
           }
           
IoTDBDescriptor.getInstance().loadGlobalConfig(dataNodeRegisterResp.globalConfig);
           logger.info("Joined the cluster successfully");
           return;
         }
-      } catch (IOException | IoTDBConnectionException e) {
+      } catch (IOException e) {
+        logger.warn("Cannot join the cluster, because: {}", e.getMessage());
+      } catch (IoTDBConnectionException e) {
+        // read config nodes from system.properties
         logger.warn("Cannot join the cluster, because: {}", e.getMessage());
+        IoTDBStartCheck.getInstance().loadConfigNodeList();
       }
 
       try {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java 
b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index db38f5838a..ba315a5ea1 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -25,8 +25,8 @@ import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.service.JMXService;
 import org.apache.iotdb.commons.service.RegisterManager;
 import org.apache.iotdb.commons.service.StartupChecks;
-import org.apache.iotdb.db.conf.IoTDBConfigCheck;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.conf.IoTDBStartCheck;
 import org.apache.iotdb.db.conf.rest.IoTDBRestServiceCheck;
 import org.apache.iotdb.db.conf.rest.IoTDBRestServiceDescriptor;
 import org.apache.iotdb.db.engine.StorageEngine;
@@ -78,7 +78,7 @@ public class IoTDB implements IoTDBMBean {
 
   public static void main(String[] args) {
     try {
-      IoTDBConfigCheck.getInstance().checkConfig();
+      IoTDBStartCheck.getInstance().checkConfig();
       IoTDBRestServiceCheck.getInstance().checkConfig();
     } catch (ConfigurationException | IOException e) {
       logger.error("meet error when doing start checking", e);

Reply via email to