@Override
  protected void start() {
    boolean isFirstStart;
    try {
      // Check if this DataNode is start for the first time and do other pre-checks
      isFirstStart = prepareDataNode();

      if (isFirstStart) {
        logger.info("DataNode is starting for the first time...");
        ConfigNodeInfo.getInstance()
            .updateConfigNodeList(Collections.singletonList(config.getSeedConfigNode()));
      } else {
        logger.info("DataNode is restarting...");
        // Load registered ConfigNodes from system.properties
        ConfigNodeInfo.getInstance().loadConfigNodeList();
      }

      // Pull and check system configurations from ConfigNode-leader
      pullAndCheckSystemConfigurations();

      if (isFirstStart) {
        sendRegisterRequestToConfigNode(true);
        IoTDBStartCheck.getInstance().generateOrOverwriteSystemPropertiesFile();
        IoTDBStartCheck.getInstance().serializeEncryptMagicString();
        ConfigNodeInfo.getInstance().storeConfigNodeList();
        // Register this DataNode to the cluster when first start
        sendRegisterRequestToConfigNode(false);
      } else {
        /* Check encrypt magic string */
        try {
          IoTDBStartCheck.getInstance().checkEncryptMagicString();
        } catch (Exception e) {
          throw new StartupException(e.getMessage());
        }
        // Send restart request of this DataNode
        sendRestartRequestToConfigNode();
      }
      // TierManager need DataNodeId to do some operations so the reset method need to be invoked
      // after DataNode adding
      TierManager.getInstance().resetFolders();
      // Active DataNode
      active();

      // Setup metric service
      setUpMetricService();

      // Setup rpc service
      setUpRPCService();

      // Serialize mutable system properties
      IoTDBStartCheck.getInstance().serializeMutableSystemPropertiesIfNecessary();

      logger.info("IoTDB configuration: {}", config.getConfigMessage());
      logger.info("Congratulations, IoTDB DataNode is set up successfully. Now, enjoy yourself!");

      if (isUsingPipeConsensus()) {
        long dataRegionStartTime = System.currentTimeMillis();
        while (!StorageEngine.getInstance().isReadyForNonReadWriteFunctions()) {
          try {
            TimeUnit.MILLISECONDS.sleep(1000);
          } catch (InterruptedException e) {
            logger.warn("IoTDB DataNode failed to set up.", e);
            Thread.currentThread().interrupt();
            return;
          }
        }
        DataRegionConsensusImpl.getInstance().start();
        long dataRegionEndTime = System.currentTimeMillis();
        logger.info(
            "DataRegion consensus start successfully, which takes {} ms.",
            (dataRegionEndTime - dataRegionStartTime));
        dataRegionConsensusStarted = true;
      }

    } catch (StartupException | IOException e) {
      logger.error("Fail to start server", e);
      stop();
      System.exit(-1);
    }
  }
Responsible for keeping trigger information up to date.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java