You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/08/25 01:14:51 UTC
[iotdb] 01/01: Support loading external lib in 0.13
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch ExternalLib013
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 727fd206b88eb9d73abee57f4da9f730304f7b98
Author: JackieTien97 <ja...@gmail.com>
AuthorDate: Thu Aug 25 09:14:36 2022 +0800
Support loading external lib in 0.13
---
external-api/pom.xml | 60 +
.../iotdb/external/api/IPropertiesLoader.java | 37 +
.../iotdb/external/api/ISeriesNumerLimiter.java | 48 +
pom.xml | 1 +
server/pom.xml | 5 +
.../resources/conf/iotdb-engine.properties | 25 +-
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 29 +
.../org/apache/iotdb/db/conf/IoTDBConstant.java | 4 +
.../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 1428 ++++++++++----------
.../metadata/SeriesNumberOverflowException.java | 28 +
.../org/apache/iotdb/db/metadata/MManager.java | 191 ++-
.../java/org/apache/iotdb/db/service/IoTDB.java | 5 +
.../org/apache/iotdb/db/utils/JarLoaderUtil.java | 156 +++
.../java/org/apache/iotdb/rpc/TSStatusCode.java | 2 +
.../iotdb/tsfile/common/conf/TSFileDescriptor.java | 2 +-
15 files changed, 1268 insertions(+), 753 deletions(-)
diff --git a/external-api/pom.xml b/external-api/pom.xml
new file mode 100644
index 0000000000..dd28dcdc69
--- /dev/null
+++ b/external-api/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>iotdb-parent</artifactId>
+ <groupId>org.apache.iotdb</groupId>
+ <version>0.13.2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>external-api</artifactId>
+ <profiles>
+ <profile>
+ <id>get-jar-with-dependencies</id>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>${maven.assembly.version}</version>
+ <configuration>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ </configuration>
+ <executions>
+ <execution>
+ <id>make-assembly</id>
+ <!-- this is used for inheritance merges -->
+ <phase>package</phase>
+ <!-- bind to the packaging phase -->
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
diff --git a/external-api/src/main/java/org/apche/iotdb/external/api/IPropertiesLoader.java b/external-api/src/main/java/org/apche/iotdb/external/api/IPropertiesLoader.java
new file mode 100644
index 0000000000..10c5b21e7e
--- /dev/null
+++ b/external-api/src/main/java/org/apche/iotdb/external/api/IPropertiesLoader.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apche.iotdb.external.api;
+
+import java.nio.file.Path;
+import java.util.Properties;
+
+/**
+ * An interface to load properties from external properties file to override the default
+ * configurations
+ */
+public interface IPropertiesLoader {
+
+ /**
+ * Load Properties from specific file
+ *
+ * @param file The path of the properties file to open
+ * @return a property list with values in file.
+ */
+ Properties loadProperties(Path file);
+}
diff --git a/external-api/src/main/java/org/apche/iotdb/external/api/ISeriesNumerLimiter.java b/external-api/src/main/java/org/apche/iotdb/external/api/ISeriesNumerLimiter.java
new file mode 100644
index 0000000000..7b36b5d8b7
--- /dev/null
+++ b/external-api/src/main/java/org/apche/iotdb/external/api/ISeriesNumerLimiter.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apche.iotdb.external.api;
+
+import java.util.Properties;
+
+/** An interface for series number limiting, users can implement their own limitation strategy */
+public interface ISeriesNumerLimiter {
+
+ /**
+ * do the necessary initialization
+ *
+ * @param properties Properties containing all the parameters needed to init
+ */
+ void init(Properties properties);
+
+ /**
+ * add time series
+ *
+ * @param number time series number for current createTimeSeries operation
+ * @return true if totalTimeSeriesNumber doesn't exceed the limit and current createTimeSeries
+ * operation is allowed, otherwise false
+ */
+ boolean addTimeSeries(int number);
+
+ /**
+ * delete time series
+ *
+ * @param number time series number for current deleteTimeSeries operation
+ */
+ void deleteTimeSeries(int number);
+}
diff --git a/pom.xml b/pom.xml
index 31d9b94d56..0b742019b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -110,6 +110,7 @@
<module>metrics</module>
<module>integration</module>
<module>rewriteFileTool</module>
+ <module>external-api</module>
<!-- <module>library-udf</module>-->
</modules>
<!-- Properties Management -->
diff --git a/server/pom.xml b/server/pom.xml
index cadf11281e..a8cdc0088a 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -67,6 +67,11 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.iotdb</groupId>
+ <artifactId>external-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.iotdb</groupId>
<artifactId>iotdb-thrift-sync</artifactId>
diff --git a/server/src/assembly/resources/conf/iotdb-engine.properties b/server/src/assembly/resources/conf/iotdb-engine.properties
index 0be00a433d..ebd1a35242 100644
--- a/server/src/assembly/resources/conf/iotdb-engine.properties
+++ b/server/src/assembly/resources/conf/iotdb-engine.properties
@@ -935,4 +935,27 @@ timestamp_precision=ms
### Group By Fill Configuration
####################
# Datatype: float
-# group_by_fill_cache_size_in_mb=1.0
\ No newline at end of file
+# group_by_fill_cache_size_in_mb=1.0
+
+
+####################
+### External Lib Configuration
+####################
+
+# external lib directory for properties loader
+# For Window platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is "\\\\", then the path is
+# absolute. Otherwise, it is relative.
+# external_properties_loader_dir=ext\\loader
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# external_properties_loader_dir=ext/loader
+
+# external lib directory for limiter
+# For Window platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is "\\\\", then the path is
+# absolute. Otherwise, it is relative.
+# external_limiter_dir=ext\\limiter
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# external_limiter_dir=ext/limiter
\ No newline at end of file
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 997ea249d6..c3e0bdcde9 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
@@ -49,6 +49,7 @@ public class IoTDBConfig {
/* Names of Watermark methods */
public static final String WATERMARK_GROUPED_LSB = "GroupBasedLSBMethod";
static final String CONFIG_NAME = "iotdb-engine.properties";
+ public static final String EXTERNAL_CONFIG_NAME = "iotdb-engine-external.properties";
private static final Logger logger = LoggerFactory.getLogger(IoTDBConfig.class);
private static final String MULTI_DIR_STRATEGY_PREFIX =
"org.apache.iotdb.db.conf.directories.strategy.";
@@ -245,6 +246,16 @@ public class IoTDBConfig {
private String triggerDir =
IoTDBConstant.EXT_FOLDER_NAME + File.separator + IoTDBConstant.TRIGGER_FOLDER_NAME;
+ /** External lib directory for properties loader, stores user-uploaded JAR files */
+ private String externalPropertiesLoaderDir =
+ IoTDBConstant.EXT_FOLDER_NAME
+ + File.separator
+ + IoTDBConstant.EXT_PROPERTIES_LOADER_FOLDER_NAME;
+
+ /** External lib directory for limiter, stores user uploaded JAR files */
+ private String externalLimiterDir =
+ IoTDBConstant.EXT_FOLDER_NAME + File.separator + IoTDBConstant.EXT_LIMITER;
+
/** Data directory of data. It can be settled as dataDirs = {"data1", "data2", "data3"}; */
private String[] dataDirs = {"data" + File.separator + "data"};
@@ -988,6 +999,8 @@ public class IoTDBConfig {
udfDir = addHomeDir(udfDir);
triggerDir = addHomeDir(triggerDir);
operationSyncLogDir = addHomeDir(operationSyncLogDir);
+ externalPropertiesLoaderDir = addHomeDir(externalPropertiesLoaderDir);
+ externalLimiterDir = addHomeDir(externalLimiterDir);
if (TSFileDescriptor.getInstance().getConfig().getTSFileStorageFs().equals(FSType.HDFS)) {
String hdfsDir = getHdfsDir();
@@ -1212,6 +1225,22 @@ public class IoTDBConfig {
this.triggerDir = triggerDir;
}
+ public String getExternalPropertiesLoaderDir() {
+ return externalPropertiesLoaderDir;
+ }
+
+ public void setExternalPropertiesLoaderDir(String externalPropertiesLoaderDir) {
+ this.externalPropertiesLoaderDir = externalPropertiesLoaderDir;
+ }
+
+ public String getExternalLimiterDir() {
+ return externalLimiterDir;
+ }
+
+ public void setExternalLimiterDir(String externalLimiterDir) {
+ this.externalLimiterDir = externalLimiterDir;
+ }
+
public String getMultiDirStrategyClassName() {
return multiDirStrategyClassName;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
index 1294002707..337a9e0a6e 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
@@ -191,6 +191,10 @@ public class IoTDBConstant {
// compaction mods of previous version (<0.13)
public static final String COMPACTION_MODIFICATION_FILE_NAME_FROM_OLD = "merge.mods";
+ public static final String EXT_PROPERTIES_LOADER_FOLDER_NAME = "loader";
+
+ public static final String EXT_LIMITER = "limiter";
+
// client version number
public enum ClientVersion {
V_0_12,
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 19d57c8699..cdb0057a2d 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
@@ -45,8 +45,11 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.MalformedURLException;
+import java.net.URISyntaxException;
import java.net.URL;
import java.net.UnknownHostException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Properties;
public class IoTDBDescriptor {
@@ -114,6 +117,52 @@ public class IoTDBDescriptor {
}
}
+ /**
+ * get external props url location
+ *
+ * @return url object if location exit, otherwise null.
+ */
+ public Path getExternalPropsPath() {
+ // Check if a config-directory was specified first.
+ String urlString = System.getProperty(IoTDBConstant.IOTDB_CONF, null);
+ // If it wasn't, check if a home directory was provided (This usually contains a config)
+ if (urlString == null) {
+ urlString = System.getProperty(IoTDBConstant.IOTDB_HOME, null);
+ if (urlString != null) {
+ urlString =
+ urlString
+ + File.separatorChar
+ + "conf"
+ + File.separatorChar
+ + IoTDBConfig.EXTERNAL_CONFIG_NAME;
+ } else {
+ // If this too wasn't provided, try to find a default config in the root of the classpath.
+ URL uri = IoTDBConfig.class.getResource("/" + IoTDBConfig.EXTERNAL_CONFIG_NAME);
+ if (uri != null) {
+ try {
+ return Paths.get(uri.toURI());
+ } catch (URISyntaxException e) {
+ return null;
+ }
+ }
+ logger.warn(
+ "Cannot find IOTDB_HOME or IOTDB_EXTERNAL_CONF environment variable when loading "
+ + "config file {}, use default configuration",
+ IoTDBConfig.EXTERNAL_CONFIG_NAME);
+ // update all data seriesPath
+ conf.updatePath();
+ return null;
+ }
+ }
+ // If a config location was provided, but it doesn't end with a properties file,
+ // append the default location.
+ else if (!urlString.endsWith(".properties")) {
+ urlString += (File.separatorChar + IoTDBConfig.EXTERNAL_CONFIG_NAME);
+ }
+
+ return Paths.get(urlString);
+ }
+
/** load an property file and set TsfileDBConfig variables. */
@SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
private void loadProps() {
@@ -129,814 +178,817 @@ public class IoTDBDescriptor {
Properties properties = new Properties();
properties.load(inputStream);
- conf.setRpcAddress(properties.getProperty("rpc_address", conf.getRpcAddress()));
- replaceHostnameWithIP();
+ loadProperties(properties);
- conf.setRpcThriftCompressionEnable(
- Boolean.parseBoolean(
- properties.getProperty(
- "rpc_thrift_compression_enable",
- Boolean.toString(conf.isRpcThriftCompressionEnable()))));
+ } catch (FileNotFoundException e) {
+ logger.warn("Fail to find config file {}", url, e);
+ } catch (IOException 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();
+ // update instance in metric
+ MetricConfigDescriptor.getInstance()
+ .getMetricConfig()
+ .updateRpcInstance(conf.getRpcAddress(), conf.getRpcPort());
+ }
+ }
- conf.setRpcAdvancedCompressionEnable(
- Boolean.parseBoolean(
- properties.getProperty(
- "rpc_advanced_compression_enable",
- Boolean.toString(conf.isRpcAdvancedCompressionEnable()))));
+ public void loadProperties(Properties properties) throws UnknownHostException {
- conf.setRpcPort(
- Integer.parseInt(
- properties.getProperty("rpc_port", Integer.toString(conf.getRpcPort()))));
+ conf.setRpcAddress(properties.getProperty("rpc_address", conf.getRpcAddress()));
+ replaceHostnameWithIP();
- conf.setEnableInfluxDBRpcService(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_influxdb_rpc_service",
- Boolean.toString(conf.isEnableInfluxDBRpcService()))));
+ conf.setRpcThriftCompressionEnable(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "rpc_thrift_compression_enable",
+ Boolean.toString(conf.isRpcThriftCompressionEnable()))));
- conf.setInfluxDBRpcPort(
- Integer.parseInt(
- properties.getProperty(
- "influxdb_rpc_port", Integer.toString(conf.getInfluxDBRpcPort()))));
+ conf.setRpcAdvancedCompressionEnable(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "rpc_advanced_compression_enable",
+ Boolean.toString(conf.isRpcAdvancedCompressionEnable()))));
- conf.setTimestampPrecision(
- properties.getProperty("timestamp_precision", conf.getTimestampPrecision()));
+ conf.setRpcPort(
+ Integer.parseInt(properties.getProperty("rpc_port", Integer.toString(conf.getRpcPort()))));
- conf.setBufferedArraysMemoryProportion(
- Double.parseDouble(
- properties.getProperty(
- "buffered_arrays_memory_proportion",
- Double.toString(conf.getBufferedArraysMemoryProportion()))));
+ conf.setEnableInfluxDBRpcService(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_influxdb_rpc_service",
+ Boolean.toString(conf.isEnableInfluxDBRpcService()))));
- conf.setTimeIndexMemoryProportion(
- Double.parseDouble(
- properties.getProperty(
- "time_index_memory_proportion",
- Double.toString(conf.getTimeIndexMemoryProportion()))));
+ conf.setInfluxDBRpcPort(
+ Integer.parseInt(
+ properties.getProperty(
+ "influxdb_rpc_port", Integer.toString(conf.getInfluxDBRpcPort()))));
- conf.setFlushProportion(
- Double.parseDouble(
- properties.getProperty(
- "flush_proportion", Double.toString(conf.getFlushProportion()))));
+ conf.setTimestampPrecision(
+ properties.getProperty("timestamp_precision", conf.getTimestampPrecision()));
- conf.setRejectProportion(
- Double.parseDouble(
- properties.getProperty(
- "reject_proportion", Double.toString(conf.getRejectProportion()))));
+ conf.setBufferedArraysMemoryProportion(
+ Double.parseDouble(
+ properties.getProperty(
+ "buffered_arrays_memory_proportion",
+ Double.toString(conf.getBufferedArraysMemoryProportion()))));
- conf.setStorageGroupSizeReportThreshold(
- Long.parseLong(
- properties.getProperty(
- "storage_group_report_threshold",
- Long.toString(conf.getStorageGroupSizeReportThreshold()))));
+ conf.setTimeIndexMemoryProportion(
+ Double.parseDouble(
+ properties.getProperty(
+ "time_index_memory_proportion",
+ Double.toString(conf.getTimeIndexMemoryProportion()))));
- conf.setMetaDataCacheEnable(
- Boolean.parseBoolean(
- properties.getProperty(
- "meta_data_cache_enable", Boolean.toString(conf.isMetaDataCacheEnable()))));
+ conf.setFlushProportion(
+ Double.parseDouble(
+ properties.getProperty(
+ "flush_proportion", Double.toString(conf.getFlushProportion()))));
- conf.setEnableLastCache(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_last_cache", Boolean.toString(conf.isLastCacheEnabled()))));
+ conf.setRejectProportion(
+ Double.parseDouble(
+ properties.getProperty(
+ "reject_proportion", Double.toString(conf.getRejectProportion()))));
+
+ conf.setStorageGroupSizeReportThreshold(
+ Long.parseLong(
+ properties.getProperty(
+ "storage_group_report_threshold",
+ Long.toString(conf.getStorageGroupSizeReportThreshold()))));
- initMemoryAllocate(properties);
+ conf.setMetaDataCacheEnable(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "meta_data_cache_enable", Boolean.toString(conf.isMetaDataCacheEnable()))));
- loadWALProps(properties);
+ conf.setEnableLastCache(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_last_cache", Boolean.toString(conf.isLastCacheEnabled()))));
- String systemDir = properties.getProperty("system_dir");
- if (systemDir == null) {
- systemDir = properties.getProperty("base_dir");
- if (systemDir != null) {
- systemDir = FilePathUtils.regularizePath(systemDir) + IoTDBConstant.SYSTEM_FOLDER_NAME;
- } else {
- systemDir = conf.getSystemDir();
- }
+ initMemoryAllocate(properties);
+
+ loadWALProps(properties);
+
+ String systemDir = properties.getProperty("system_dir");
+ if (systemDir == null) {
+ systemDir = properties.getProperty("base_dir");
+ if (systemDir != null) {
+ systemDir = FilePathUtils.regularizePath(systemDir) + IoTDBConstant.SYSTEM_FOLDER_NAME;
+ } else {
+ systemDir = conf.getSystemDir();
}
- conf.setSystemDir(systemDir);
+ }
+ conf.setSystemDir(systemDir);
- conf.setSchemaDir(
- FilePathUtils.regularizePath(conf.getSystemDir()) + IoTDBConstant.SCHEMA_FOLDER_NAME);
+ conf.setSchemaDir(
+ FilePathUtils.regularizePath(conf.getSystemDir()) + IoTDBConstant.SCHEMA_FOLDER_NAME);
- conf.setSyncDir(
- FilePathUtils.regularizePath(conf.getSystemDir()) + IoTDBConstant.SYNC_FOLDER_NAME);
+ conf.setSyncDir(
+ FilePathUtils.regularizePath(conf.getSystemDir()) + IoTDBConstant.SYNC_FOLDER_NAME);
- conf.setQueryDir(
- FilePathUtils.regularizePath(conf.getSystemDir() + IoTDBConstant.QUERY_FOLDER_NAME));
+ conf.setQueryDir(
+ FilePathUtils.regularizePath(conf.getSystemDir() + IoTDBConstant.QUERY_FOLDER_NAME));
- conf.setTracingDir(properties.getProperty("tracing_dir", conf.getTracingDir()));
+ conf.setTracingDir(properties.getProperty("tracing_dir", conf.getTracingDir()));
- conf.setDataDirs(properties.getProperty("data_dirs", conf.getDataDirs()[0]).split(","));
+ conf.setDataDirs(properties.getProperty("data_dirs", conf.getDataDirs()[0]).split(","));
- conf.setWalDir(properties.getProperty("wal_dir", conf.getWalDir()));
+ conf.setWalDir(properties.getProperty("wal_dir", conf.getWalDir()));
- int mlogBufferSize =
- Integer.parseInt(
- properties.getProperty(
- "mlog_buffer_size", Integer.toString(conf.getMlogBufferSize())));
- if (mlogBufferSize > 0) {
- conf.setMlogBufferSize(mlogBufferSize);
- }
+ int mlogBufferSize =
+ Integer.parseInt(
+ properties.getProperty("mlog_buffer_size", Integer.toString(conf.getMlogBufferSize())));
+ if (mlogBufferSize > 0) {
+ conf.setMlogBufferSize(mlogBufferSize);
+ }
- long forceMlogPeriodInMs =
- Long.parseLong(
- properties.getProperty(
- "sync_mlog_period_in_ms", Long.toString(conf.getSyncMlogPeriodInMs())));
- if (forceMlogPeriodInMs > 0) {
- conf.setSyncMlogPeriodInMs(forceMlogPeriodInMs);
- }
+ long forceMlogPeriodInMs =
+ Long.parseLong(
+ properties.getProperty(
+ "sync_mlog_period_in_ms", Long.toString(conf.getSyncMlogPeriodInMs())));
+ if (forceMlogPeriodInMs > 0) {
+ conf.setSyncMlogPeriodInMs(forceMlogPeriodInMs);
+ }
- conf.setMultiDirStrategyClassName(
- properties.getProperty("multi_dir_strategy", conf.getMultiDirStrategyClassName()));
+ conf.setMultiDirStrategyClassName(
+ properties.getProperty("multi_dir_strategy", conf.getMultiDirStrategyClassName()));
- conf.setBatchSize(
- Integer.parseInt(
- properties.getProperty("batch_size", Integer.toString(conf.getBatchSize()))));
+ conf.setBatchSize(
+ Integer.parseInt(
+ properties.getProperty("batch_size", Integer.toString(conf.getBatchSize()))));
- conf.setEnableMemControl(
- (Boolean.parseBoolean(
- properties.getProperty(
- "enable_mem_control", Boolean.toString(conf.isEnableMemControl())))));
- logger.info("IoTDB enable memory control: {}", conf.isEnableMemControl());
+ conf.setEnableMemControl(
+ (Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_mem_control", Boolean.toString(conf.isEnableMemControl())))));
+ logger.info("IoTDB enable memory control: {}", conf.isEnableMemControl());
- long seqTsFileSize =
- Long.parseLong(
- properties
- .getProperty("seq_tsfile_size", Long.toString(conf.getSeqTsFileSize()))
- .trim());
- if (seqTsFileSize >= 0) {
- conf.setSeqTsFileSize(seqTsFileSize);
- }
+ long seqTsFileSize =
+ Long.parseLong(
+ properties
+ .getProperty("seq_tsfile_size", Long.toString(conf.getSeqTsFileSize()))
+ .trim());
+ if (seqTsFileSize >= 0) {
+ conf.setSeqTsFileSize(seqTsFileSize);
+ }
- long unSeqTsFileSize =
- Long.parseLong(
- properties
- .getProperty("unseq_tsfile_size", Long.toString(conf.getUnSeqTsFileSize()))
- .trim());
- if (unSeqTsFileSize >= 0) {
- conf.setUnSeqTsFileSize(unSeqTsFileSize);
- }
+ long unSeqTsFileSize =
+ Long.parseLong(
+ properties
+ .getProperty("unseq_tsfile_size", Long.toString(conf.getUnSeqTsFileSize()))
+ .trim());
+ if (unSeqTsFileSize >= 0) {
+ conf.setUnSeqTsFileSize(unSeqTsFileSize);
+ }
- long memTableSizeThreshold =
- Long.parseLong(
- properties
- .getProperty(
- "memtable_size_threshold", Long.toString(conf.getMemtableSizeThreshold()))
- .trim());
- if (memTableSizeThreshold > 0) {
- conf.setMemtableSizeThreshold(memTableSizeThreshold);
- }
+ long memTableSizeThreshold =
+ Long.parseLong(
+ properties
+ .getProperty(
+ "memtable_size_threshold", Long.toString(conf.getMemtableSizeThreshold()))
+ .trim());
+ if (memTableSizeThreshold > 0) {
+ conf.setMemtableSizeThreshold(memTableSizeThreshold);
+ }
- conf.setAvgSeriesPointNumberThreshold(
- Integer.parseInt(
- properties.getProperty(
- "avg_series_point_number_threshold",
- Integer.toString(conf.getAvgSeriesPointNumberThreshold()))));
+ conf.setAvgSeriesPointNumberThreshold(
+ Integer.parseInt(
+ properties.getProperty(
+ "avg_series_point_number_threshold",
+ Integer.toString(conf.getAvgSeriesPointNumberThreshold()))));
- conf.setCheckPeriodWhenInsertBlocked(
- Integer.parseInt(
- properties.getProperty(
- "check_period_when_insert_blocked",
- Integer.toString(conf.getCheckPeriodWhenInsertBlocked()))));
+ conf.setCheckPeriodWhenInsertBlocked(
+ Integer.parseInt(
+ properties.getProperty(
+ "check_period_when_insert_blocked",
+ Integer.toString(conf.getCheckPeriodWhenInsertBlocked()))));
- conf.setMaxWaitingTimeWhenInsertBlocked(
- Integer.parseInt(
- properties.getProperty(
- "max_waiting_time_when_insert_blocked",
- Integer.toString(conf.getMaxWaitingTimeWhenInsertBlocked()))));
+ conf.setMaxWaitingTimeWhenInsertBlocked(
+ Integer.parseInt(
+ properties.getProperty(
+ "max_waiting_time_when_insert_blocked",
+ Integer.toString(conf.getMaxWaitingTimeWhenInsertBlocked()))));
- conf.setEstimatedSeriesSize(
- Integer.parseInt(
- properties.getProperty(
- "estimated_series_size", Integer.toString(conf.getEstimatedSeriesSize()))));
+ conf.setEstimatedSeriesSize(
+ Integer.parseInt(
+ properties.getProperty(
+ "estimated_series_size", Integer.toString(conf.getEstimatedSeriesSize()))));
- conf.setIoTaskQueueSizeForFlushing(
- Integer.parseInt(
- properties.getProperty(
- "io_task_queue_size_for_flushing",
- Integer.toString(conf.getIoTaskQueueSizeForFlushing()))));
+ conf.setIoTaskQueueSizeForFlushing(
+ Integer.parseInt(
+ properties.getProperty(
+ "io_task_queue_size_for_flushing",
+ Integer.toString(conf.getIoTaskQueueSizeForFlushing()))));
- conf.setCompactionScheduleIntervalInMs(
- Long.parseLong(
- properties.getProperty(
- "compaction_schedule_interval_in_ms",
- Long.toString(conf.getCompactionScheduleIntervalInMs()))));
+ conf.setCompactionScheduleIntervalInMs(
+ Long.parseLong(
+ properties.getProperty(
+ "compaction_schedule_interval_in_ms",
+ Long.toString(conf.getCompactionScheduleIntervalInMs()))));
- conf.setCompactionSubmissionIntervalInMs(
- Long.parseLong(
- properties.getProperty(
- "compaction_submission_interval_in_ms",
- Long.toString(conf.getCompactionSubmissionIntervalInMs()))));
+ conf.setCompactionSubmissionIntervalInMs(
+ Long.parseLong(
+ properties.getProperty(
+ "compaction_submission_interval_in_ms",
+ Long.toString(conf.getCompactionSubmissionIntervalInMs()))));
- conf.setEnableCrossSpaceCompaction(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_cross_space_compaction",
- Boolean.toString(conf.isEnableCrossSpaceCompaction()))));
+ conf.setEnableCrossSpaceCompaction(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_cross_space_compaction",
+ Boolean.toString(conf.isEnableCrossSpaceCompaction()))));
- conf.setEnableSeqSpaceCompaction(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_seq_space_compaction",
- Boolean.toString(conf.isEnableSeqSpaceCompaction()))));
+ conf.setEnableSeqSpaceCompaction(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_seq_space_compaction",
+ Boolean.toString(conf.isEnableSeqSpaceCompaction()))));
- conf.setEnableUnseqSpaceCompaction(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_unseq_space_compaction",
- Boolean.toString(conf.isEnableUnseqSpaceCompaction()))));
+ conf.setEnableUnseqSpaceCompaction(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_unseq_space_compaction",
+ Boolean.toString(conf.isEnableUnseqSpaceCompaction()))));
- conf.setCrossCompactionStrategy(
- CrossCompactionStrategy.getCrossCompactionStrategy(
- properties.getProperty(
- "cross_compaction_strategy", conf.getCrossCompactionStrategy().toString())));
+ conf.setCrossCompactionStrategy(
+ CrossCompactionStrategy.getCrossCompactionStrategy(
+ properties.getProperty(
+ "cross_compaction_strategy", conf.getCrossCompactionStrategy().toString())));
- conf.setInnerCompactionStrategy(
- InnerCompactionStrategy.getInnerCompactionStrategy(
- properties.getProperty(
- "inner_compaction_strategy", conf.getInnerCompactionStrategy().toString())));
+ conf.setInnerCompactionStrategy(
+ InnerCompactionStrategy.getInnerCompactionStrategy(
+ properties.getProperty(
+ "inner_compaction_strategy", conf.getInnerCompactionStrategy().toString())));
- conf.setCompactionPriority(
- CompactionPriority.valueOf(
- properties.getProperty(
- "compaction_priority", conf.getCompactionPriority().toString())));
+ conf.setCompactionPriority(
+ CompactionPriority.valueOf(
+ properties.getProperty(
+ "compaction_priority", conf.getCompactionPriority().toString())));
- int subtaskNum =
- Integer.parseInt(
- properties.getProperty(
- "sub_compaction_thread_num", Integer.toString(conf.getSubCompactionTaskNum())));
- subtaskNum = subtaskNum <= 0 ? 1 : subtaskNum;
- conf.setSubCompactionTaskNum(subtaskNum);
+ int subtaskNum =
+ Integer.parseInt(
+ properties.getProperty(
+ "sub_compaction_thread_num", Integer.toString(conf.getSubCompactionTaskNum())));
+ subtaskNum = subtaskNum <= 0 ? 1 : subtaskNum;
+ conf.setSubCompactionTaskNum(subtaskNum);
- conf.setQueryTimeoutThreshold(
- Integer.parseInt(
- properties.getProperty(
- "query_timeout_threshold", Integer.toString(conf.getQueryTimeoutThreshold()))));
+ conf.setQueryTimeoutThreshold(
+ Integer.parseInt(
+ properties.getProperty(
+ "query_timeout_threshold", Integer.toString(conf.getQueryTimeoutThreshold()))));
- conf.setSessionTimeoutThreshold(
- Integer.parseInt(
- properties.getProperty(
- "session_timeout_threshold",
- Integer.toString(conf.getSessionTimeoutThreshold()))));
+ conf.setSessionTimeoutThreshold(
+ Integer.parseInt(
+ properties.getProperty(
+ "session_timeout_threshold", Integer.toString(conf.getSessionTimeoutThreshold()))));
- conf.setSyncEnable(
- Boolean.parseBoolean(
- properties.getProperty("is_sync_enable", Boolean.toString(conf.isSyncEnable()))));
+ conf.setSyncEnable(
+ Boolean.parseBoolean(
+ properties.getProperty("is_sync_enable", Boolean.toString(conf.isSyncEnable()))));
- conf.setSyncServerPort(
- Integer.parseInt(
- properties
- .getProperty("sync_server_port", Integer.toString(conf.getSyncServerPort()))
- .trim()));
+ conf.setSyncServerPort(
+ Integer.parseInt(
+ properties
+ .getProperty("sync_server_port", Integer.toString(conf.getSyncServerPort()))
+ .trim()));
- conf.setIpWhiteList(properties.getProperty("ip_white_list", conf.getIpWhiteList()));
+ conf.setIpWhiteList(properties.getProperty("ip_white_list", conf.getIpWhiteList()));
- conf.setConcurrentFlushThread(
- Integer.parseInt(
- properties.getProperty(
- "concurrent_flush_thread", Integer.toString(conf.getConcurrentFlushThread()))));
+ conf.setConcurrentFlushThread(
+ Integer.parseInt(
+ properties.getProperty(
+ "concurrent_flush_thread", Integer.toString(conf.getConcurrentFlushThread()))));
- if (conf.getConcurrentFlushThread() <= 0) {
- conf.setConcurrentFlushThread(Runtime.getRuntime().availableProcessors());
- }
+ if (conf.getConcurrentFlushThread() <= 0) {
+ conf.setConcurrentFlushThread(Runtime.getRuntime().availableProcessors());
+ }
- // start: index parameter setting
- conf.setIndexRootFolder(properties.getProperty("index_root_dir", conf.getIndexRootFolder()));
+ // start: index parameter setting
+ conf.setIndexRootFolder(properties.getProperty("index_root_dir", conf.getIndexRootFolder()));
- conf.setEnableIndex(
- Boolean.parseBoolean(
- properties.getProperty("enable_index", Boolean.toString(conf.isEnableIndex()))));
+ conf.setEnableIndex(
+ Boolean.parseBoolean(
+ properties.getProperty("enable_index", Boolean.toString(conf.isEnableIndex()))));
- conf.setConcurrentIndexBuildThread(
- Integer.parseInt(
- properties.getProperty(
- "concurrent_index_build_thread",
- Integer.toString(conf.getConcurrentIndexBuildThread()))));
- if (conf.getConcurrentIndexBuildThread() <= 0) {
- conf.setConcurrentIndexBuildThread(Runtime.getRuntime().availableProcessors());
- }
+ conf.setConcurrentIndexBuildThread(
+ Integer.parseInt(
+ properties.getProperty(
+ "concurrent_index_build_thread",
+ Integer.toString(conf.getConcurrentIndexBuildThread()))));
+ if (conf.getConcurrentIndexBuildThread() <= 0) {
+ conf.setConcurrentIndexBuildThread(Runtime.getRuntime().availableProcessors());
+ }
- conf.setDefaultIndexWindowRange(
- Integer.parseInt(
- properties.getProperty(
- "default_index_window_range",
- Integer.toString(conf.getDefaultIndexWindowRange()))));
+ conf.setDefaultIndexWindowRange(
+ Integer.parseInt(
+ properties.getProperty(
+ "default_index_window_range",
+ Integer.toString(conf.getDefaultIndexWindowRange()))));
- conf.setIndexBufferSize(
- Long.parseLong(
- properties.getProperty(
- "index_buffer_size", Long.toString(conf.getIndexBufferSize()))));
- // end: index parameter setting
+ conf.setIndexBufferSize(
+ Long.parseLong(
+ properties.getProperty("index_buffer_size", Long.toString(conf.getIndexBufferSize()))));
+ // end: index parameter setting
- conf.setConcurrentQueryThread(
- Integer.parseInt(
- properties.getProperty(
- "concurrent_query_thread", Integer.toString(conf.getConcurrentQueryThread()))));
+ conf.setConcurrentQueryThread(
+ Integer.parseInt(
+ properties.getProperty(
+ "concurrent_query_thread", Integer.toString(conf.getConcurrentQueryThread()))));
- if (conf.getConcurrentQueryThread() <= 0) {
- conf.setConcurrentQueryThread(Runtime.getRuntime().availableProcessors());
- }
+ if (conf.getConcurrentQueryThread() <= 0) {
+ conf.setConcurrentQueryThread(Runtime.getRuntime().availableProcessors());
+ }
- conf.setConcurrentSubRawQueryThread(
- Integer.parseInt(
- properties.getProperty(
- "concurrent_sub_rawQuery_thread",
- Integer.toString(conf.getConcurrentSubRawQueryThread()))));
+ conf.setConcurrentSubRawQueryThread(
+ Integer.parseInt(
+ properties.getProperty(
+ "concurrent_sub_rawQuery_thread",
+ Integer.toString(conf.getConcurrentSubRawQueryThread()))));
- if (conf.getConcurrentSubRawQueryThread() <= 0) {
- conf.setConcurrentSubRawQueryThread(Runtime.getRuntime().availableProcessors());
- }
+ if (conf.getConcurrentSubRawQueryThread() <= 0) {
+ conf.setConcurrentSubRawQueryThread(Runtime.getRuntime().availableProcessors());
+ }
- conf.setRawQueryBlockingQueueCapacity(
- Integer.parseInt(
- properties.getProperty(
- "raw_query_blocking_queue_capacity",
- Integer.toString(conf.getRawQueryBlockingQueueCapacity()))));
+ conf.setRawQueryBlockingQueueCapacity(
+ Integer.parseInt(
+ properties.getProperty(
+ "raw_query_blocking_queue_capacity",
+ Integer.toString(conf.getRawQueryBlockingQueueCapacity()))));
- conf.setmManagerCacheSize(
- Integer.parseInt(
- properties
- .getProperty(
- "metadata_node_cache_size", Integer.toString(conf.getmManagerCacheSize()))
- .trim()));
+ conf.setmManagerCacheSize(
+ Integer.parseInt(
+ properties
+ .getProperty(
+ "metadata_node_cache_size", Integer.toString(conf.getmManagerCacheSize()))
+ .trim()));
- conf.setmRemoteSchemaCacheSize(
- Integer.parseInt(
- properties
- .getProperty(
- "remote_schema_cache_size",
- Integer.toString(conf.getmRemoteSchemaCacheSize()))
- .trim()));
+ conf.setmRemoteSchemaCacheSize(
+ Integer.parseInt(
+ properties
+ .getProperty(
+ "remote_schema_cache_size", Integer.toString(conf.getmRemoteSchemaCacheSize()))
+ .trim()));
- conf.setLanguageVersion(
- properties.getProperty("language_version", conf.getLanguageVersion()).trim());
+ conf.setLanguageVersion(
+ properties.getProperty("language_version", conf.getLanguageVersion()).trim());
- if (properties.containsKey("chunk_buffer_pool_enable")) {
- conf.setChunkBufferPoolEnable(
- Boolean.parseBoolean(properties.getProperty("chunk_buffer_pool_enable")));
- }
+ if (properties.containsKey("chunk_buffer_pool_enable")) {
+ conf.setChunkBufferPoolEnable(
+ Boolean.parseBoolean(properties.getProperty("chunk_buffer_pool_enable")));
+ }
- conf.setEnableExternalSort(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_external_sort", Boolean.toString(conf.isEnableExternalSort()))));
- conf.setExternalSortThreshold(
- Integer.parseInt(
- properties.getProperty(
- "external_sort_threshold", Integer.toString(conf.getExternalSortThreshold()))));
- conf.setUpgradeThreadNum(
- Integer.parseInt(
- properties.getProperty(
- "upgrade_thread_num", Integer.toString(conf.getUpgradeThreadNum()))));
- conf.setCrossCompactionMemoryBudget(
- Long.parseLong(
- properties.getProperty(
- "cross_compaction_memory_budget",
- Long.toString(conf.getCrossCompactionMemoryBudget()))));
- conf.setCrossCompactionFileSelectionTimeBudget(
- Long.parseLong(
- properties.getProperty(
- "cross_compaction_file_selection_time_budget",
- Long.toString(conf.getCrossCompactionFileSelectionTimeBudget()))));
- conf.setMergeIntervalSec(
- Long.parseLong(
- properties.getProperty(
- "merge_interval_sec", Long.toString(conf.getMergeIntervalSec()))));
- conf.setConcurrentCompactionThread(
- Integer.parseInt(
- properties.getProperty(
- "concurrent_compaction_thread",
- Integer.toString(conf.getConcurrentCompactionThread()))));
- conf.setTargetCompactionFileSize(
- Long.parseLong(
- properties.getProperty(
- "target_compaction_file_size",
- Long.toString(conf.getTargetCompactionFileSize()))));
- conf.setTargetChunkSize(
- Long.parseLong(
- properties.getProperty(
- "target_chunk_size", Long.toString(conf.getTargetChunkSize()))));
- conf.setTargetChunkPointNum(
- Long.parseLong(
- properties.getProperty(
- "target_chunk_point_num", Long.toString(conf.getTargetChunkPointNum()))));
- conf.setChunkPointNumLowerBoundInCompaction(
- Long.parseLong(
- properties.getProperty(
- "chunk_size_lower_bound_in_compaction",
- Long.toString(conf.getChunkPointNumLowerBoundInCompaction()))));
- conf.setChunkSizeLowerBoundInCompaction(
- Long.parseLong(
- properties.getProperty(
- "chunk_size_lower_bound_in_compaction",
- Long.toString(conf.getChunkSizeLowerBoundInCompaction()))));
- conf.setMaxInnerCompactionCandidateFileNum(
- Integer.parseInt(
- properties.getProperty(
- "max_inner_compaction_candidate_file_num",
- Integer.toString(conf.getMaxInnerCompactionCandidateFileNum()))));
- conf.setMaxCrossCompactionCandidateFileNum(
- Integer.parseInt(
- properties.getProperty(
- "max_cross_compaction_candidate_file_num",
- Integer.toString(conf.getMaxCrossCompactionCandidateFileNum()))));
+ conf.setEnableExternalSort(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_external_sort", Boolean.toString(conf.isEnableExternalSort()))));
+ conf.setExternalSortThreshold(
+ Integer.parseInt(
+ properties.getProperty(
+ "external_sort_threshold", Integer.toString(conf.getExternalSortThreshold()))));
+ conf.setUpgradeThreadNum(
+ Integer.parseInt(
+ properties.getProperty(
+ "upgrade_thread_num", Integer.toString(conf.getUpgradeThreadNum()))));
+ conf.setCrossCompactionMemoryBudget(
+ Long.parseLong(
+ properties.getProperty(
+ "cross_compaction_memory_budget",
+ Long.toString(conf.getCrossCompactionMemoryBudget()))));
+ conf.setCrossCompactionFileSelectionTimeBudget(
+ Long.parseLong(
+ properties.getProperty(
+ "cross_compaction_file_selection_time_budget",
+ Long.toString(conf.getCrossCompactionFileSelectionTimeBudget()))));
+ conf.setMergeIntervalSec(
+ Long.parseLong(
+ properties.getProperty(
+ "merge_interval_sec", Long.toString(conf.getMergeIntervalSec()))));
+ conf.setConcurrentCompactionThread(
+ Integer.parseInt(
+ properties.getProperty(
+ "concurrent_compaction_thread",
+ Integer.toString(conf.getConcurrentCompactionThread()))));
+ conf.setTargetCompactionFileSize(
+ Long.parseLong(
+ properties.getProperty(
+ "target_compaction_file_size", Long.toString(conf.getTargetCompactionFileSize()))));
+ conf.setTargetChunkSize(
+ Long.parseLong(
+ properties.getProperty("target_chunk_size", Long.toString(conf.getTargetChunkSize()))));
+ conf.setTargetChunkPointNum(
+ Long.parseLong(
+ properties.getProperty(
+ "target_chunk_point_num", Long.toString(conf.getTargetChunkPointNum()))));
+ conf.setChunkPointNumLowerBoundInCompaction(
+ Long.parseLong(
+ properties.getProperty(
+ "chunk_size_lower_bound_in_compaction",
+ Long.toString(conf.getChunkPointNumLowerBoundInCompaction()))));
+ conf.setChunkSizeLowerBoundInCompaction(
+ Long.parseLong(
+ properties.getProperty(
+ "chunk_size_lower_bound_in_compaction",
+ Long.toString(conf.getChunkSizeLowerBoundInCompaction()))));
+ conf.setMaxInnerCompactionCandidateFileNum(
+ Integer.parseInt(
+ properties.getProperty(
+ "max_inner_compaction_candidate_file_num",
+ Integer.toString(conf.getMaxInnerCompactionCandidateFileNum()))));
+ conf.setMaxCrossCompactionCandidateFileNum(
+ Integer.parseInt(
+ properties.getProperty(
+ "max_cross_compaction_candidate_file_num",
+ Integer.toString(conf.getMaxCrossCompactionCandidateFileNum()))));
- conf.setCompactionWriteThroughputMbPerSec(
- Integer.parseInt(
- properties.getProperty(
- "compaction_write_throughput_mb_per_sec",
- Integer.toString(conf.getCompactionWriteThroughputMbPerSec()))));
+ conf.setCompactionWriteThroughputMbPerSec(
+ Integer.parseInt(
+ properties.getProperty(
+ "compaction_write_throughput_mb_per_sec",
+ Integer.toString(conf.getCompactionWriteThroughputMbPerSec()))));
- conf.setEnablePartialInsert(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_partial_insert", String.valueOf(conf.isEnablePartialInsert()))));
+ conf.setEnablePartialInsert(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_partial_insert", String.valueOf(conf.isEnablePartialInsert()))));
- conf.setEnableMTreeSnapshot(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_mtree_snapshot", Boolean.toString(conf.isEnableMTreeSnapshot()))));
- conf.setMtreeSnapshotInterval(
- Integer.parseInt(
- properties.getProperty(
- "mtree_snapshot_interval", Integer.toString(conf.getMtreeSnapshotInterval()))));
- conf.setMtreeSnapshotThresholdTime(
- Integer.parseInt(
- properties.getProperty(
- "mtree_snapshot_threshold_time",
- Integer.toString(conf.getMtreeSnapshotThresholdTime()))));
+ conf.setEnableMTreeSnapshot(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_mtree_snapshot", Boolean.toString(conf.isEnableMTreeSnapshot()))));
+ conf.setMtreeSnapshotInterval(
+ Integer.parseInt(
+ properties.getProperty(
+ "mtree_snapshot_interval", Integer.toString(conf.getMtreeSnapshotInterval()))));
+ conf.setMtreeSnapshotThresholdTime(
+ Integer.parseInt(
+ properties.getProperty(
+ "mtree_snapshot_threshold_time",
+ Integer.toString(conf.getMtreeSnapshotThresholdTime()))));
- int maxConcurrentClientNum =
- Integer.parseInt(
- properties.getProperty(
- "rpc_max_concurrent_client_num",
- Integer.toString(conf.getRpcMaxConcurrentClientNum()).trim()));
- if (maxConcurrentClientNum <= 0) {
- maxConcurrentClientNum = 65535;
- }
+ int maxConcurrentClientNum =
+ Integer.parseInt(
+ properties.getProperty(
+ "rpc_max_concurrent_client_num",
+ Integer.toString(conf.getRpcMaxConcurrentClientNum()).trim()));
+ if (maxConcurrentClientNum <= 0) {
+ maxConcurrentClientNum = 65535;
+ }
- conf.setEnableWatermark(
- Boolean.parseBoolean(
- properties.getProperty(
- "watermark_module_opened", Boolean.toString(conf.isEnableWatermark()).trim())));
- conf.setWatermarkSecretKey(
- properties.getProperty("watermark_secret_key", conf.getWatermarkSecretKey()));
- conf.setWatermarkBitString(
- properties.getProperty("watermark_bit_string", conf.getWatermarkBitString()));
- conf.setWatermarkMethod(
- properties.getProperty("watermark_method", conf.getWatermarkMethod()));
+ conf.setEnableWatermark(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "watermark_module_opened", Boolean.toString(conf.isEnableWatermark()).trim())));
+ conf.setWatermarkSecretKey(
+ properties.getProperty("watermark_secret_key", conf.getWatermarkSecretKey()));
+ conf.setWatermarkBitString(
+ properties.getProperty("watermark_bit_string", conf.getWatermarkBitString()));
+ conf.setWatermarkMethod(properties.getProperty("watermark_method", conf.getWatermarkMethod()));
+
+ loadAutoCreateSchemaProps(properties);
+
+ conf.setRpcMaxConcurrentClientNum(maxConcurrentClientNum);
+
+ conf.setTsFileStorageFs(
+ properties.getProperty("tsfile_storage_fs", conf.getTsFileStorageFs().toString()));
+ conf.setCoreSitePath(properties.getProperty("core_site_path", conf.getCoreSitePath()));
+ conf.setHdfsSitePath(properties.getProperty("hdfs_site_path", conf.getHdfsSitePath()));
+ conf.setHdfsIp(properties.getProperty("hdfs_ip", conf.getRawHDFSIp()).split(","));
+ conf.setHdfsPort(properties.getProperty("hdfs_port", conf.getHdfsPort()));
+ conf.setDfsNameServices(properties.getProperty("dfs_nameservices", conf.getDfsNameServices()));
+ conf.setDfsHaNamenodes(
+ properties.getProperty("dfs_ha_namenodes", conf.getRawDfsHaNamenodes()).split(","));
+ conf.setDfsHaAutomaticFailoverEnabled(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "dfs_ha_automatic_failover_enabled",
+ String.valueOf(conf.isDfsHaAutomaticFailoverEnabled()))));
+ conf.setDfsClientFailoverProxyProvider(
+ properties.getProperty(
+ "dfs_client_failover_proxy_provider", conf.getDfsClientFailoverProxyProvider()));
+ conf.setUseKerberos(
+ Boolean.parseBoolean(
+ properties.getProperty("hdfs_use_kerberos", String.valueOf(conf.isUseKerberos()))));
+ conf.setKerberosKeytabFilePath(
+ properties.getProperty("kerberos_keytab_file_path", conf.getKerberosKeytabFilePath()));
+ conf.setKerberosPrincipal(
+ properties.getProperty("kerberos_principal", conf.getKerberosPrincipal()));
- loadAutoCreateSchemaProps(properties);
+ conf.setDefaultTTL(
+ Long.parseLong(
+ properties.getProperty("default_ttl", String.valueOf(conf.getDefaultTTL()))));
- conf.setRpcMaxConcurrentClientNum(maxConcurrentClientNum);
-
- conf.setTsFileStorageFs(
- properties.getProperty("tsfile_storage_fs", conf.getTsFileStorageFs().toString()));
- conf.setCoreSitePath(properties.getProperty("core_site_path", conf.getCoreSitePath()));
- conf.setHdfsSitePath(properties.getProperty("hdfs_site_path", conf.getHdfsSitePath()));
- conf.setHdfsIp(properties.getProperty("hdfs_ip", conf.getRawHDFSIp()).split(","));
- conf.setHdfsPort(properties.getProperty("hdfs_port", conf.getHdfsPort()));
- conf.setDfsNameServices(
- properties.getProperty("dfs_nameservices", conf.getDfsNameServices()));
- conf.setDfsHaNamenodes(
- properties.getProperty("dfs_ha_namenodes", conf.getRawDfsHaNamenodes()).split(","));
- conf.setDfsHaAutomaticFailoverEnabled(
- Boolean.parseBoolean(
- properties.getProperty(
- "dfs_ha_automatic_failover_enabled",
- String.valueOf(conf.isDfsHaAutomaticFailoverEnabled()))));
- conf.setDfsClientFailoverProxyProvider(
- properties.getProperty(
- "dfs_client_failover_proxy_provider", conf.getDfsClientFailoverProxyProvider()));
- conf.setUseKerberos(
- Boolean.parseBoolean(
- properties.getProperty("hdfs_use_kerberos", String.valueOf(conf.isUseKerberos()))));
- conf.setKerberosKeytabFilePath(
- properties.getProperty("kerberos_keytab_file_path", conf.getKerberosKeytabFilePath()));
- conf.setKerberosPrincipal(
- properties.getProperty("kerberos_principal", conf.getKerberosPrincipal()));
-
- conf.setDefaultTTL(
- Long.parseLong(
- properties.getProperty("default_ttl", String.valueOf(conf.getDefaultTTL()))));
+ conf.setAllowReadOnlyWhenErrorsOccur(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "allow_read_only_when_errors_occur",
+ String.valueOf(conf.isAllowReadOnlyWhenErrorsOccur()))));
- conf.setAllowReadOnlyWhenErrorsOccur(
- Boolean.parseBoolean(
- properties.getProperty(
- "allow_read_only_when_errors_occur",
- String.valueOf(conf.isAllowReadOnlyWhenErrorsOccur()))));
+ // the num of memtables in each storage group
+ conf.setConcurrentWritingTimePartition(
+ Integer.parseInt(
+ properties.getProperty(
+ "concurrent_writing_time_partition",
+ String.valueOf(conf.getConcurrentWritingTimePartition()))));
- // the num of memtables in each storage group
- conf.setConcurrentWritingTimePartition(
- Integer.parseInt(
- properties.getProperty(
- "concurrent_writing_time_partition",
- String.valueOf(conf.getConcurrentWritingTimePartition()))));
+ // the default fill interval in LinearFill and PreviousFill
+ conf.setDefaultFillInterval(
+ Integer.parseInt(
+ properties.getProperty(
+ "default_fill_interval", String.valueOf(conf.getDefaultFillInterval()))));
- // the default fill interval in LinearFill and PreviousFill
- conf.setDefaultFillInterval(
- Integer.parseInt(
- properties.getProperty(
- "default_fill_interval", String.valueOf(conf.getDefaultFillInterval()))));
+ conf.setTagAttributeTotalSize(
+ Integer.parseInt(
+ properties.getProperty(
+ "tag_attribute_total_size", String.valueOf(conf.getTagAttributeTotalSize()))));
- conf.setTagAttributeTotalSize(
- Integer.parseInt(
- properties.getProperty(
- "tag_attribute_total_size", String.valueOf(conf.getTagAttributeTotalSize()))));
+ conf.setTagAttributeFlushInterval(
+ Integer.parseInt(
+ properties.getProperty(
+ "tag_attribute_flush_interval",
+ String.valueOf(conf.getTagAttributeFlushInterval()))));
- conf.setTagAttributeFlushInterval(
- Integer.parseInt(
- properties.getProperty(
- "tag_attribute_flush_interval",
- String.valueOf(conf.getTagAttributeFlushInterval()))));
+ conf.setPrimitiveArraySize(
+ (Integer.parseInt(
+ properties.getProperty(
+ "primitive_array_size", String.valueOf(conf.getPrimitiveArraySize())))));
- conf.setPrimitiveArraySize(
- (Integer.parseInt(
- properties.getProperty(
- "primitive_array_size", String.valueOf(conf.getPrimitiveArraySize())))));
+ conf.setThriftMaxFrameSize(
+ Integer.parseInt(
+ properties.getProperty(
+ "thrift_max_frame_size", String.valueOf(conf.getThriftMaxFrameSize()))));
- conf.setThriftMaxFrameSize(
- Integer.parseInt(
- properties.getProperty(
- "thrift_max_frame_size", String.valueOf(conf.getThriftMaxFrameSize()))));
+ if (conf.getThriftMaxFrameSize() < IoTDBConstant.LEFT_SIZE_IN_REQUEST * 2) {
+ conf.setThriftMaxFrameSize(IoTDBConstant.LEFT_SIZE_IN_REQUEST * 2);
+ }
- if (conf.getThriftMaxFrameSize() < IoTDBConstant.LEFT_SIZE_IN_REQUEST * 2) {
- conf.setThriftMaxFrameSize(IoTDBConstant.LEFT_SIZE_IN_REQUEST * 2);
- }
+ conf.setThriftDefaultBufferSize(
+ Integer.parseInt(
+ properties.getProperty(
+ "thrift_init_buffer_size", String.valueOf(conf.getThriftDefaultBufferSize()))));
- conf.setThriftDefaultBufferSize(
- Integer.parseInt(
- properties.getProperty(
- "thrift_init_buffer_size", String.valueOf(conf.getThriftDefaultBufferSize()))));
+ conf.setFrequencyIntervalInMinute(
+ Integer.parseInt(
+ properties.getProperty(
+ "frequency_interval_in_minute",
+ String.valueOf(conf.getFrequencyIntervalInMinute()))));
- conf.setFrequencyIntervalInMinute(
- Integer.parseInt(
- properties.getProperty(
- "frequency_interval_in_minute",
- String.valueOf(conf.getFrequencyIntervalInMinute()))));
+ conf.setSlowQueryThreshold(
+ Long.parseLong(
+ properties.getProperty(
+ "slow_query_threshold", String.valueOf(conf.getSlowQueryThreshold()))));
- conf.setSlowQueryThreshold(
- Long.parseLong(
- properties.getProperty(
- "slow_query_threshold", String.valueOf(conf.getSlowQueryThreshold()))));
+ conf.setVirtualStorageGroupNum(
+ Integer.parseInt(
+ properties.getProperty(
+ "virtual_storage_group_num", String.valueOf(conf.getVirtualStorageGroupNum()))));
- conf.setVirtualStorageGroupNum(
- Integer.parseInt(
- properties.getProperty(
- "virtual_storage_group_num", String.valueOf(conf.getVirtualStorageGroupNum()))));
+ conf.setRecoveryLogIntervalInMs(
+ Long.parseLong(
+ properties.getProperty(
+ "recovery_log_interval_in_ms", String.valueOf(conf.getRecoveryLogIntervalInMs()))));
- conf.setRecoveryLogIntervalInMs(
- Long.parseLong(
- properties.getProperty(
- "recovery_log_interval_in_ms",
- String.valueOf(conf.getRecoveryLogIntervalInMs()))));
+ conf.setConcurrentWindowEvaluationThread(
+ Integer.parseInt(
+ properties.getProperty(
+ "concurrent_window_evaluation_thread",
+ Integer.toString(conf.getConcurrentWindowEvaluationThread()))));
+ if (conf.getConcurrentWindowEvaluationThread() <= 0) {
+ conf.setConcurrentWindowEvaluationThread(Runtime.getRuntime().availableProcessors());
+ }
- conf.setConcurrentWindowEvaluationThread(
- Integer.parseInt(
- properties.getProperty(
- "concurrent_window_evaluation_thread",
- Integer.toString(conf.getConcurrentWindowEvaluationThread()))));
- if (conf.getConcurrentWindowEvaluationThread() <= 0) {
- conf.setConcurrentWindowEvaluationThread(Runtime.getRuntime().availableProcessors());
- }
+ conf.setMaxPendingWindowEvaluationTasks(
+ Integer.parseInt(
+ properties.getProperty(
+ "max_pending_window_evaluation_tasks",
+ Integer.toString(conf.getMaxPendingWindowEvaluationTasks()))));
+ if (conf.getMaxPendingWindowEvaluationTasks() <= 0) {
+ conf.setMaxPendingWindowEvaluationTasks(64);
+ }
- conf.setMaxPendingWindowEvaluationTasks(
- Integer.parseInt(
- properties.getProperty(
- "max_pending_window_evaluation_tasks",
- Integer.toString(conf.getMaxPendingWindowEvaluationTasks()))));
- if (conf.getMaxPendingWindowEvaluationTasks() <= 0) {
- conf.setMaxPendingWindowEvaluationTasks(64);
- }
+ // id table related configuration
+ // conf.setDeviceIDTransformationMethod(
+ // properties.getProperty(
+ // "device_id_transformation_method", conf.getDeviceIDTransformationMethod()));
+
+ // conf.setEnableIDTable(
+ // Boolean.parseBoolean(
+ // properties.getProperty("enable_id_table",
+ // String.valueOf(conf.isEnableIDTable()))));
+
+ // conf.setEnableIDTableLogFile(
+ // Boolean.parseBoolean(
+ // properties.getProperty(
+ // "enable_id_table_log_file",
+ // String.valueOf(conf.isEnableIDTableLogFile()))));
+
+ // mqtt
+ if (properties.getProperty(IoTDBConstant.MQTT_HOST_NAME) != null) {
+ conf.setMqttHost(properties.getProperty(IoTDBConstant.MQTT_HOST_NAME));
+ }
+ if (properties.getProperty(IoTDBConstant.MQTT_PORT_NAME) != null) {
+ conf.setMqttPort(Integer.parseInt(properties.getProperty(IoTDBConstant.MQTT_PORT_NAME)));
+ }
+ if (properties.getProperty(IoTDBConstant.MQTT_HANDLER_POOL_SIZE_NAME) != null) {
+ conf.setMqttHandlerPoolSize(
+ Integer.parseInt(properties.getProperty(IoTDBConstant.MQTT_HANDLER_POOL_SIZE_NAME)));
+ }
+ if (properties.getProperty(IoTDBConstant.MQTT_PAYLOAD_FORMATTER_NAME) != null) {
+ conf.setMqttPayloadFormatter(
+ properties.getProperty(IoTDBConstant.MQTT_PAYLOAD_FORMATTER_NAME));
+ }
+ if (properties.getProperty(IoTDBConstant.ENABLE_MQTT) != null) {
+ conf.setEnableMQTTService(
+ Boolean.parseBoolean(properties.getProperty(IoTDBConstant.ENABLE_MQTT)));
+ }
+ if (properties.getProperty(IoTDBConstant.MQTT_MAX_MESSAGE_SIZE) != null) {
+ conf.setMqttMaxMessageSize(
+ Integer.parseInt(properties.getProperty(IoTDBConstant.MQTT_MAX_MESSAGE_SIZE)));
+ }
- // id table related configuration
- // conf.setDeviceIDTransformationMethod(
- // properties.getProperty(
- // "device_id_transformation_method", conf.getDeviceIDTransformationMethod()));
-
- // conf.setEnableIDTable(
- // Boolean.parseBoolean(
- // properties.getProperty("enable_id_table",
- // String.valueOf(conf.isEnableIDTable()))));
-
- // conf.setEnableIDTableLogFile(
- // Boolean.parseBoolean(
- // properties.getProperty(
- // "enable_id_table_log_file",
- // String.valueOf(conf.isEnableIDTableLogFile()))));
-
- // mqtt
- if (properties.getProperty(IoTDBConstant.MQTT_HOST_NAME) != null) {
- conf.setMqttHost(properties.getProperty(IoTDBConstant.MQTT_HOST_NAME));
- }
- if (properties.getProperty(IoTDBConstant.MQTT_PORT_NAME) != null) {
- conf.setMqttPort(Integer.parseInt(properties.getProperty(IoTDBConstant.MQTT_PORT_NAME)));
- }
- if (properties.getProperty(IoTDBConstant.MQTT_HANDLER_POOL_SIZE_NAME) != null) {
- conf.setMqttHandlerPoolSize(
- Integer.parseInt(properties.getProperty(IoTDBConstant.MQTT_HANDLER_POOL_SIZE_NAME)));
- }
- if (properties.getProperty(IoTDBConstant.MQTT_PAYLOAD_FORMATTER_NAME) != null) {
- conf.setMqttPayloadFormatter(
- properties.getProperty(IoTDBConstant.MQTT_PAYLOAD_FORMATTER_NAME));
- }
- if (properties.getProperty(IoTDBConstant.ENABLE_MQTT) != null) {
- conf.setEnableMQTTService(
- Boolean.parseBoolean(properties.getProperty(IoTDBConstant.ENABLE_MQTT)));
- }
- if (properties.getProperty(IoTDBConstant.MQTT_MAX_MESSAGE_SIZE) != null) {
- conf.setMqttMaxMessageSize(
- Integer.parseInt(properties.getProperty(IoTDBConstant.MQTT_MAX_MESSAGE_SIZE)));
- }
+ conf.setAuthorizerProvider(
+ properties.getProperty("authorizer_provider_class", conf.getAuthorizerProvider()));
+ // if using org.apache.iotdb.db.auth.authorizer.OpenIdAuthorizer, openID_url is needed.
+ conf.setOpenIdProviderUrl(properties.getProperty("openID_url", conf.getOpenIdProviderUrl()));
- conf.setAuthorizerProvider(
- properties.getProperty("authorizer_provider_class", conf.getAuthorizerProvider()));
- // if using org.apache.iotdb.db.auth.authorizer.OpenIdAuthorizer, openID_url is needed.
- conf.setOpenIdProviderUrl(properties.getProperty("openID_url", conf.getOpenIdProviderUrl()));
+ conf.setEnablePartition(
+ Boolean.parseBoolean(
+ properties.getProperty("enable_partition", String.valueOf(conf.isEnablePartition()))));
- conf.setEnablePartition(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_partition", String.valueOf(conf.isEnablePartition()))));
+ conf.setPartitionInterval(
+ Long.parseLong(
+ properties.getProperty(
+ "partition_interval", String.valueOf(conf.getPartitionInterval()))));
- conf.setPartitionInterval(
- Long.parseLong(
- properties.getProperty(
- "partition_interval", String.valueOf(conf.getPartitionInterval()))));
+ conf.setAdminName(properties.getProperty("admin_name", conf.getAdminName()));
- conf.setAdminName(properties.getProperty("admin_name", conf.getAdminName()));
+ conf.setAdminPassword(properties.getProperty("admin_password", conf.getAdminPassword()));
- conf.setAdminPassword(properties.getProperty("admin_password", conf.getAdminPassword()));
+ conf.setSelectIntoInsertTabletPlanRowLimit(
+ Integer.parseInt(
+ properties.getProperty(
+ "select_into_insert_tablet_plan_row_limit",
+ String.valueOf(conf.getSelectIntoInsertTabletPlanRowLimit()))));
- conf.setSelectIntoInsertTabletPlanRowLimit(
- Integer.parseInt(
- properties.getProperty(
- "select_into_insert_tablet_plan_row_limit",
- String.valueOf(conf.getSelectIntoInsertTabletPlanRowLimit()))));
+ conf.setInsertMultiTabletEnableMultithreadingColumnThreshold(
+ Integer.parseInt(
+ properties.getProperty(
+ "insert_multi_tablet_enable_multithreading_column_threshold",
+ String.valueOf(conf.getInsertMultiTabletEnableMultithreadingColumnThreshold()))));
- conf.setInsertMultiTabletEnableMultithreadingColumnThreshold(
- Integer.parseInt(
- properties.getProperty(
- "insert_multi_tablet_enable_multithreading_column_threshold",
- String.valueOf(conf.getInsertMultiTabletEnableMultithreadingColumnThreshold()))));
+ conf.setEncryptDecryptProvider(
+ properties.getProperty(
+ "iotdb_server_encrypt_decrypt_provider", conf.getEncryptDecryptProvider()));
- conf.setEncryptDecryptProvider(
- properties.getProperty(
- "iotdb_server_encrypt_decrypt_provider", conf.getEncryptDecryptProvider()));
+ conf.setEncryptDecryptProviderParameter(
+ properties.getProperty(
+ "iotdb_server_encrypt_decrypt_provider_parameter",
+ conf.getEncryptDecryptProviderParameter()));
- conf.setEncryptDecryptProviderParameter(
- properties.getProperty(
- "iotdb_server_encrypt_decrypt_provider_parameter",
- conf.getEncryptDecryptProviderParameter()));
+ // set OperationSync config
+ conf.setEnableOperationSync(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "enable_operation_sync", String.valueOf(conf.isEnableOperationSync()))));
- // set OperationSync config
- conf.setEnableOperationSync(
- Boolean.parseBoolean(
- properties.getProperty(
- "enable_operation_sync", String.valueOf(conf.isEnableOperationSync()))));
+ conf.setSecondaryAddress(
+ properties.getProperty("secondary_address", conf.getSecondaryAddress()));
- conf.setSecondaryAddress(
- properties.getProperty("secondary_address", conf.getSecondaryAddress()));
+ conf.setSecondaryPort(
+ Integer.parseInt(
+ properties.getProperty("secondary_port", String.valueOf(conf.getSecondaryPort()))));
- conf.setSecondaryPort(
- Integer.parseInt(
- properties.getProperty("secondary_port", String.valueOf(conf.getSecondaryPort()))));
+ conf.setSecondaryUser(properties.getProperty("secondary_user", conf.getSecondaryUser()));
- conf.setSecondaryUser(properties.getProperty("secondary_user", conf.getSecondaryUser()));
+ conf.setSecondaryPassword(
+ properties.getProperty("secondary_password", conf.getSecondaryPassword()));
- conf.setSecondaryPassword(
- properties.getProperty("secondary_password", conf.getSecondaryPassword()));
+ conf.setOperationSyncSessionConcurrencySize(
+ Integer.parseInt(
+ properties.getProperty(
+ "operation_sync_session_concurrency_size",
+ String.valueOf(conf.getOperationSyncSessionConcurrencySize()))));
- conf.setOperationSyncSessionConcurrencySize(
- Integer.parseInt(
- properties.getProperty(
- "operation_sync_session_concurrency_size",
- String.valueOf(conf.getOperationSyncSessionConcurrencySize()))));
+ conf.setOperationSyncLogDir(
+ properties.getProperty("operation_sync_log_dir", conf.getOperationSyncLogDir()));
- conf.setOperationSyncLogDir(
- properties.getProperty("operation_sync_log_dir", conf.getOperationSyncLogDir()));
+ conf.setOperationSyncLogValidity(
+ Integer.parseInt(
+ properties.getProperty(
+ "operation_sync_log_file_validity",
+ String.valueOf(conf.getOperationSyncLogValidity()))));
- conf.setOperationSyncLogValidity(
- Integer.parseInt(
- properties.getProperty(
- "operation_sync_log_file_validity",
- String.valueOf(conf.getOperationSyncLogValidity()))));
+ conf.setOperationSyncLogNum(
+ Integer.parseInt(
+ properties.getProperty(
+ "operation_sync_log_file_num", String.valueOf(conf.getOperationSyncLogNum()))));
- conf.setOperationSyncLogNum(
- Integer.parseInt(
- properties.getProperty(
- "operation_sync_log_file_num", String.valueOf(conf.getOperationSyncLogNum()))));
+ conf.setOperationSyncMaxLogSize(
+ Long.parseLong(
+ properties.getProperty(
+ "operation_sync_max_log_size", String.valueOf(conf.getOperationSyncMaxLogSize()))));
- conf.setOperationSyncMaxLogSize(
- Long.parseLong(
- properties.getProperty(
- "operation_sync_max_log_size",
- String.valueOf(conf.getOperationSyncMaxLogSize()))));
+ conf.setOperationSyncProducerCacheSize(
+ Integer.parseInt(
+ properties.getProperty(
+ "operation_sync_producer_cache_size",
+ String.valueOf(conf.getOperationSyncProducerCacheSize()))));
- conf.setOperationSyncProducerCacheSize(
- Integer.parseInt(
- properties.getProperty(
- "operation_sync_producer_cache_size",
- String.valueOf(conf.getOperationSyncProducerCacheSize()))));
+ conf.setOperationSyncProducerCacheNum(
+ Integer.parseInt(
+ properties.getProperty(
+ "operation_sync_producer_cache_num",
+ String.valueOf(conf.getOperationSyncProducerCacheNum()))));
- conf.setOperationSyncProducerCacheNum(
- Integer.parseInt(
- properties.getProperty(
- "operation_sync_producer_cache_num",
- String.valueOf(conf.getOperationSyncProducerCacheNum()))));
+ conf.setSchemaQueryFetchSize(
+ Integer.parseInt(
+ properties.getProperty(
+ "schema_query_fetch_size", String.valueOf(conf.getSchemaQueryFetchSize()))));
- conf.setSchemaQueryFetchSize(
- Integer.parseInt(
- properties.getProperty(
- "schema_query_fetch_size", String.valueOf(conf.getSchemaQueryFetchSize()))));
+ // At the same time, set TSFileConfig
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setTSFileStorageFs(
+ FSType.valueOf(
+ properties.getProperty("tsfile_storage_fs", conf.getTsFileStorageFs().name())));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setCoreSitePath(properties.getProperty("core_site_path", conf.getCoreSitePath()));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setHdfsSitePath(properties.getProperty("hdfs_site_path", conf.getHdfsSitePath()));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setHdfsIp(properties.getProperty("hdfs_ip", conf.getRawHDFSIp()).split(","));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setHdfsPort(properties.getProperty("hdfs_port", conf.getHdfsPort()));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setDfsNameServices(properties.getProperty("dfs_nameservices", conf.getDfsNameServices()));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setDfsHaNamenodes(
+ properties.getProperty("dfs_ha_namenodes", conf.getRawDfsHaNamenodes()).split(","));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setDfsHaAutomaticFailoverEnabled(
+ Boolean.parseBoolean(
+ properties.getProperty(
+ "dfs_ha_automatic_failover_enabled",
+ String.valueOf(conf.isDfsHaAutomaticFailoverEnabled()))));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setDfsClientFailoverProxyProvider(
+ properties.getProperty(
+ "dfs_client_failover_proxy_provider", conf.getDfsClientFailoverProxyProvider()));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setUseKerberos(
+ Boolean.parseBoolean(
+ properties.getProperty("hdfs_use_kerberos", String.valueOf(conf.isUseKerberos()))));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setKerberosKeytabFilePath(
+ properties.getProperty("kerberos_keytab_file_path", conf.getKerberosKeytabFilePath()));
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .setKerberosPrincipal(
+ properties.getProperty("kerberos_principal", conf.getKerberosPrincipal()));
+ TSFileDescriptor.getInstance().getConfig().setBatchSize(conf.getBatchSize());
- // At the same time, set TSFileConfig
- TSFileDescriptor.getInstance()
- .getConfig()
- .setTSFileStorageFs(
- FSType.valueOf(
- properties.getProperty("tsfile_storage_fs", conf.getTsFileStorageFs().name())));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setCoreSitePath(properties.getProperty("core_site_path", conf.getCoreSitePath()));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setHdfsSitePath(properties.getProperty("hdfs_site_path", conf.getHdfsSitePath()));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setHdfsIp(properties.getProperty("hdfs_ip", conf.getRawHDFSIp()).split(","));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setHdfsPort(properties.getProperty("hdfs_port", conf.getHdfsPort()));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setDfsNameServices(
- properties.getProperty("dfs_nameservices", conf.getDfsNameServices()));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setDfsHaNamenodes(
- properties.getProperty("dfs_ha_namenodes", conf.getRawDfsHaNamenodes()).split(","));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setDfsHaAutomaticFailoverEnabled(
- Boolean.parseBoolean(
- properties.getProperty(
- "dfs_ha_automatic_failover_enabled",
- String.valueOf(conf.isDfsHaAutomaticFailoverEnabled()))));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setDfsClientFailoverProxyProvider(
- properties.getProperty(
- "dfs_client_failover_proxy_provider", conf.getDfsClientFailoverProxyProvider()));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setUseKerberos(
- Boolean.parseBoolean(
- properties.getProperty(
- "hdfs_use_kerberos", String.valueOf(conf.isUseKerberos()))));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setKerberosKeytabFilePath(
- properties.getProperty(
- "kerberos_keytab_file_path", conf.getKerberosKeytabFilePath()));
- TSFileDescriptor.getInstance()
- .getConfig()
- .setKerberosPrincipal(
- properties.getProperty("kerberos_principal", conf.getKerberosPrincipal()));
- TSFileDescriptor.getInstance().getConfig().setBatchSize(conf.getBatchSize());
+ // timed flush memtable, timed close tsfile
+ loadTimedService(properties);
- // timed flush memtable, timed close tsfile
- loadTimedService(properties);
+ // set tsfile-format config
+ loadTsFileProps(properties);
- // set tsfile-format config
- loadTsFileProps(properties);
+ // make RPCTransportFactory taking effect.
+ RpcTransportFactory.reInit();
+
+ // UDF
+ loadUDFProps(properties);
- // make RPCTransportFactory taking effect.
- RpcTransportFactory.reInit();
+ // trigger
+ loadTriggerProps(properties);
- // UDF
- loadUDFProps(properties);
+ // CQ
+ loadCQProps(properties);
- // trigger
- loadTriggerProps(properties);
+ // external lib props
+ loadExternalLibProps(properties);
+ }
- // CQ
- loadCQProps(properties);
+ private void loadExternalLibProps(Properties properties) {
- } catch (FileNotFoundException e) {
- logger.warn("Fail to find config file {}", url, e);
- } catch (IOException 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();
- // update instance in metric
- MetricConfigDescriptor.getInstance()
- .getMetricConfig()
- .updateRpcInstance(conf.getRpcAddress(), conf.getRpcPort());
- }
+ conf.setExternalPropertiesLoaderDir(
+ properties.getProperty(
+ "external_properties_loader_dir", conf.getExternalPropertiesLoaderDir()));
+
+ conf.setExternalLimiterDir(
+ properties.getProperty("external_limiter_dir", conf.getExternalLimiterDir()));
}
// to keep consistent with the cluster module.
diff --git a/server/src/main/java/org/apache/iotdb/db/exception/metadata/SeriesNumberOverflowException.java b/server/src/main/java/org/apache/iotdb/db/exception/metadata/SeriesNumberOverflowException.java
new file mode 100644
index 0000000000..482495eaa2
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/exception/metadata/SeriesNumberOverflowException.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.exception.metadata;
+
+import org.apache.iotdb.rpc.TSStatusCode;
+
+public class SeriesNumberOverflowException extends MetadataException {
+
+ public SeriesNumberOverflowException() {
+ super("exceed max allowed series number.", TSStatusCode.SERIES_OVERFLOW.getStatusCode());
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index b4fcd40d24..5689d599a3 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.exception.metadata.NoTemplateOnMNodeException;
import org.apache.iotdb.db.exception.metadata.PathAlreadyExistException;
import org.apache.iotdb.db.exception.metadata.PathNotExistException;
+import org.apache.iotdb.db.exception.metadata.SeriesNumberOverflowException;
import org.apache.iotdb.db.exception.metadata.StorageGroupAlreadySetException;
import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
import org.apache.iotdb.db.exception.metadata.TemplateIsInUseException;
@@ -104,6 +105,7 @@ import org.apache.iotdb.tsfile.write.schema.TimeseriesSchema;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
+import org.apche.iotdb.external.api.ISeriesNumerLimiter;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.slf4j.Logger;
@@ -120,6 +122,7 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -186,8 +189,8 @@ public class MManager {
private boolean initialized;
private boolean allowToCreateNewSeries = true;
- private AtomicLong totalNormalSeriesNumber = new AtomicLong();
- private AtomicLong totalTemplateSeriesNumber = new AtomicLong();
+ private final AtomicLong totalNormalSeriesNumber = new AtomicLong();
+ private final AtomicLong totalTemplateSeriesNumber = new AtomicLong();
private final int mtreeSnapshotInterval;
private final long mtreeSnapshotThresholdTime;
@@ -205,6 +208,23 @@ public class MManager {
private TagManager tagManager = TagManager.getInstance();
private TemplateManager templateManager = TemplateManager.getInstance();
+ private ISeriesNumerLimiter seriesNumerLimiter =
+ new ISeriesNumerLimiter() {
+ @Override
+ public void init(Properties properties) {}
+
+ @Override
+ public boolean addTimeSeries(int number) {
+ // always return true, don't limit the number of series
+ return true;
+ }
+
+ @Override
+ public void deleteTimeSeries(int number) {
+ // do nothing
+ }
+ };
+
// region MManager Singleton
private static class MManagerHolder {
@@ -215,6 +235,10 @@ public class MManager {
private static final MManager INSTANCE = new MManager();
}
+ public void setSeriesNumerLimiter(ISeriesNumerLimiter seriesNumerLimiter) {
+ this.seriesNumerLimiter = seriesNumerLimiter;
+ }
+
/** we should not use this function in other place, but only in IoTDB class */
public static MManager getInstance() {
return MManagerHolder.INSTANCE;
@@ -580,35 +604,47 @@ public class MManager {
"IoTDB system load is too large to create timeseries, "
+ "please increase MAX_HEAP_SIZE in iotdb-env.sh/bat and restart");
}
- try {
- PartialPath path = plan.getPath();
- SchemaUtils.checkDataTypeWithEncoding(plan.getDataType(), plan.getEncoding());
- ensureStorageGroup(path);
-
- TSDataType type = plan.getDataType();
- // create time series in MTree
- IMeasurementMNode leafMNode =
- mtree.createTimeseries(
- path,
- type,
- plan.getEncoding(),
- plan.getCompressor(),
- plan.getProps(),
- plan.getAlias());
-
- // the cached mNode may be replaced by new entityMNode in mtree
- mNodeCache.invalidate(path.getDevicePath());
-
- // update tag index
-
- if (offset != -1 && isRecovering) {
- // the timeseries has already been created and now system is recovering, using the tag info
- // in tagFile to recover index directly
- tagManager.recoverIndex(offset, leafMNode);
- } else if (plan.getTags() != null) {
- // tag key, tag value
- tagManager.addIndex(plan.getTags(), leafMNode);
+ if (!seriesNumerLimiter.addTimeSeries(1)) {
+ throw new SeriesNumberOverflowException();
+ }
+ try {
+ IMeasurementMNode leafMNode;
+ try {
+ PartialPath path = plan.getPath();
+ SchemaUtils.checkDataTypeWithEncoding(plan.getDataType(), plan.getEncoding());
+
+ ensureStorageGroup(path);
+
+ TSDataType type = plan.getDataType();
+ // create time series in MTree
+ leafMNode =
+ mtree.createTimeseries(
+ path,
+ type,
+ plan.getEncoding(),
+ plan.getCompressor(),
+ plan.getProps(),
+ plan.getAlias());
+
+ // the cached mNode may be replaced by new entityMNode in mtree
+ mNodeCache.invalidate(path.getDevicePath());
+
+ // update tag index
+
+ if (offset != -1 && isRecovering) {
+ // the timeseries has already been created and now system is recovering, using the tag
+ // info
+ // in tagFile to recover index directly
+ tagManager.recoverIndex(offset, leafMNode);
+ } else if (plan.getTags() != null) {
+ // tag key, tag value
+ tagManager.addIndex(plan.getTags(), leafMNode);
+ }
+ } catch (Throwable t) {
+ // roll back
+ seriesNumerLimiter.deleteTimeSeries(1);
+ throw t;
}
// update statistics and schemaDataTypeNumMap
@@ -692,31 +728,43 @@ public class MManager {
"IoTDB system load is too large to create timeseries, "
+ "please increase MAX_HEAP_SIZE in iotdb-env.sh/bat and restart");
}
+ int seriesCount = plan.getMeasurements().size();
+
+ if (!seriesNumerLimiter.addTimeSeries(seriesCount)) {
+ throw new SeriesNumberOverflowException();
+ }
+
try {
PartialPath prefixPath = plan.getPrefixPath();
List<String> measurements = plan.getMeasurements();
List<TSDataType> dataTypes = plan.getDataTypes();
List<TSEncoding> encodings = plan.getEncodings();
- for (int i = 0; i < measurements.size(); i++) {
- SchemaUtils.checkDataTypeWithEncoding(dataTypes.get(i), encodings.get(i));
- }
+ try {
+ for (int i = 0; i < measurements.size(); i++) {
+ SchemaUtils.checkDataTypeWithEncoding(dataTypes.get(i), encodings.get(i));
+ }
- ensureStorageGroup(prefixPath);
+ ensureStorageGroup(prefixPath);
- // create time series in MTree
- mtree.createAlignedTimeseries(
- prefixPath,
- measurements,
- plan.getDataTypes(),
- plan.getEncodings(),
- plan.getCompressors());
+ // create time series in MTree
+ mtree.createAlignedTimeseries(
+ prefixPath,
+ measurements,
+ plan.getDataTypes(),
+ plan.getEncodings(),
+ plan.getCompressors());
- // the cached mNode may be replaced by new entityMNode in mtree
- mNodeCache.invalidate(prefixPath);
+ // the cached mNode may be replaced by new entityMNode in mtree
+ mNodeCache.invalidate(prefixPath);
+ } catch (Throwable t) {
+ // roll back
+ seriesNumerLimiter.deleteTimeSeries(seriesCount);
+ throw t;
+ }
// update statistics and schemaDataTypeNumMap
- totalNormalSeriesNumber.addAndGet(measurements.size());
+ totalNormalSeriesNumber.addAndGet(seriesCount);
if (totalNormalSeriesNumber.get() * ESTIMATED_SERIES_SIZE >= MTREE_SIZE_THRESHOLD) {
logger.warn("Current series number {} is too large...", totalNormalSeriesNumber);
allowToCreateNewSeries = false;
@@ -844,6 +892,7 @@ public class MManager {
node = node.getParent();
}
totalNormalSeriesNumber.addAndGet(-1);
+ seriesNumerLimiter.deleteTimeSeries(1);
if (!allowToCreateNewSeries
&& totalNormalSeriesNumber.get() * ESTIMATED_SERIES_SIZE < MTREE_SIZE_THRESHOLD) {
logger.info("Current series number {} come back to normal level", totalNormalSeriesNumber);
@@ -883,9 +932,11 @@ public class MManager {
public void deleteStorageGroups(List<PartialPath> storageGroups) throws MetadataException {
try {
for (PartialPath storageGroup : storageGroups) {
- totalNormalSeriesNumber.addAndGet(
- -mtree.getAllTimeseriesCount(
- storageGroup.concatNode(MULTI_LEVEL_PATH_WILDCARD), false, false));
+ int timeSeriesCount =
+ mtree.getAllTimeseriesCount(
+ storageGroup.concatNode(MULTI_LEVEL_PATH_WILDCARD), false, false);
+ totalNormalSeriesNumber.addAndGet(-timeSeriesCount);
+ seriesNumerLimiter.deleteTimeSeries(timeSeriesCount);
// clear cached MNode
if (!allowToCreateNewSeries
&& totalNormalSeriesNumber.get() * ESTIMATED_SERIES_SIZE < MTREE_SIZE_THRESHOLD) {
@@ -2476,7 +2527,9 @@ public class MManager {
}
node.setUseTemplate(false);
- totalTemplateSeriesNumber.addAndGet(-node.getUpperTemplate().getMeasurementsCount());
+ int seriesCount = -node.getUpperTemplate().getMeasurementsCount();
+ totalTemplateSeriesNumber.addAndGet(-seriesCount);
+ seriesNumerLimiter.deleteTimeSeries(seriesCount);
// clear caches within MManger
mNodeCache.invalidate(node);
@@ -2502,24 +2555,36 @@ public class MManager {
String.format("Path [%s] has not been set any template.", node.getFullPath()));
}
- // this operation may change mtree structure and node type
- // invoke mnode.setUseTemplate is invalid
+ if (!seriesNumerLimiter.addTimeSeries(template.getMeasurementsCount())) {
+ throw new SeriesNumberOverflowException();
+ }
+
+ IMNode mountedMNode;
+ try {
+ // this operation may change mtree structure and node type
+ // invoke mnode.setUseTemplate is invalid
- // check alignment of template and mounted node
- // if direct measurement exists, node will be replaced
- IMNode mountedMNode = mtree.checkTemplateAlignmentWithMountedNode(node, template);
+ // check alignment of template and mounted node
+ // if direct measurement exists, node will be replaced
+ mountedMNode = mtree.checkTemplateAlignmentWithMountedNode(node, template);
- // if has direct measurement (be a EntityNode), to ensure alignment adapt with former node or
- // template
- if (mountedMNode.isEntity()) {
- mountedMNode
- .getAsEntityMNode()
- .setAligned(
- node.isEntity()
- ? node.getAsEntityMNode().isAligned()
- : node.getUpperTemplate().isDirectAligned());
+ // if has direct measurement (be a EntityNode), to ensure alignment adapt with former node or
+ // template
+ if (mountedMNode.isEntity()) {
+ mountedMNode
+ .getAsEntityMNode()
+ .setAligned(
+ node.isEntity()
+ ? node.getAsEntityMNode().isAligned()
+ : node.getUpperTemplate().isDirectAligned());
+ }
+ mountedMNode.setUseTemplate(true);
+ } catch (Throwable t) {
+ // roll back
+ seriesNumerLimiter.deleteTimeSeries(template.getMeasurementsCount());
+ throw t;
}
- mountedMNode.setUseTemplate(true);
+
totalTemplateSeriesNumber.addAndGet(template.getMeasurementsCount());
if (node != mountedMNode) {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index fcd152f612..66ffc23ac4 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -53,6 +53,8 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
+import static org.apache.iotdb.db.utils.JarLoaderUtil.loadExternLib;
+
public class IoTDB implements IoTDBMBean {
private static final Logger logger = LoggerFactory.getLogger(IoTDB.class);
@@ -78,6 +80,9 @@ public class IoTDB implements IoTDBMBean {
System.exit(1);
}
IoTDB daemon = IoTDB.getInstance();
+
+ loadExternLib(config);
+
daemon.active();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/JarLoaderUtil.java b/server/src/main/java/org/apache/iotdb/db/utils/JarLoaderUtil.java
new file mode 100644
index 0000000000..a2bfd94cc9
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/utils/JarLoaderUtil.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.utils;
+
+import org.apache.iotdb.db.conf.IoTDBConfig;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
+import org.apache.iotdb.db.metadata.MManager;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
+
+import org.apache.commons.io.FileUtils;
+import org.apche.iotdb.external.api.IPropertiesLoader;
+import org.apche.iotdb.external.api.ISeriesNumerLimiter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.UnknownHostException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.ServiceLoader;
+
+public class JarLoaderUtil {
+
+ private static final Logger logger = LoggerFactory.getLogger(JarLoaderUtil.class);
+
+ public static URL[] getExternalJarURLs(String jarDir) throws IOException {
+ HashSet<File> fileSet =
+ new HashSet<>(
+ FileUtils.listFiles(
+ SystemFileFactory.INSTANCE.getFile(jarDir), new String[] {"jar"}, true));
+ return FileUtils.toURLs(fileSet.toArray(new File[0]));
+ }
+
+ public static void loadExternLib(IoTDBConfig config) {
+ // load external properties
+ String loaderDir = config.getExternalPropertiesLoaderDir();
+
+ if (!(new File(loaderDir).exists())) {
+ return;
+ }
+
+ Path externalPropertiesFile = IoTDBDescriptor.getInstance().getExternalPropsPath();
+ URL[] loaderJarURLs;
+ List<Properties> externalPropertiesList = new ArrayList<>();
+ try {
+ loaderJarURLs = getExternalJarURLs(loaderDir);
+
+ if (loaderJarURLs == null || loaderJarURLs.length == 0) {
+ return;
+ }
+
+ ClassLoader classLoader = new URLClassLoader(loaderJarURLs);
+
+ // Use SPI to get all plugins' class
+ ServiceLoader<IPropertiesLoader> loaders =
+ ServiceLoader.load(IPropertiesLoader.class, classLoader);
+
+ for (IPropertiesLoader loader : loaders) {
+ if (loader == null) {
+ logger.error("IPropertiesLoader(), loader is null.");
+ continue;
+ }
+ Properties properties = loader.loadProperties(externalPropertiesFile.toAbsolutePath());
+ if (properties != null) {
+ externalPropertiesList.add(properties);
+ }
+ }
+ } catch (Throwable t) {
+ logger.error("error happened while loading external loader. ", t);
+ // ignore
+ }
+
+ if (externalPropertiesList.size() != 1) {
+ return;
+ }
+
+ // overwrite the default properties;
+ for (Properties properties : externalPropertiesList) {
+ try {
+ IoTDBDescriptor.getInstance().loadProperties(properties);
+ } catch (UnknownHostException e) {
+ // ignore
+ logger.error("error happened while loading external properties. ", e);
+ }
+ TSFileDescriptor.getInstance()
+ .overwriteConfigByCustomSettings(TSFileDescriptor.getInstance().getConfig(), properties);
+ }
+
+ String limiterDir = config.getExternalLimiterDir();
+
+ if (!(new File(loaderDir).exists())) {
+ return;
+ }
+
+ URL[] limiterJarURLs;
+
+ List<ISeriesNumerLimiter> limiterList = new ArrayList<>();
+
+ try {
+ limiterJarURLs = getExternalJarURLs(limiterDir);
+
+ if (limiterJarURLs == null || limiterJarURLs.length == 0) {
+ return;
+ }
+
+ ClassLoader classLoader = new URLClassLoader(limiterJarURLs);
+
+ // Use SPI to get all plugins' class
+ ServiceLoader<ISeriesNumerLimiter> limiters =
+ ServiceLoader.load(ISeriesNumerLimiter.class, classLoader);
+
+ for (ISeriesNumerLimiter limiter : limiters) {
+ if (limiter == null) {
+ logger.error("ISeriesNumerLimiter(), limiter is null.");
+ continue;
+ }
+ for (Properties properties : externalPropertiesList) {
+ limiter.init(properties);
+ }
+ limiterList.add(limiter);
+ }
+ } catch (Throwable t) {
+ // ignore
+ logger.error("error happened while loading external limiter. ", t);
+ }
+
+ if (limiterList.size() != 1) {
+ return;
+ }
+
+ MManager.getInstance().setSeriesNumerLimiter(limiterList.get(0));
+ }
+}
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
index 0de8ca7779..e330d04731 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
@@ -59,6 +59,8 @@ public enum TSStatusCode {
TEMPLATE_IS_IN_USE(326),
TEMPLATE_IMCOMPATIBLE(327),
+ SERIES_OVERFLOW(337),
+
EXECUTE_STATEMENT_ERROR(400),
SQL_PARSE_ERROR(401),
GENERATE_TIME_ZONE_ERROR(402),
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java
index 840e64d756..711c5a4fd2 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java
@@ -61,7 +61,7 @@ public class TSFileDescriptor {
}
}
- private void overwriteConfigByCustomSettings(TSFileConfig conf, Properties properties) {
+ public void overwriteConfigByCustomSettings(TSFileConfig conf, Properties properties) {
PropertiesOverWriter writer = new PropertiesOverWriter(properties);
writer.setInt(conf::setGroupSizeInByte, "group_size_in_byte");