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));
}