You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2023/01/03 03:37:01 UTC

[iotdb] branch master updated: [IOTDB-5285] TimePartition may be error when restarting with different time partition configuration (#8646)

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

xingtanzjr 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 e4cbca4479 [IOTDB-5285] TimePartition may be error when restarting with different time partition configuration (#8646)
e4cbca4479 is described below

commit e4cbca447910d70ebe139c8c5448af73abf1d972
Author: Alan Choo <43...@users.noreply.github.com>
AuthorDate: Tue Jan 3 11:36:55 2023 +0800

    [IOTDB-5285] TimePartition may be error when restarting with different time partition configuration (#8646)
---
 .../confignode/conf/SystemPropertiesUtils.java     |   4 +-
 .../org/apache/iotdb/it/utils/TsFileGenerator.java |   5 +-
 .../confignode/it/IoTDBConfigNodeSnapshotIT.java   |   8 +-
 .../it/cluster/IoTDBClusterRestartIT.java          |   5 -
 .../it/partition/IoTDBPartitionDurableIT.java      |   9 +-
 .../it/partition/IoTDBPartitionGetterIT.java       |   8 +-
 .../partition/IoTDBPartitionInheritPolicyIT.java   |   8 +-
 .../org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java  |  78 ++---
 .../apache/iotdb/commons/conf/IoTDBConstant.java   |   3 +
 .../org/apache/iotdb/db/client/ConfigNodeInfo.java |   2 +-
 .../org/apache/iotdb/db/conf/IoTDBStartCheck.java  | 385 +++++++--------------
 .../java/org/apache/iotdb/db/service/DataNode.java |   8 +-
 12 files changed, 182 insertions(+), 341 deletions(-)

diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java b/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java
index c1030533ef..4ee1f1ccea 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java
@@ -35,8 +35,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Properties;
 
-import static org.apache.iotdb.db.conf.IoTDBStartCheck.CLUSTER_NAME;
-import static org.apache.iotdb.db.conf.IoTDBStartCheck.DEFAULT_CLUSTER_NAME;
+import static org.apache.iotdb.commons.conf.IoTDBConstant.CLUSTER_NAME;
+import static org.apache.iotdb.commons.conf.IoTDBConstant.DEFAULT_CLUSTER_NAME;
 
 public class SystemPropertiesUtils {
 
diff --git a/integration-test/src/main/java/org/apache/iotdb/it/utils/TsFileGenerator.java b/integration-test/src/main/java/org/apache/iotdb/it/utils/TsFileGenerator.java
index d04d1558ec..c790e0b92f 100644
--- a/integration-test/src/main/java/org/apache/iotdb/it/utils/TsFileGenerator.java
+++ b/integration-test/src/main/java/org/apache/iotdb/it/utils/TsFileGenerator.java
@@ -88,7 +88,7 @@ public class TsFileGenerator implements AutoCloseable {
     device2MeasurementSchema.put(path, measurementSchemaList);
   }
 
-  public void generateData(String device, int number, boolean isAligned)
+  public void generateData(String device, int number, long timeGap, boolean isAligned)
       throws IOException, WriteProcessException {
     List<MeasurementSchema> schemas = device2MeasurementSchema.get(device);
     TreeSet<Long> timeSet = device2TimeSet.get(device);
@@ -100,7 +100,8 @@ public class TsFileGenerator implements AutoCloseable {
 
     for (long r = 0; r < number; r++) {
       int row = tablet.rowSize++;
-      timestamps[row] = ++startTime;
+      startTime += timeGap;
+      timestamps[row] = startTime;
       timeSet.add(startTime);
       for (int i = 0; i < sensorNum; i++) {
         generateDataPoint(values[i], row, schemas.get(i));
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
index 1ca9588108..0dc04b4d1e 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
@@ -85,8 +85,8 @@ public class IoTDBConfigNodeSnapshotIT {
   protected static int originalRatisSnapshotTriggerThreshold;
   private static final int testRatisSnapshotTriggerThreshold = 100;
 
-  protected static long originalTimePartitionInterval;
-  private static final long testTimePartitionInterval = 86400;
+  private static final long testTimePartitionInterval =
+      ConfigFactory.getConfig().getTimePartitionInterval();
 
   @Before
   public void setUp() throws Exception {
@@ -99,9 +99,6 @@ public class IoTDBConfigNodeSnapshotIT {
     ConfigFactory.getConfig()
         .setConfigNodeRatisSnapshotTriggerThreshold(testRatisSnapshotTriggerThreshold);
 
-    originalTimePartitionInterval = ConfigFactory.getConfig().getTimePartitionInterval();
-    ConfigFactory.getConfig().setTimePartitionInterval(testTimePartitionInterval);
-
     // Init 2C2D cluster environment
     EnvFactory.getEnv().initClusterEnvironment(2, 2);
   }
@@ -114,7 +111,6 @@ public class IoTDBConfigNodeSnapshotIT {
         .setConfigNodeConsesusProtocolClass(originalConfigNodeConsensusProtocolClass);
     ConfigFactory.getConfig()
         .setConfigNodeRatisSnapshotTriggerThreshold(originalRatisSnapshotTriggerThreshold);
-    ConfigFactory.getConfig().setTimePartitionInterval(originalTimePartitionInterval);
   }
 
   @Test
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java
index 0191ed3323..1736f4b2f9 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java
@@ -72,13 +72,11 @@ public class IoTDBClusterRestartIT {
   private static final int testConfigNodeNum = 2;
   private static final int testDataNodeNum = 2;
   private static final int testReplicationFactor = 2;
-  private static final long testTimePartitionInterval = 604800000;
   protected static String originalConfigNodeConsensusProtocolClass;
   protected static String originalSchemaRegionConsensusProtocolClass;
   protected static String originalDataRegionConsensusProtocolClass;
   protected static int originSchemaReplicationFactor;
   protected static int originalDataReplicationFactor;
-  protected static long originalTimePartitionInterval;
 
   @Before
   public void setUp() throws Exception {
@@ -98,8 +96,6 @@ public class IoTDBClusterRestartIT {
     ConfigFactory.getConfig().setSchemaReplicationFactor(testReplicationFactor);
     ConfigFactory.getConfig().setDataReplicationFactor(testReplicationFactor);
 
-    originalTimePartitionInterval = ConfigFactory.getConfig().getTimePartitionInterval();
-    ConfigFactory.getConfig().setTimePartitionInterval(testTimePartitionInterval);
     // Init 2C2D cluster environment
     EnvFactory.getEnv().initClusterEnvironment(testConfigNodeNum, testDataNodeNum);
   }
@@ -113,7 +109,6 @@ public class IoTDBClusterRestartIT {
         .setSchemaRegionConsensusProtocolClass(originalSchemaRegionConsensusProtocolClass);
     ConfigFactory.getConfig()
         .setDataRegionConsensusProtocolClass(originalDataRegionConsensusProtocolClass);
-    ConfigFactory.getConfig().setTimePartitionInterval(originalTimePartitionInterval);
   }
 
   @Test
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java
index a5da4cf85e..2d433f9990 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java
@@ -81,8 +81,8 @@ public class IoTDBPartitionDurableIT {
   private static int originalDataReplicationFactor;
   private static final int testReplicationFactor = 3;
 
-  private static long originalTimePartitionInterval;
-  private static final long testTimePartitionInterval = 604800000;
+  private static final long testTimePartitionInterval =
+      ConfigFactory.getConfig().getTimePartitionInterval();
 
   private static final int testDataNodeId = 0;
   private static final String sg = "root.sg";
@@ -117,9 +117,6 @@ public class IoTDBPartitionDurableIT {
     ConfigFactory.getConfig().setSchemaReplicationFactor(testReplicationFactor);
     ConfigFactory.getConfig().setDataReplicationFactor(testReplicationFactor);
 
-    originalTimePartitionInterval = ConfigFactory.getConfig().getTimePartitionInterval();
-    ConfigFactory.getConfig().setTimePartitionInterval(testTimePartitionInterval);
-
     // Init 1C3D environment
     EnvFactory.getEnv().initClusterEnvironment(1, 3);
 
@@ -148,8 +145,6 @@ public class IoTDBPartitionDurableIT {
 
     ConfigFactory.getConfig().setSchemaReplicationFactor(originalSchemaReplicationFactor);
     ConfigFactory.getConfig().setDataReplicationFactor(originalDataReplicationFactor);
-
-    ConfigFactory.getConfig().setTimePartitionInterval(originalTimePartitionInterval);
   }
 
   @Test
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java
index 36d4fe4a57..8888cb2f2e 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java
@@ -90,8 +90,8 @@ public class IoTDBPartitionGetterIT {
 
   private static int originalSeriesPartitionSlotNum;
 
-  private static long originalTimePartitionInterval;
-  private static final long testTimePartitionInterval = 604800000;
+  private static final long testTimePartitionInterval =
+      ConfigFactory.getConfig().getTimePartitionInterval();
 
   protected static int originalLeastDataRegionGroupNum;
   private static final int testLeastDataRegionGroupNum = 3;
@@ -123,9 +123,6 @@ public class IoTDBPartitionGetterIT {
     originalSeriesPartitionSlotNum = CONF.getSeriesPartitionSlotNum();
     CONF.setSeriesPartitionSlotNum(testSeriesPartitionSlotNum);
 
-    originalTimePartitionInterval = CONF.getTimePartitionInterval();
-    CONF.setTimePartitionInterval(testTimePartitionInterval);
-
     originalLeastDataRegionGroupNum = CONF.getLeastDataRegionGroupNum();
     CONF.setLeastDataRegionGroupNum(testLeastDataRegionGroupNum);
 
@@ -234,7 +231,6 @@ public class IoTDBPartitionGetterIT {
     CONF.setSchemaReplicationFactor(originalSchemaReplicationFactor);
     CONF.setDataReplicationFactor(originalDataReplicationFactor);
     CONF.setSeriesPartitionSlotNum(originalSeriesPartitionSlotNum);
-    CONF.setTimePartitionInterval(originalTimePartitionInterval);
   }
 
   @Test
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionInheritPolicyIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionInheritPolicyIT.java
index f9dd8af7e9..5d39483d5d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionInheritPolicyIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionInheritPolicyIT.java
@@ -66,8 +66,8 @@ public class IoTDBPartitionInheritPolicyIT {
 
   private static int originalSeriesPartitionSlotNum;
 
-  private static long originalTimePartitionInterval;
-  private static final long testTimePartitionInterval = 604800000;
+  private static final long testTimePartitionInterval =
+      ConfigFactory.getConfig().getTimePartitionInterval();
 
   private static final String sg = "root.sg";
   private static final int storageGroupNum = 2;
@@ -94,9 +94,6 @@ public class IoTDBPartitionInheritPolicyIT {
     originalSeriesPartitionSlotNum = ConfigFactory.getConfig().getSeriesPartitionSlotNum();
     ConfigFactory.getConfig().setSeriesPartitionSlotNum(testSeriesPartitionSlotNum * 10);
 
-    originalTimePartitionInterval = ConfigFactory.getConfig().getTimePartitionInterval();
-    ConfigFactory.getConfig().setTimePartitionInterval(testTimePartitionInterval);
-
     // Init 1C3D environment
     EnvFactory.getEnv().initClusterEnvironment(1, 3);
 
@@ -121,7 +118,6 @@ public class IoTDBPartitionInheritPolicyIT {
         .setEnableDataPartitionInheritPolicy(originalEnableDataPartitionInheritPolicy);
     ConfigFactory.getConfig().setDataReplicationFactor(originalDataReplicationFactor);
     ConfigFactory.getConfig().setSeriesPartitionSlotNum(originalSeriesPartitionSlotNum);
-    ConfigFactory.getConfig().setTimePartitionInterval(originalTimePartitionInterval);
   }
 
   @Test
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java
index 2a2639ae2c..b4e1788ebe 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java
@@ -55,17 +55,14 @@ import java.util.Map;
 @Category({LocalStandaloneIT.class, ClusterIT.class})
 public class IOTDBLoadTsFileIT {
   private static final Logger LOGGER = LoggerFactory.getLogger(IOTDBLoadTsFileIT.class);
-  private static final long PARTITION_INTERVAL = 10 * 1000L;
-
-  private long originConfigNodePartitionInterval;
+  private static final long PARTITION_INTERVAL =
+      ConfigFactory.getConfig().getTimePartitionInterval();
 
   private File tmpDir;
 
   @Before
   public void setUp() throws Exception {
     tmpDir = new File(Files.createTempDirectory("load").toUri());
-    originConfigNodePartitionInterval = ConfigFactory.getConfig().getTimePartitionInterval();
-    ConfigFactory.getConfig().setTimePartitionInterval(PARTITION_INTERVAL);
     EnvFactory.getEnv().initBeforeTest();
   }
 
@@ -74,7 +71,6 @@ public class IOTDBLoadTsFileIT {
     deleteSG();
 
     EnvFactory.getEnv().cleanAfterTest();
-    ConfigFactory.getConfig().setTimePartitionInterval(originConfigNodePartitionInterval);
 
     if (!deleteDir()) {
       LOGGER.error("Can not delete tmp dir for loading tsfile.");
@@ -171,8 +167,8 @@ public class IOTDBLoadTsFileIT {
               SchemaConfig.MEASUREMENT_11,
               SchemaConfig.MEASUREMENT_12,
               SchemaConfig.MEASUREMENT_13));
-      generator.generateData(SchemaConfig.DEVICE_0, 100000, false);
-      generator.generateData(SchemaConfig.DEVICE_1, 100000, true);
+      generator.generateData(SchemaConfig.DEVICE_0, 100000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_1, 100000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint1 = generator.getTotalNumber();
     }
 
@@ -185,9 +181,9 @@ public class IOTDBLoadTsFileIT {
           SchemaConfig.DEVICE_3, Arrays.asList(SchemaConfig.MEASUREMENT_30));
       generator.registerAlignedTimeseries(
           SchemaConfig.DEVICE_4, Arrays.asList(SchemaConfig.MEASUREMENT_40));
-      generator.generateData(SchemaConfig.DEVICE_2, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_3, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_4, 10000, true);
+      generator.generateData(SchemaConfig.DEVICE_2, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_3, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_4, 10000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint2 = generator.getTotalNumber();
     }
 
@@ -229,8 +225,8 @@ public class IOTDBLoadTsFileIT {
               SchemaConfig.MEASUREMENT_11,
               SchemaConfig.MEASUREMENT_12,
               SchemaConfig.MEASUREMENT_13));
-      generator.generateData(SchemaConfig.DEVICE_0, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_1, 10000, true);
+      generator.generateData(SchemaConfig.DEVICE_0, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_1, 10000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint1 = generator.getTotalNumber();
     }
 
@@ -243,9 +239,9 @@ public class IOTDBLoadTsFileIT {
           SchemaConfig.DEVICE_3, Arrays.asList(SchemaConfig.MEASUREMENT_30));
       generator.registerAlignedTimeseries(
           SchemaConfig.DEVICE_4, Arrays.asList(SchemaConfig.MEASUREMENT_40));
-      generator.generateData(SchemaConfig.DEVICE_2, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_3, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_4, 10000, true);
+      generator.generateData(SchemaConfig.DEVICE_2, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_3, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_4, 10000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint2 = generator.getTotalNumber();
     }
 
@@ -309,8 +305,8 @@ public class IOTDBLoadTsFileIT {
               SchemaConfig.MEASUREMENT_11,
               SchemaConfig.MEASUREMENT_12,
               SchemaConfig.MEASUREMENT_13));
-      generator.generateData(SchemaConfig.DEVICE_0, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_1, 10000, true);
+      generator.generateData(SchemaConfig.DEVICE_0, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_1, 10000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint1 = generator.getTotalNumber();
     }
 
@@ -323,9 +319,9 @@ public class IOTDBLoadTsFileIT {
           SchemaConfig.DEVICE_3, Arrays.asList(SchemaConfig.MEASUREMENT_30));
       generator.registerAlignedTimeseries(
           SchemaConfig.DEVICE_4, Arrays.asList(SchemaConfig.MEASUREMENT_40));
-      generator.generateData(SchemaConfig.DEVICE_2, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_3, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_4, 10000, true);
+      generator.generateData(SchemaConfig.DEVICE_2, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_3, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_4, 10000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint2 = generator.getTotalNumber();
     }
 
@@ -394,7 +390,6 @@ public class IOTDBLoadTsFileIT {
 
     File file1 = new File(tmpDir, "1-0-0-0.tsfile");
     File file2 = new File(tmpDir, "2-0-0-0.tsfile");
-    long writtenPoint1 = 0;
     // device 0, device 1, sg 0
     try (TsFileGenerator generator = new TsFileGenerator(file1)) {
       generator.registerTimeseries(
@@ -411,12 +406,10 @@ public class IOTDBLoadTsFileIT {
               SchemaConfig.MEASUREMENT_11,
               SchemaConfig.MEASUREMENT_12,
               SchemaConfig.MEASUREMENT_13));
-      generator.generateData(SchemaConfig.DEVICE_0, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_1, 10000, true);
-      writtenPoint1 = generator.getTotalNumber();
+      generator.generateData(SchemaConfig.DEVICE_0, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_1, 10000, PARTITION_INTERVAL / 10_000, true);
     }
 
-    long writtenPoint2 = 0;
     // device 2, device 3, device4, sg 1
     try (TsFileGenerator generator = new TsFileGenerator(file2)) {
       generator.registerTimeseries(
@@ -425,10 +418,9 @@ public class IOTDBLoadTsFileIT {
           SchemaConfig.DEVICE_3, Arrays.asList(SchemaConfig.MEASUREMENT_30));
       generator.registerAlignedTimeseries(
           SchemaConfig.DEVICE_4, Arrays.asList(SchemaConfig.MEASUREMENT_40));
-      generator.generateData(SchemaConfig.DEVICE_2, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_3, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_4, 10000, true);
-      writtenPoint2 = generator.getTotalNumber();
+      generator.generateData(SchemaConfig.DEVICE_2, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_3, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_4, 10000, PARTITION_INTERVAL / 10_000, true);
     }
 
     try (Connection connection = EnvFactory.getEnv().getConnection();
@@ -440,7 +432,7 @@ public class IOTDBLoadTsFileIT {
           statement.executeQuery(String.format("select last %s from %s", measurement, device))) {
         if (resultSet.next()) {
           String lastTime = resultSet.getString(ColumnHeaderConstant.TIME);
-          Assert.assertEquals("10000", lastTime);
+          Assert.assertEquals(String.valueOf(PARTITION_INTERVAL), lastTime);
         } else {
           Assert.fail("This ResultSet is empty.");
         }
@@ -469,8 +461,8 @@ public class IOTDBLoadTsFileIT {
               SchemaConfig.MEASUREMENT_11,
               SchemaConfig.MEASUREMENT_12,
               SchemaConfig.MEASUREMENT_13));
-      generator.generateData(SchemaConfig.DEVICE_0, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_1, 10000, true);
+      generator.generateData(SchemaConfig.DEVICE_0, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_1, 10000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint1 = generator.getTotalNumber();
     }
 
@@ -483,9 +475,9 @@ public class IOTDBLoadTsFileIT {
           SchemaConfig.DEVICE_3, Arrays.asList(SchemaConfig.MEASUREMENT_30));
       generator.registerAlignedTimeseries(
           SchemaConfig.DEVICE_4, Arrays.asList(SchemaConfig.MEASUREMENT_40));
-      generator.generateData(SchemaConfig.DEVICE_2, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_3, 10000, false);
-      generator.generateData(SchemaConfig.DEVICE_4, 10000, true);
+      generator.generateData(SchemaConfig.DEVICE_2, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_3, 10000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_4, 10000, PARTITION_INTERVAL / 10_000, true);
       writtenPoint2 = generator.getTotalNumber();
     }
 
@@ -527,8 +519,8 @@ public class IOTDBLoadTsFileIT {
               SchemaConfig.MEASUREMENT_11,
               SchemaConfig.MEASUREMENT_12,
               SchemaConfig.MEASUREMENT_13));
-      generator.generateData(SchemaConfig.DEVICE_0, 100000, false);
-      generator.generateData(SchemaConfig.DEVICE_1, 100000, true);
+      generator.generateData(SchemaConfig.DEVICE_0, 100000, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_1, 100000, PARTITION_INTERVAL / 10_000, true);
       generator.generateDeletion(SchemaConfig.DEVICE_0, 10);
       generator.generateDeletion(SchemaConfig.DEVICE_1, 10);
       writtenPoint1 = generator.getTotalNumber();
@@ -544,13 +536,13 @@ public class IOTDBLoadTsFileIT {
           SchemaConfig.DEVICE_3, Arrays.asList(SchemaConfig.MEASUREMENT_30));
       generator.registerAlignedTimeseries(
           SchemaConfig.DEVICE_4, Arrays.asList(SchemaConfig.MEASUREMENT_40));
-      generator.generateData(SchemaConfig.DEVICE_2, 100, false);
-      generator.generateData(SchemaConfig.DEVICE_3, 100, false);
-      generator.generateData(SchemaConfig.DEVICE_4, 100, true);
+      generator.generateData(SchemaConfig.DEVICE_2, 100, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_3, 100, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_4, 100, PARTITION_INTERVAL / 10_000, true);
       generator.generateDeletion(SchemaConfig.DEVICE_2, 2);
       generator.generateDeletion(SchemaConfig.DEVICE_4, 2);
-      generator.generateData(SchemaConfig.DEVICE_2, 100, false);
-      generator.generateData(SchemaConfig.DEVICE_4, 100, true);
+      generator.generateData(SchemaConfig.DEVICE_2, 100, PARTITION_INTERVAL / 10_000, false);
+      generator.generateData(SchemaConfig.DEVICE_4, 100, PARTITION_INTERVAL / 10_000, true);
       generator.generateDeletion(SchemaConfig.DEVICE_2, 2);
       generator.generateDeletion(SchemaConfig.DEVICE_4, 2);
       writtenPoint2 = generator.getTotalNumber();
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index b380716089..cb0dd9472b 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@ -69,6 +69,9 @@ public class IoTDBConstant {
   public static final String CN_TARGET_CONFIG_NODE_LIST = "cn_target_config_node_list";
   public static final String DN_TARGET_CONFIG_NODE_LIST = "dn_target_config_node_list";
 
+  public static final String CLUSTER_NAME = "cluster_name";
+  public static final String DEFAULT_CLUSTER_NAME = "defaultCluster";
+
   // when running the program in IDE, we can not get the version info using
   // getImplementationVersion()
   public static final String VERSION =
diff --git a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeInfo.java b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeInfo.java
index 4222afc753..b5332f899f 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeInfo.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeInfo.java
@@ -67,7 +67,7 @@ public class ConfigNodeInfo {
                 + PROPERTIES_FILE_NAME);
   }
 
-  /** Update ConfigNodeList both in memory and confignode-system.properties file */
+  /** Update ConfigNodeList both in memory and system.properties file */
   public void updateConfigNodeList(List<TEndPoint> latestConfigNodes) {
     // check whether the config nodes are latest or not
     configNodeInfoReadWriteLock.readLock().lock();
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
index 3715f4fa81..197ed51716 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
@@ -19,7 +19,6 @@
 package org.apache.iotdb.db.conf;
 
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
-import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
@@ -31,8 +30,6 @@ import org.apache.iotdb.db.conf.directories.DirectoryChecker;
 import org.apache.iotdb.db.wal.utils.WALMode;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
-import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
-import org.apache.iotdb.tsfile.fileSystem.fsFactory.FSFactory;
 
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
@@ -49,6 +46,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Properties;
+import java.util.function.Supplier;
 
 public class IoTDBStartCheck {
 
@@ -57,95 +55,91 @@ public class IoTDBStartCheck {
   private static final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
   private static final CommonConfig commonConfig = CommonDescriptor.getInstance().getConfig();
 
-  private final FSFactory fsFactory = FSFactoryProducer.getFSFactory();
-
   // this file is located in data/system/schema/system.properties
   // If user delete folder "data", system.properties can reset.
   public static final String PROPERTIES_FILE_NAME = "system.properties";
   private static final String SCHEMA_DIR = config.getSchemaDir();
-  private static final String[] WAL_DIRS = commonConfig.getWalDirs();
 
-  private File propertiesFile;
-  private File tmpPropertiesFile;
+  private final File propertiesFile;
+  private final File tmpPropertiesFile;
 
   private final Properties properties = new Properties();
 
   private final Map<String, String> systemProperties = new HashMap<>();
 
+  // region params need checking, determined when first start
   private static final String SYSTEM_PROPERTIES_STRING = "System properties:";
-
   private static final String TIMESTAMP_PRECISION_STRING = "timestamp_precision";
-  private static final String timestampPrecision = config.getTimestampPrecision();
-
   private static final String PARTITION_INTERVAL_STRING = "time_partition_interval";
-  private static final long timePartitionInterval = config.getTimePartitionInterval();
-
   private static final String TSFILE_FILE_SYSTEM_STRING = "tsfile_storage_fs";
-  private static final String tsfileFileSystem = config.getTsFileStorageFs().toString();
-
   private static final String TAG_ATTRIBUTE_SIZE_STRING = "tag_attribute_total_size";
-  private static final String tagAttributeTotalSize =
-      String.valueOf(config.getTagAttributeTotalSize());
-
   private static final String TAG_ATTRIBUTE_FLUSH_INTERVAL = "tag_attribute_flush_interval";
-  private static final String tagAttributeFlushInterval =
-      String.valueOf(config.getTagAttributeFlushInterval());
-
   private static final String MAX_DEGREE_OF_INDEX_STRING = "max_degree_of_index_node";
-  private static final String maxDegreeOfIndexNode =
-      String.valueOf(TSFileDescriptor.getInstance().getConfig().getMaxDegreeOfIndexNode());
-
   private static final String DATA_REGION_NUM = "data_region_num";
-  // for upgrading from old file
-  private static final String VIRTUAL_STORAGE_GROUP_NUM = "virtual_storage_group_num";
-  private static final String dataRegionNum = String.valueOf(config.getDataRegionNum());
-
   private static final String ENABLE_ID_TABLE = "enable_id_table";
-  private static final String enableIDTable = String.valueOf(config.isEnableIDTable());
-
   private static final String ENABLE_ID_TABLE_LOG_FILE = "enable_id_table_log_file";
-  private static final String enableIdTableLogFile =
-      String.valueOf(config.isEnableIDTableLogFile());
-
   private static final String SCHEMA_ENGINE_MODE = "schema_engine_mode";
-  private static final String schemaEngineMode = String.valueOf(config.getSchemaEngineMode());
-
   private static final String TIME_ENCODER_KEY = "time_encoder";
-  private static final String timeEncoderValue =
-      String.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
-
-  public static final String CLUSTER_NAME = "cluster_name";
-  public static final String DEFAULT_CLUSTER_NAME = "defaultCluster";
-  private static final String DATA_NODE_ID = "data_node_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";
-
-  private static final String IOTDB_VERSION_STRING = "iotdb_version";
 
+  private static final Map<String, Supplier<String>> constantParamValueTable = new HashMap<>();
+
+  static {
+    constantParamValueTable.put(TIMESTAMP_PRECISION_STRING, config::getTimestampPrecision);
+    constantParamValueTable.put(
+        PARTITION_INTERVAL_STRING, () -> String.valueOf(config.getTimePartitionInterval()));
+    constantParamValueTable.put(
+        TSFILE_FILE_SYSTEM_STRING, () -> config.getTsFileStorageFs().toString());
+    constantParamValueTable.put(
+        TAG_ATTRIBUTE_SIZE_STRING, () -> String.valueOf(config.getTagAttributeTotalSize()));
+    constantParamValueTable.put(
+        TAG_ATTRIBUTE_FLUSH_INTERVAL, () -> String.valueOf(config.getTagAttributeFlushInterval()));
+    constantParamValueTable.put(
+        MAX_DEGREE_OF_INDEX_STRING,
+        () -> String.valueOf(TSFileDescriptor.getInstance().getConfig().getMaxDegreeOfIndexNode()));
+    constantParamValueTable.put(DATA_REGION_NUM, () -> String.valueOf(config.getDataRegionNum()));
+    constantParamValueTable.put(ENABLE_ID_TABLE, () -> String.valueOf(config.isEnableIDTable()));
+    constantParamValueTable.put(
+        ENABLE_ID_TABLE_LOG_FILE, () -> String.valueOf(config.isEnableIDTableLogFile()));
+    constantParamValueTable.put(
+        SCHEMA_ENGINE_MODE, () -> String.valueOf(config.getSchemaEngineMode()));
+    constantParamValueTable.put(
+        TIME_ENCODER_KEY, TSFileDescriptor.getInstance().getConfig()::getTimeEncoder);
+  }
+  // endregion
+  // region params don't need checking and can be updated
   private static final String INTERNAL_ADDRESS = "dn_internal_address";
-  private static final String internalAddress = config.getInternalAddress();
-
   private static final String INTERNAL_PORT = "dn_internal_port";
-  private static final String internalPort = String.valueOf(config.getInternalPort());
-
   private static final String RPC_ADDRESS = "dn_rpc_address";
-  private static final String rpcAddress = config.getRpcAddress();
-
   private static final String RPC_PORT = "dn_rpc_port";
-  private static final String rpcPort = String.valueOf(config.getRpcPort());
-
   private static final String MPP_DATA_EXCHANGE_PORT = "dn_mpp_data_exchange_port";
-  private static final String mppDataExchangePort = String.valueOf(config.getMppDataExchangePort());
-
   private static final String SCHEMA_REGION_CONSENSUS_PORT = "dn_schema_region_consensus_port";
-  private static final String schemaRegionConsensusPort =
-      String.valueOf(config.getSchemaRegionConsensusPort());
-
   private static final String DATA_REGION_CONSENSUS_PORT = "dn_data_region_consensus_port";
-  private static final String dataRegionConsensusPort =
-      String.valueOf(config.getDataRegionConsensusPort());
+  private static final Map<String, Supplier<String>> variableParamValueTable = new HashMap<>();
+
+  static {
+    variableParamValueTable.put(
+        INTERNAL_ADDRESS, () -> String.valueOf(config.getInternalAddress()));
+    variableParamValueTable.put(INTERNAL_PORT, () -> String.valueOf(config.getInternalPort()));
+    variableParamValueTable.put(RPC_ADDRESS, () -> String.valueOf(config.getRpcAddress()));
+    variableParamValueTable.put(RPC_PORT, () -> String.valueOf(config.getRpcPort()));
+    variableParamValueTable.put(
+        MPP_DATA_EXCHANGE_PORT, () -> String.valueOf(config.getMppDataExchangePort()));
+    variableParamValueTable.put(
+        SCHEMA_REGION_CONSENSUS_PORT, () -> String.valueOf(config.getSchemaRegionConsensusPort()));
+    variableParamValueTable.put(
+        DATA_REGION_CONSENSUS_PORT, () -> String.valueOf(config.getDataRegionConsensusPort()));
+  }
+  // endregion
+  // region params don't need checking, determined by the system
+  private static final String IOTDB_VERSION_STRING = "iotdb_version";
+  private static final String CLUSTER_NAME = "cluster_name";
+  private static final String DATA_NODE_ID = "data_node_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
+  // region params of old versions
+  private static final String VIRTUAL_STORAGE_GROUP_NUM = "virtual_storage_group_num";
+  // endregion
 
   public static IoTDBStartCheck getInstance() {
     return IoTDBConfigCheckHolder.INSTANCE;
@@ -156,6 +150,16 @@ public class IoTDBStartCheck {
     private static final IoTDBStartCheck INSTANCE = new IoTDBStartCheck();
   }
 
+  private String getVal(String paramName) {
+    if (constantParamValueTable.containsKey(paramName)) {
+      return constantParamValueTable.get(paramName).get();
+    } else if (variableParamValueTable.containsKey(paramName)) {
+      return variableParamValueTable.get(paramName).get();
+    } else {
+      return null;
+    }
+  }
+
   private IoTDBStartCheck() {
     logger.info("Starting IoTDB " + IoTDBConstant.VERSION_WITH_BUILD);
 
@@ -170,7 +174,15 @@ public class IoTDBStartCheck {
       }
     }
 
+    propertiesFile =
+        SystemFileFactory.INSTANCE.getFile(
+            IoTDBStartCheck.SCHEMA_DIR + File.separator + PROPERTIES_FILE_NAME);
+    tmpPropertiesFile =
+        SystemFileFactory.INSTANCE.getFile(
+            IoTDBStartCheck.SCHEMA_DIR + File.separator + PROPERTIES_FILE_NAME + ".tmp");
+
     // Check time stamp precision
+    String timestampPrecision = getVal(TIMESTAMP_PRECISION_STRING);
     if (!("ms".equals(timestampPrecision)
         || "us".equals(timestampPrecision)
         || "ns".equals(timestampPrecision))) {
@@ -181,25 +193,52 @@ public class IoTDBStartCheck {
       System.exit(-1);
     }
 
+    // check partition interval
+    if (Long.parseLong(getVal(PARTITION_INTERVAL_STRING)) <= 0) {
+      logger.error("Time partition interval must larger than 0!");
+      System.exit(-1);
+    }
+
     systemProperties.put(IOTDB_VERSION_STRING, IoTDBConstant.VERSION);
-    systemProperties.put(TIMESTAMP_PRECISION_STRING, timestampPrecision);
-    systemProperties.put(PARTITION_INTERVAL_STRING, String.valueOf(timePartitionInterval));
-    systemProperties.put(TSFILE_FILE_SYSTEM_STRING, tsfileFileSystem);
-    systemProperties.put(TAG_ATTRIBUTE_SIZE_STRING, tagAttributeTotalSize);
-    systemProperties.put(TAG_ATTRIBUTE_FLUSH_INTERVAL, tagAttributeFlushInterval);
-    systemProperties.put(MAX_DEGREE_OF_INDEX_STRING, maxDegreeOfIndexNode);
-    systemProperties.put(DATA_REGION_NUM, dataRegionNum);
-    systemProperties.put(TIME_ENCODER_KEY, timeEncoderValue);
-    systemProperties.put(ENABLE_ID_TABLE, enableIDTable);
-    systemProperties.put(ENABLE_ID_TABLE_LOG_FILE, enableIdTableLogFile);
-    systemProperties.put(SCHEMA_ENGINE_MODE, schemaEngineMode);
-    systemProperties.put(INTERNAL_ADDRESS, internalAddress);
-    systemProperties.put(INTERNAL_PORT, internalPort);
-    systemProperties.put(RPC_ADDRESS, rpcAddress);
-    systemProperties.put(RPC_PORT, rpcPort);
-    systemProperties.put(MPP_DATA_EXCHANGE_PORT, mppDataExchangePort);
-    systemProperties.put(SCHEMA_REGION_CONSENSUS_PORT, schemaRegionConsensusPort);
-    systemProperties.put(DATA_REGION_CONSENSUS_PORT, dataRegionConsensusPort);
+    for (String param : constantParamValueTable.keySet()) {
+      systemProperties.put(param, getVal(param));
+    }
+    for (String param : variableParamValueTable.keySet()) {
+      systemProperties.put(param, getVal(param));
+    }
+  }
+
+  /** check configuration in system.properties when starting IoTDB */
+  public boolean checkIsFirstStart() throws IOException {
+    // system init first time, no need to check, write system.properties and return
+    if (!propertiesFile.exists() && !tmpPropertiesFile.exists()) {
+      // create system.properties
+      if (propertiesFile.createNewFile()) {
+        logger.info(" {} has been created.", propertiesFile.getAbsolutePath());
+      } else {
+        logger.error("can not create {}", propertiesFile.getAbsolutePath());
+        System.exit(-1);
+      }
+
+      // write properties to system.properties
+      try (FileOutputStream outputStream = new FileOutputStream(propertiesFile)) {
+        systemProperties.forEach(properties::setProperty);
+        properties.store(outputStream, SYSTEM_PROPERTIES_STRING);
+      }
+      return true;
+    }
+
+    if (!propertiesFile.exists() && tmpPropertiesFile.exists()) {
+      // rename tmp file to system.properties, no need to check
+      FileUtils.moveFile(tmpPropertiesFile, propertiesFile);
+      logger.info("rename {} to {}", tmpPropertiesFile, propertiesFile);
+      return false;
+    } else if (propertiesFile.exists() && tmpPropertiesFile.exists()) {
+      // both files exist, remove tmp file
+      FileUtils.forceDelete(tmpPropertiesFile);
+      logger.info("remove {}", tmpPropertiesFile);
+    }
+    return false;
   }
 
   /**
@@ -210,7 +249,6 @@ public class IoTDBStartCheck {
    * accessing same director.
    */
   public void checkDirectory() throws ConfigurationException, IOException {
-
     // check data dirs
     for (String dataDir : config.getDataDirs()) {
       DirectoryChecker.getInstance().registerDirectory(new File(dataDir));
@@ -249,43 +287,7 @@ public class IoTDBStartCheck {
    * system.properties (3) rename system.properties.tmp to system.properties
    */
   public void checkSystemConfig() throws ConfigurationException, IOException {
-    propertiesFile =
-        SystemFileFactory.INSTANCE.getFile(
-            IoTDBStartCheck.SCHEMA_DIR + File.separator + PROPERTIES_FILE_NAME);
-    tmpPropertiesFile =
-        SystemFileFactory.INSTANCE.getFile(
-            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()) {
-      // create system.properties
-      if (propertiesFile.createNewFile()) {
-        logger.info(" {} has been created.", propertiesFile.getAbsolutePath());
-      } else {
-        logger.error("can not create {}", propertiesFile.getAbsolutePath());
-        System.exit(-1);
-      }
-
-      // write properties to system.properties
-      try (FileOutputStream outputStream = new FileOutputStream(propertiesFile)) {
-        systemProperties.forEach(properties::setProperty);
-        properties.store(outputStream, SYSTEM_PROPERTIES_STRING);
-      }
-      return;
-    }
-
-    if (!propertiesFile.exists() && tmpPropertiesFile.exists()) {
-      // rename tmp file to system.properties, no need to check
-      FileUtils.moveFile(tmpPropertiesFile, propertiesFile);
-      logger.info("rename {} to {}", tmpPropertiesFile, propertiesFile);
-      return;
-    } else if (propertiesFile.exists() && tmpPropertiesFile.exists()) {
-      // both files exist, remove tmp file
-      FileUtils.forceDelete(tmpPropertiesFile);
-      logger.info("remove {}", tmpPropertiesFile);
-    }
-
-    // no tmp file, read properties from system.properties
+    // read properties from system.properties
     try (FileInputStream inputStream = new FileInputStream(propertiesFile);
         InputStreamReader inputStreamReader =
             new InputStreamReader(inputStream, TSFileConfig.STRING_CHARSET)) {
@@ -294,11 +296,11 @@ public class IoTDBStartCheck {
     // check whether upgrading from <=v0.9
     if (!properties.containsKey(IOTDB_VERSION_STRING)) {
       logger.error(
-          "DO NOT UPGRADE IoTDB from v0.9 or lower version to v0.12!"
+          "DO NOT UPGRADE IoTDB from v0.9 or lower version to v1.0!"
               + " Please upgrade to v0.10 first");
       System.exit(-1);
     }
-    // check whether upgrading from [v0.10, v.12]
+    // check whether upgrading from [v0.10, v.13]
     String versionString = properties.getProperty(IOTDB_VERSION_STRING);
     if (versionString.startsWith("0.10") || versionString.startsWith("0.11")) {
       logger.error("IoTDB version is too old, please upgrade to 0.12 firstly.");
@@ -311,7 +313,7 @@ public class IoTDBStartCheck {
   }
 
   private void checkWALNotExists() {
-    for (String walDir : WAL_DIRS) {
+    for (String walDir : commonConfig.getWalDirs()) {
       if (SystemFileFactory.INSTANCE.getFile(walDir).isDirectory()) {
         File[] sgWALs = SystemFileFactory.INSTANCE.getFile(walDir).listFiles();
         if (sgWALs != null) {
@@ -399,44 +401,10 @@ public class IoTDBStartCheck {
       }
     }
 
-    if (!properties.getProperty(TIMESTAMP_PRECISION_STRING).equals(timestampPrecision)) {
-      throwException(TIMESTAMP_PRECISION_STRING, timestampPrecision);
-    }
-
-    if (!(properties.getProperty(TSFILE_FILE_SYSTEM_STRING).equals(tsfileFileSystem))) {
-      throwException(TSFILE_FILE_SYSTEM_STRING, tsfileFileSystem);
-    }
-
-    if (!(properties.getProperty(TAG_ATTRIBUTE_SIZE_STRING).equals(tagAttributeTotalSize))) {
-      throwException(TAG_ATTRIBUTE_SIZE_STRING, tagAttributeTotalSize);
-    }
-
-    if (!(properties.getProperty(TAG_ATTRIBUTE_FLUSH_INTERVAL).equals(tagAttributeFlushInterval))) {
-      throwException(TAG_ATTRIBUTE_FLUSH_INTERVAL, tagAttributeFlushInterval);
-    }
-
-    if (!(properties.getProperty(MAX_DEGREE_OF_INDEX_STRING).equals(maxDegreeOfIndexNode))) {
-      throwException(MAX_DEGREE_OF_INDEX_STRING, maxDegreeOfIndexNode);
-    }
-
-    if (!(properties.getProperty(DATA_REGION_NUM).equals(dataRegionNum))) {
-      throwException(DATA_REGION_NUM, dataRegionNum);
-    }
-
-    if (!(properties.getProperty(TIME_ENCODER_KEY).equals(timeEncoderValue))) {
-      throwException(TIME_ENCODER_KEY, timeEncoderValue);
-    }
-
-    if (!(properties.getProperty(ENABLE_ID_TABLE).equals(enableIDTable))) {
-      throwException(ENABLE_ID_TABLE, enableIDTable);
-    }
-
-    if (!(properties.getProperty(ENABLE_ID_TABLE_LOG_FILE).equals(enableIdTableLogFile))) {
-      throwException(ENABLE_ID_TABLE_LOG_FILE, enableIdTableLogFile);
-    }
-
-    if (!(properties.getProperty(SCHEMA_ENGINE_MODE).equals(schemaEngineMode))) {
-      throwException(SCHEMA_ENGINE_MODE, schemaEngineMode);
+    for (String param : constantParamValueTable.keySet()) {
+      if (!(properties.getProperty(param).equals(getVal(param)))) {
+        throwException(param, getVal(param));
+      }
     }
 
     // load configuration from system properties only when start as Data node
@@ -498,35 +466,6 @@ public class IoTDBStartCheck {
     FileUtils.moveFile(tmpPropertiesFile, propertiesFile);
   }
 
-  /** call this method to serialize consensus protocol */
-  public void serializeConsensusProtocol(String regionConsensusProtocol, TConsensusGroupType type)
-      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);
-    }
-
-    reloadProperties();
-
-    try (FileOutputStream tmpFOS = new FileOutputStream(tmpPropertiesFile.toString())) {
-      if (type == TConsensusGroupType.DataRegion) {
-        properties.setProperty(DATA_REGION_CONSENSUS_PROTOCOL, regionConsensusProtocol);
-      } else if (type == TConsensusGroupType.SchemaRegion) {
-        properties.setProperty(SCHEMA_REGION_CONSENSUS_PROTOCOL, regionConsensusProtocol);
-      }
-      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 serializeGlobalConfig(TGlobalConfig globalConfig) throws IOException {
     // create an empty tmpPropertiesFile
     if (tmpPropertiesFile.createNewFile()) {
@@ -558,30 +497,6 @@ public class IoTDBStartCheck {
     FileUtils.moveFile(tmpPropertiesFile, propertiesFile);
   }
 
-  public void serializeNewDataNode(TDataNodeLocation dataNodeLocation) throws IOException {
-    reloadProperties();
-
-    try (FileOutputStream fileOutputStream = new FileOutputStream(propertiesFile)) {
-      properties.setProperty(INTERNAL_ADDRESS, dataNodeLocation.getInternalEndPoint().getIp());
-      properties.setProperty(
-          INTERNAL_PORT, String.valueOf(dataNodeLocation.getInternalEndPoint().getPort()));
-      properties.setProperty(
-          RPC_ADDRESS, String.valueOf(dataNodeLocation.getClientRpcEndPoint().getIp()));
-      properties.setProperty(
-          RPC_PORT, String.valueOf(dataNodeLocation.getClientRpcEndPoint().getPort()));
-      properties.setProperty(
-          MPP_DATA_EXCHANGE_PORT,
-          String.valueOf(dataNodeLocation.getMPPDataExchangeEndPoint().getPort()));
-      properties.setProperty(
-          SCHEMA_REGION_CONSENSUS_PORT,
-          String.valueOf(dataNodeLocation.getSchemaRegionConsensusEndPoint().getPort()));
-      properties.setProperty(
-          DATA_REGION_CONSENSUS_PORT,
-          String.valueOf(dataNodeLocation.getDataRegionConsensusEndPoint().getPort()));
-      properties.store(fileOutputStream, SYSTEM_PROPERTIES_STRING);
-    }
-  }
-
   public boolean checkConsensusProtocolExists(TConsensusGroupType type) {
     if (type == TConsensusGroupType.DataRegion) {
       return properties.containsKey(DATA_REGION_CONSENSUS_PROTOCOL);
@@ -592,50 +507,4 @@ public class IoTDBStartCheck {
     logger.error("Unexpected consensus group type");
     return false;
   }
-
-  public boolean isIpPortUpdated() {
-    boolean isUpdated = false;
-    // check the modifiable parts of configuration
-    if (!(properties.getProperty(INTERNAL_PORT).equals(internalPort))) {
-      isUpdated = true;
-      logger.info(
-          "Internal port is updated from {} to {}",
-          properties.getProperty(INTERNAL_PORT),
-          internalPort);
-    }
-    if (!(properties.getProperty(RPC_ADDRESS).equals(rpcAddress))) {
-      isUpdated = true;
-      logger.info(
-          "RPC address is updated from {} to {}", properties.getProperty(RPC_ADDRESS), rpcAddress);
-    }
-    if (!(properties.getProperty(RPC_PORT).equals(rpcPort))) {
-      isUpdated = true;
-      logger.info("RPC port is updated from {} to {}", properties.getProperty(RPC_PORT), rpcPort);
-    }
-    if (!(properties.getProperty(MPP_DATA_EXCHANGE_PORT).equals(mppDataExchangePort))) {
-      isUpdated = true;
-      logger.info(
-          "MPP data exchange port is updated from {} to {}",
-          properties.getProperty(MPP_DATA_EXCHANGE_PORT),
-          mppDataExchangePort);
-    }
-    return isUpdated;
-  }
-
-  public boolean checkNonModifiableConfiguration() {
-    // check the non-modifiable parts of configuration
-    if (!(properties.getProperty(INTERNAL_ADDRESS).equals(internalAddress))) {
-      logger.error("Internal address is not allowed to be updated");
-      return true;
-    }
-    if (!(properties.getProperty(SCHEMA_REGION_CONSENSUS_PORT).equals(schemaRegionConsensusPort))) {
-      logger.error("Schema region consensus port is not allowed to be updated");
-      return true;
-    }
-    if (!(properties.getProperty(DATA_REGION_CONSENSUS_PORT).equals(dataRegionConsensusPort))) {
-      logger.error("Data region consensus port is not allowed to be updated");
-      return true;
-    }
-    return false;
-  }
 }
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 dfba686552..59e85e6ac0 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
@@ -95,7 +95,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import static org.apache.iotdb.db.conf.IoTDBStartCheck.DEFAULT_CLUSTER_NAME;
+import static org.apache.iotdb.commons.conf.IoTDBConstant.DEFAULT_CLUSTER_NAME;
 
 public class DataNode implements DataNodeMBean {
   private static final Logger logger = LoggerFactory.getLogger(DataNode.class);
@@ -190,7 +190,7 @@ public class DataNode implements DataNodeMBean {
     config.setClusterMode(true);
 
     // Notice: Consider this DataNode as first start if the system.properties file doesn't exist
-    boolean isFirstStart = !SYSTEM_PROPERTIES.exists();
+    boolean isFirstStart = IoTDBStartCheck.getInstance().checkIsFirstStart();
 
     // Check target ConfigNodes
     for (TEndPoint endPoint : config.getTargetConfigNodeList()) {
@@ -208,9 +208,6 @@ public class DataNode implements DataNodeMBean {
     StartupChecks checks = new StartupChecks(IoTDBConstant.DN_ROLE).withDefaultTest();
     checks.verify();
 
-    // Check system configurations
-    IoTDBStartCheck.getInstance().checkSystemConfig();
-
     return isFirstStart;
   }
 
@@ -282,6 +279,7 @@ public class DataNode implements DataNodeMBean {
 
     /* Check system configurations */
     try {
+      IoTDBStartCheck.getInstance().checkSystemConfig();
       IoTDBStartCheck.getInstance().checkDirectory();
       IoTDBStartCheck.getInstance().serializeGlobalConfig(configurationResp.globalConfig);
       IoTDBDescriptor.getInstance().initClusterSchemaMemoryAllocate();