You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by lt...@apache.org on 2019/11/08 06:59:09 UTC

[incubator-iotdb] 01/03: add hot load config

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

lta pushed a commit to branch add_hot_load_configuration
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit bc27c55e6edae04c09c3d7416ee388cc1ab74358
Author: lta <li...@163.com>
AuthorDate: Wed Nov 6 20:27:53 2019 +0800

    add hot load config
---
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  78 +++---
 .../org/apache/iotdb/db/conf/IoTDBConfigCheck.java |   4 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  | 261 +++++++++++++--------
 .../db/conf/directories/DirectoryManager.java      |  28 ++-
 .../directories/strategy/DirectoryStrategy.java    |   2 +
 5 files changed, 230 insertions(+), 143 deletions(-)

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 88a23b5..7fc9528 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
@@ -20,11 +20,9 @@ package org.apache.iotdb.db.conf;
 
 import java.io.File;
 import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.engine.merge.selector.MergeFileStrategy;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.service.TSServiceImpl;
@@ -446,50 +444,41 @@ public class IoTDBConfig {
    * if the folders are relative paths, add IOTDB_HOME as the path prefix
    */
   private void formulateFolders() {
-    List<String> dirs = new ArrayList<>();
-    dirs.add(baseDir);
-    dirs.add(systemDir);
-    dirs.add(schemaDir);
-    dirs.add(walFolder);
-    dirs.add(indexFileDir);
-    dirs.add(queryDir);
-    dirs.addAll(Arrays.asList(dataDirs));
-
-    for (int i = 0; i < 4; i++) {
-      addHomeDir(dirs, i);
-    }
+    baseDir = addHomeDir(baseDir);
+    systemDir = addHomeDir(systemDir);
+    schemaDir = addHomeDir(schemaDir);
+    walFolder = addHomeDir(walFolder);
 
     if (TSFileDescriptor.getInstance().getConfig().getTSFileStorageFs().equals(FSType.HDFS)) {
-      String[] hdfsIps = TSFileDescriptor.getInstance().getConfig().getHdfsIp();
-      String hdfsDir = "hdfs://";
-      if (hdfsIps.length > 1) {
-        hdfsDir += TSFileDescriptor.getInstance().getConfig().getDfsNameServices();
-      } else {
-        hdfsDir += hdfsIps[0] + ":" + TSFileDescriptor.getInstance().getConfig().getHdfsPort();
-      }
-      for (int i = 5; i < dirs.size(); i++) {
-        String dir = dirs.get(i);
-        dir = hdfsDir + File.separatorChar + dir;
-        dirs.set(i, dir);
+      String hdfsDir = getHdfsDir();
+      queryDir = hdfsDir + File.separatorChar + queryDir;
+      for (int i = 0; i < dataDirs.length; i++) {
+        dataDirs[i] = hdfsDir + File.separatorChar + dataDirs[i];
       }
     } else {
-      for (int i = 5; i < dirs.size(); i++) {
-        addHomeDir(dirs, i);
+      queryDir = addHomeDir(queryDir);
+      for (int i = 0; i < dataDirs.length; i++) {
+        dataDirs[i] = addHomeDir(dataDirs[i]);
       }
     }
-    baseDir = dirs.get(0);
-    systemDir = dirs.get(1);
-    schemaDir = dirs.get(2);
-    walFolder = dirs.get(3);
-    indexFileDir = dirs.get(4);
-    queryDir = dirs.get(5);
-    for (int i = 0; i < dataDirs.length; i++) {
-      dataDirs[i] = dirs.get(i + 6);
+  }
+
+  void reloadDataDirs(String[] dataDirs) {
+    if (TSFileDescriptor.getInstance().getConfig().getTSFileStorageFs().equals(FSType.HDFS)) {
+      String hdfsDir = getHdfsDir();
+      for (int i = 0; i < dataDirs.length; i++) {
+        dataDirs[i] = hdfsDir + File.separatorChar + dataDirs[i];
+      }
+    } else {
+      for (int i = 0; i < dataDirs.length; i++) {
+        dataDirs[i] = addHomeDir(dataDirs[i]);
+      }
     }
+    this.dataDirs = dataDirs;
+    DirectoryManager.getInstance().updateFileFolders();
   }
 
-  private void addHomeDir(List<String> dirs, int i) {
-    String dir = dirs.get(i);
+  private String addHomeDir(String dir) {
     String homeDir = System.getProperty(IoTDBConstant.IOTDB_HOME, null);
     if (!new File(dir).isAbsolute() && homeDir != null && homeDir.length() > 0) {
       if (!homeDir.endsWith(File.separator)) {
@@ -497,8 +486,8 @@ public class IoTDBConfig {
       } else {
         dir = homeDir + dir;
       }
-      dirs.set(i, dir);
     }
+    return dir;
   }
 
   private void confirmMultiDirStrategy() {
@@ -518,6 +507,17 @@ public class IoTDBConfig {
     }
   }
 
+  private String getHdfsDir(){
+    String[] hdfsIps = TSFileDescriptor.getInstance().getConfig().getHdfsIp();
+    String hdfsDir = "hdfs://";
+    if (hdfsIps.length > 1) {
+      hdfsDir += TSFileDescriptor.getInstance().getConfig().getDfsNameServices();
+    } else {
+      hdfsDir += hdfsIps[0] + ":" + TSFileDescriptor.getInstance().getConfig().getHdfsPort();
+    }
+    return hdfsDir;
+  }
+
   public String[] getDataDirs() {
     return dataDirs;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
index 7b6bdef..09c648f 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
@@ -54,7 +54,7 @@ public class IoTDBConfigCheck {
     logger.info("System configuration is ok.");
   }
 
-  public void createDir(String filepath) {
+  private void createDir(String filepath) {
     File dir = SystemFileFactory.INSTANCE.getFile(filepath);
     if (!dir.exists()) {
       dir.mkdirs();
@@ -62,7 +62,7 @@ public class IoTDBConfigCheck {
     }
   }
 
-  public void checkFile(String filepath) {
+  private void checkFile(String filepath) {
     // create file : read timestamp precision from engine.properties, create system_properties.txt
     // use output stream to write timestamp precision to file.
     File file = SystemFileFactory.INSTANCE.getFile(filepath + File.separator + PROPERTIES_FILE_NAME);
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 24cd142..28fcd97 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
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.time.ZoneId;
 import java.util.Properties;
+import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.utils.FilePathUtils;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.slf4j.Logger;
@@ -72,25 +73,15 @@ public class IoTDBDescriptor {
    * load an property file and set TsfileDBConfig variables.
    */
   private void loadProps() {
-    InputStream inputStream;
-
     String url = getPropsUrl();
     if (url == null) {
       return;
     }
 
-    try {
-      inputStream = new FileInputStream(new File(url));
-    } catch (FileNotFoundException e) {
-      logger.warn("Fail to find config file {}", url, e);
-      // update all data seriesPath
-      conf.updatePath();
-      return;
-    }
+    try (InputStream inputStream = new FileInputStream(new File(url))) {
 
-    logger.info("Start to read config file {}", url);
-    Properties properties = new Properties();
-    try {
+      logger.info("Start to read config file {}", url);
+      Properties properties = new Properties();
       properties.load(inputStream);
       conf.setEnableStatMonitor(Boolean
           .parseBoolean(properties.getProperty("enable_stat_monitor",
@@ -144,8 +135,7 @@ public class IoTDBDescriptor {
 
       initMemoryAllocate(properties);
 
-      conf.setEnableWal(Boolean.parseBoolean(properties.getProperty("enable_wal",
-          Boolean.toString(conf.isEnableWal()))));
+      loadWALProps(properties);
 
       conf.setBaseDir(properties.getProperty("base_dir", conf.getBaseDir()));
 
@@ -160,14 +150,6 @@ public class IoTDBDescriptor {
 
       conf.setWalFolder(properties.getProperty("wal_dir", conf.getWalFolder()));
 
-      conf.setFlushWalThreshold(Integer
-          .parseInt(properties.getProperty("flush_wal_threshold",
-              Integer.toString(conf.getFlushWalThreshold()))));
-
-      conf.setForceWalPeriodInMs(Long
-          .parseLong(properties.getProperty("force_wal_period_in_ms",
-              Long.toString(conf.getForceWalPeriodInMs()))));
-
       int walBufferSize = Integer.parseInt(properties.getProperty("wal_buffer_size",
           Integer.toString(conf.getWalBufferSize())));
       if (walBufferSize > 0) {
@@ -223,8 +205,8 @@ public class IoTDBDescriptor {
         conf.setChunkBufferPoolEnable(Boolean
             .parseBoolean(properties.getProperty("chunk_buffer_pool_enable")));
       }
-      String tmpTimeZone = properties.getProperty("time_zone", conf.getZoneID().toString());
-      conf.setZoneID(ZoneId.of(tmpTimeZone.trim()));
+      conf.setZoneID(
+          ZoneId.of(properties.getProperty("time_zone", conf.getZoneID().toString().trim())));
       logger.info("Time zone has been set to {}", conf.getZoneID());
 
       conf.setEnableExternalSort(Boolean.parseBoolean(properties
@@ -278,30 +260,7 @@ public class IoTDBDescriptor {
       conf.setWatermarkMethod(
           properties.getProperty("watermark_method", conf.getWatermarkMethod()));
 
-      conf.setAutoCreateSchemaEnabled(
-          Boolean.parseBoolean(properties.getProperty("enable_auto_create_schema",
-              Boolean.toString(conf.isAutoCreateSchemaEnabled()).trim())));
-      conf.setDefaultStorageGroupLevel(
-          Integer.parseInt(properties.getProperty("default_storage_group_level",
-              Integer.toString(conf.getDefaultStorageGroupLevel()))));
-      conf.setDefaultBooleanEncoding(
-          properties.getProperty("default_boolean_encoding",
-              conf.getDefaultBooleanEncoding().toString()));
-      conf.setDefaultInt32Encoding(
-          properties.getProperty("default_int32_encoding",
-              conf.getDefaultInt32Encoding().toString()));
-      conf.setDefaultInt64Encoding(
-          properties.getProperty("default_int64_encoding",
-              conf.getDefaultInt64Encoding().toString()));
-      conf.setDefaultFloatEncoding(
-          properties.getProperty("default_float_encoding",
-              conf.getDefaultFloatEncoding().toString()));
-      conf.setDefaultDoubleEncoding(
-          properties.getProperty("default_double_encoding",
-              conf.getDefaultDoubleEncoding().toString()));
-      conf.setDefaultTextEncoding(
-          properties.getProperty("default_text_encoding",
-              conf.getDefaultTextEncoding().toString()));
+      loadAutoCreateSchemaProps(properties);
 
       conf.setRpcMaxConcurrentClientNum(maxConcurrentClientNum);
 
@@ -319,69 +278,177 @@ public class IoTDBDescriptor {
           String.valueOf(conf.getDefaultTTL()))));
 
       // At the same time, set TSFileConfig
-      TSFileDescriptor.getInstance().getConfig().setTSFileStorageFs(properties.getProperty("tsfile_storage_fs"));
-      TSFileDescriptor.getInstance().getConfig().setHdfsIp(properties.getProperty("hdfs_ip").split(","));
+      TSFileDescriptor.getInstance().getConfig()
+          .setTSFileStorageFs(properties.getProperty("tsfile_storage_fs"));
+      TSFileDescriptor.getInstance().getConfig()
+          .setHdfsIp(properties.getProperty("hdfs_ip").split(","));
       TSFileDescriptor.getInstance().getConfig().setHdfsPort(properties.getProperty("hdfs_port"));
-      TSFileDescriptor.getInstance().getConfig().setDfsNameServices(properties.getProperty("dfs_nameservices"));
-      TSFileDescriptor.getInstance().getConfig().setDfsHaNamenodes(properties.getProperty("dfs_ha_namenodes").split(","));
+      TSFileDescriptor.getInstance().getConfig()
+          .setDfsNameServices(properties.getProperty("dfs_nameservices"));
+      TSFileDescriptor.getInstance().getConfig()
+          .setDfsHaNamenodes(properties.getProperty("dfs_ha_namenodes").split(","));
       TSFileDescriptor.getInstance().getConfig().setDfsHaAutomaticFailoverEnabled(
           Boolean.parseBoolean(properties.getProperty("dfs_ha_automatic_failover_enabled")));
       TSFileDescriptor.getInstance().getConfig().setDfsClientFailoverProxyProvider(
           properties.getProperty("dfs_client_failover_proxy_provider"));
 
       // set tsfile-format config
-      TSFileDescriptor.getInstance().getConfig().setGroupSizeInByte(Integer
-          .parseInt(properties.getProperty("group_size_in_byte",
-              Integer.toString(TSFileDescriptor.getInstance().getConfig().getGroupSizeInByte()))));
-      TSFileDescriptor.getInstance().getConfig().setPageSizeInByte(Integer
-          .parseInt(properties.getProperty("page_size_in_byte",
-              Integer.toString(TSFileDescriptor.getInstance().getConfig().getPageSizeInByte()))));
-      if (TSFileDescriptor.getInstance().getConfig().getPageSizeInByte() > TSFileDescriptor
-          .getInstance().getConfig().getGroupSizeInByte()) {
-        logger
-            .warn("page_size is greater than group size, will set it as the same with group size");
-        TSFileDescriptor.getInstance().getConfig()
-            .setPageSizeInByte(TSFileDescriptor.getInstance().getConfig().getGroupSizeInByte());
-      }
-      TSFileDescriptor.getInstance().getConfig().setMaxNumberOfPointsInPage(Integer
-          .parseInt(properties.getProperty("max_number_of_points_in_page",
-              Integer.toString(
-                  TSFileDescriptor.getInstance().getConfig().getMaxNumberOfPointsInPage()))));
-      TSFileDescriptor.getInstance().getConfig().setTimeSeriesDataType(properties
-          .getProperty("time_series_data_type",
-              TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType()));
-      TSFileDescriptor.getInstance().getConfig().setMaxStringLength(Integer
-          .parseInt(properties.getProperty("max_string_length",
-              Integer.toString(TSFileDescriptor.getInstance().getConfig().getMaxStringLength()))));
-      TSFileDescriptor.getInstance().getConfig().setBloomFilterErrorRate(Double
-          .parseDouble(properties.getProperty("bloom_filter_error_rate",
-              Double.toString(
-                  TSFileDescriptor.getInstance().getConfig().getBloomFilterErrorRate()))));
-      TSFileDescriptor.getInstance().getConfig().setFloatPrecision(Integer
-          .parseInt(properties
-              .getProperty("float_precision", Integer
-                  .toString(TSFileDescriptor.getInstance().getConfig().getFloatPrecision()))));
-      TSFileDescriptor.getInstance().getConfig().setTimeEncoder(properties
-          .getProperty("time_encoder",
-              TSFileDescriptor.getInstance().getConfig().getTimeEncoder()));
-      TSFileDescriptor.getInstance().getConfig().setValueEncoder(properties
-          .getProperty("value_encoder",
-              TSFileDescriptor.getInstance().getConfig().getValueEncoder()));
-      TSFileDescriptor.getInstance().getConfig().setCompressor(properties
-          .getProperty("compressor", TSFileDescriptor.getInstance().getConfig().getCompressor()));
+      loadTsFileProps(properties);
 
+    } catch (FileNotFoundException e) {
+      logger.warn("Fail to find config file {}", url, e);
     } catch (IOException e) {
-      logger.warn("Cannot load config file because, use default configuration", e);
+      logger.warn("Cannot load config file, use default configuration", e);
     } catch (Exception e) {
       logger.warn("Incorrect format in config file, use default configuration", e);
     } finally {
       // update all data seriesPath
       conf.updatePath();
-      try {
-        inputStream.close();
-      } catch (IOException e) {
-        logger.error("Fail to close config file input stream because ", e);
+    }
+  }
+
+  private void loadWALProps(Properties properties){
+    conf.setEnableWal(Boolean.parseBoolean(properties.getProperty("enable_wal",
+        Boolean.toString(conf.isEnableWal()))));
+
+    conf.setFlushWalThreshold(Integer
+        .parseInt(properties.getProperty("flush_wal_threshold",
+            Integer.toString(conf.getFlushWalThreshold()))));
+
+    conf.setForceWalPeriodInMs(Long
+        .parseLong(properties.getProperty("force_wal_period_in_ms",
+            Long.toString(conf.getForceWalPeriodInMs()))));
+
+  }
+
+  private void loadAutoCreateSchemaProps(Properties properties){
+    conf.setAutoCreateSchemaEnabled(
+        Boolean.parseBoolean(properties.getProperty("enable_auto_create_schema",
+            Boolean.toString(conf.isAutoCreateSchemaEnabled()).trim())));
+    conf.setDefaultStorageGroupLevel(
+        Integer.parseInt(properties.getProperty("default_storage_group_level",
+            Integer.toString(conf.getDefaultStorageGroupLevel()))));
+    conf.setDefaultBooleanEncoding(
+        properties.getProperty("default_boolean_encoding",
+            conf.getDefaultBooleanEncoding().toString()));
+    conf.setDefaultInt32Encoding(
+        properties.getProperty("default_int32_encoding",
+            conf.getDefaultInt32Encoding().toString()));
+    conf.setDefaultInt64Encoding(
+        properties.getProperty("default_int64_encoding",
+            conf.getDefaultInt64Encoding().toString()));
+    conf.setDefaultFloatEncoding(
+        properties.getProperty("default_float_encoding",
+            conf.getDefaultFloatEncoding().toString()));
+    conf.setDefaultDoubleEncoding(
+        properties.getProperty("default_double_encoding",
+            conf.getDefaultDoubleEncoding().toString()));
+    conf.setDefaultTextEncoding(
+        properties.getProperty("default_text_encoding",
+            conf.getDefaultTextEncoding().toString()));
+  }
+
+  private void loadTsFileProps(Properties properties){
+    TSFileDescriptor.getInstance().getConfig().setGroupSizeInByte(Integer
+        .parseInt(properties.getProperty("group_size_in_byte",
+            Integer.toString(TSFileDescriptor.getInstance().getConfig().getGroupSizeInByte()))));
+    TSFileDescriptor.getInstance().getConfig().setPageSizeInByte(Integer
+        .parseInt(properties.getProperty("page_size_in_byte",
+            Integer.toString(TSFileDescriptor.getInstance().getConfig().getPageSizeInByte()))));
+    if (TSFileDescriptor.getInstance().getConfig().getPageSizeInByte() > TSFileDescriptor
+        .getInstance().getConfig().getGroupSizeInByte()) {
+      logger
+          .warn("page_size is greater than group size, will set it as the same with group size");
+      TSFileDescriptor.getInstance().getConfig()
+          .setPageSizeInByte(TSFileDescriptor.getInstance().getConfig().getGroupSizeInByte());
+    }
+    TSFileDescriptor.getInstance().getConfig().setMaxNumberOfPointsInPage(Integer
+        .parseInt(properties.getProperty("max_number_of_points_in_page",
+            Integer.toString(
+                TSFileDescriptor.getInstance().getConfig().getMaxNumberOfPointsInPage()))));
+    TSFileDescriptor.getInstance().getConfig().setTimeSeriesDataType(properties
+        .getProperty("time_series_data_type",
+            TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType()));
+    TSFileDescriptor.getInstance().getConfig().setMaxStringLength(Integer
+        .parseInt(properties.getProperty("max_string_length",
+            Integer.toString(TSFileDescriptor.getInstance().getConfig().getMaxStringLength()))));
+    TSFileDescriptor.getInstance().getConfig().setBloomFilterErrorRate(Double
+        .parseDouble(properties.getProperty("bloom_filter_error_rate",
+            Double.toString(
+                TSFileDescriptor.getInstance().getConfig().getBloomFilterErrorRate()))));
+    TSFileDescriptor.getInstance().getConfig().setFloatPrecision(Integer
+        .parseInt(properties
+            .getProperty("float_precision", Integer
+                .toString(TSFileDescriptor.getInstance().getConfig().getFloatPrecision()))));
+    TSFileDescriptor.getInstance().getConfig().setTimeEncoder(properties
+        .getProperty("time_encoder",
+            TSFileDescriptor.getInstance().getConfig().getTimeEncoder()));
+    TSFileDescriptor.getInstance().getConfig().setValueEncoder(properties
+        .getProperty("value_encoder",
+            TSFileDescriptor.getInstance().getConfig().getValueEncoder()));
+    TSFileDescriptor.getInstance().getConfig().setCompressor(properties
+        .getProperty("compressor", TSFileDescriptor.getInstance().getConfig().getCompressor()));
+  }
+
+  public void loadHotModifiedProps() {
+    String url = getPropsUrl();
+    if (url == null) {
+      return;
+    }
+
+    try (InputStream inputStream = new FileInputStream(new File(url))) {
+      logger.info("Start to reload config file {}", url);
+      Properties properties = new Properties();
+      properties.load(inputStream);
+
+      // update data dirs
+      String dataDirs = properties.getProperty("data_dirs", null);
+      if(dataDirs != null){
+        conf.reloadDataDirs(dataDirs.split(","));
+      }
+
+      // update dir strategy
+      String multiDirStrategyClassName = properties.getProperty("multi_dir_strategy", null);
+      if (multiDirStrategyClassName != null && !multiDirStrategyClassName
+          .equals(conf.getMultiDirStrategyClassName())) {
+        conf.setMultiDirStrategyClassName(multiDirStrategyClassName);
+        DirectoryManager.getInstance().updateFileFolders();
+      }
+
+      // update WAL conf
+      loadWALProps(properties);
+
+      // time zone
+      conf.setZoneID(
+          ZoneId.of(properties.getProperty("time_zone", conf.getZoneID().toString().trim())));
+
+      // dynamic parameters
+      long tsfileSizeThreshold = Long.parseLong(properties
+          .getProperty("tsfile_size_threshold",
+              Long.toString(conf.getTsFileSizeThreshold())).trim());
+      if (tsfileSizeThreshold > 0 && !conf.isEnableParameterAdapter()) {
+        conf.setTsFileSizeThreshold(tsfileSizeThreshold);
+      }
+
+      long memTableSizeThreshold = Long.parseLong(properties
+          .getProperty("memtable_size_threshold",
+              Long.toString(conf.getMemtableSizeThreshold())).trim());
+      if (memTableSizeThreshold > 0 && !conf.isEnableParameterAdapter()) {
+        conf.setMemtableSizeThreshold(memTableSizeThreshold);
       }
+
+      // update params of creating schema automatically
+      loadAutoCreateSchemaProps(properties);
+
+      // update tsfile-format config
+      loadTsFileProps(properties);
+
+    } catch (FileNotFoundException e) {
+      logger.warn("Fail to reload config file {}", url, e);
+    } catch (IOException e) {
+      logger.warn("Cannot reload config file, use default configuration", e);
+    } catch (Exception e) {
+      logger.warn("Incorrect format in config file, use default configuration", e);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryManager.java b/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryManager.java
index 8c14adb..83e5016 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryManager.java
@@ -67,11 +67,33 @@ public class DirectoryManager {
       sequenceStrategy.init(sequenceFileFolders);
       unsequenceStrategy = (DirectoryStrategy) clazz.newInstance();
       unsequenceStrategy.init(unsequenceFileFolders);
+    } catch (DiskSpaceInsufficientException e) {
+      logger.error("All disks of folders are full.", e);
     } catch (Exception e) {
-      logger.error("can't find sequenceStrategy {} for mult-directories.", strategyName, e);
+      logger.error("Can't find sequenceStrategy {} for mult-directories.", strategyName, e);
     }
   }
 
+  public void updateFileFolders() {
+    try {
+      sequenceFileFolders =
+          new ArrayList<>(Arrays.asList(IoTDBDescriptor.getInstance().getConfig().getDataDirs()));
+      mkDataDirs(sequenceFileFolders);
+
+      unsequenceFileFolders =
+          new ArrayList<>(Arrays.asList(IoTDBDescriptor.getInstance().getConfig().getDataDirs()));
+      mkDataDirs(unsequenceFileFolders);
+      sequenceStrategy.init(sequenceFileFolders);
+      unsequenceStrategy.init(unsequenceFileFolders);
+    } catch (DiskSpaceInsufficientException e) {
+      logger.error("All disks of folders are full.", e);
+    }
+  }
+
+  private void updateDirectoryStrategy(){
+
+  }
+
   public static DirectoryManager getInstance() {
     return DirectoriesHolder.INSTANCE;
   }
@@ -147,8 +169,4 @@ public class DirectoryManager {
     return new ArrayList<>(unsequenceFileFolders);
   }
 
-  // only used by test
-  public String getUnSequenceFolderForTest() {
-    return unsequenceFileFolders.get(0);
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/directories/strategy/DirectoryStrategy.java b/server/src/main/java/org/apache/iotdb/db/conf/directories/strategy/DirectoryStrategy.java
index 05f38db..741d379 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/directories/strategy/DirectoryStrategy.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/directories/strategy/DirectoryStrategy.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.db.conf.directories.strategy;
 
 import java.util.List;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.DiskSpaceInsufficientException;
 import org.apache.iotdb.db.utils.CommonUtils;
 import org.slf4j.Logger;
@@ -54,6 +55,7 @@ public abstract class DirectoryStrategy {
       }
     }
     if (!hasSpace) {
+      IoTDBDescriptor.getInstance().getConfig().setReadOnly(true);
       throw new DiskSpaceInsufficientException(
           String.format("All disks of folders %s are full, can't init.", folders));
     }