This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 50241423ef8 Apply new configurations in memory before update file
(#14500)
50241423ef8 is described below
commit 50241423ef89f1bd65a0e8b3ac31b13a3650ca0b
Author: shuwenwei <[email protected]>
AuthorDate: Fri Dec 20 14:52:52 2024 +0800
Apply new configurations in memory before update file (#14500)
* apply new configurations in memory before update file
* fix spell
---
.../iotdb/db/it/IoTDBSetConfigurationIT.java | 8 +++++++
.../iotdb/confignode/manager/ConfigManager.java | 8 +++++--
.../iotdb/db/storageengine/StorageEngine.java | 27 +++++++++++-----------
.../iotdb/commons/conf/ConfigurationFileUtils.java | 22 +++++++++++++++++-
4 files changed, 49 insertions(+), 16 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSetConfigurationIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSetConfigurationIT.java
index 758cc83a4c2..4df8f79af15 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSetConfigurationIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSetConfigurationIT.java
@@ -175,6 +175,14 @@ public class IoTDBSetConfigurationIT {
} catch (SQLException e) {
assertTrue(e.getMessage().contains("Illegal defaultStorageGroupLevel:
-1, should >= 1"));
}
+
+ // Failed updates will not change the files.
+ assertFalse(
+ checkConfigFileContains(
+ EnvFactory.getEnv().getDataNodeWrapper(0),
"default_storage_group_level=-1"));
+ assertTrue(
+ checkConfigFileContains(
+ EnvFactory.getEnv().getDataNodeWrapper(0),
"default_storage_group_level=3"));
}
// can start with an illegal value
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 35f5559231f..5596a0c12d7 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -1681,7 +1681,12 @@ public class ConfigManager implements IManager {
if (configurationFileFound) {
File file = new File(url.getFile());
try {
- ConfigurationFileUtils.updateConfigurationFile(file, properties);
+ ConfigurationFileUtils.updateConfiguration(
+ file,
+ properties,
+ mergedProps -> {
+
ConfigNodeDescriptor.getInstance().loadHotModifiedProps(mergedProps);
+ });
} catch (Exception e) {
tsStatus = RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR,
e.getMessage());
}
@@ -1691,7 +1696,6 @@ public class ConfigManager implements IManager {
tsStatus = RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR,
msg);
LOGGER.warn(msg);
}
- ConfigNodeDescriptor.getInstance().loadHotModifiedProps(properties);
if (currentNodeId == req.getNodeId()) {
return tsStatus;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
index 6284c70a5c3..21bdf6578d6 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
@@ -656,8 +656,8 @@ public class StorageEngine implements IService {
if (newConfigItems.isEmpty()) {
return tsStatus;
}
- TrimProperties properties = new TrimProperties();
- properties.putAll(newConfigItems);
+ TrimProperties newConfigProperties = new TrimProperties();
+ newConfigProperties.putAll(newConfigItems);
URL configFileUrl =
IoTDBDescriptor.getPropsUrl(CommonConfig.SYSTEM_CONFIG_NAME);
if (configFileUrl == null || !(new
File(configFileUrl.getFile()).exists())) {
@@ -667,30 +667,31 @@ public class StorageEngine implements IService {
tsStatus = RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, msg);
LOGGER.warn(msg);
try {
- IoTDBDescriptor.getInstance().loadHotModifiedProps(properties);
- IoTDBDescriptor.getInstance().reloadMetricProperties(properties);
+
IoTDBDescriptor.getInstance().loadHotModifiedProps(newConfigProperties);
+
IoTDBDescriptor.getInstance().reloadMetricProperties(newConfigProperties);
} catch (Exception e) {
return RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR,
e.getMessage());
}
return tsStatus;
}
- // 1. append new configuration properties to configuration file
try {
- ConfigurationFileUtils.updateConfigurationFile(new
File(configFileUrl.getFile()), properties);
+ ConfigurationFileUtils.updateConfiguration(
+ new File(configFileUrl.getFile()),
+ newConfigProperties,
+ mergedProperties -> {
+ try {
+
IoTDBDescriptor.getInstance().loadHotModifiedProps(mergedProperties);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+ });
} catch (Exception e) {
if (e instanceof InterruptedException) {
Thread.currentThread().interrupt();
}
return RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR,
e.getMessage());
}
-
- // 2. load hot modified properties
- try {
- IoTDBDescriptor.getInstance().loadHotModifiedProps();
- } catch (Exception e) {
- return RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR,
e.getMessage());
- }
return tsStatus;
}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
index 0857b493b9a..f5702143dd9 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
@@ -31,6 +31,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
+import java.io.StringReader;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
@@ -247,19 +248,32 @@ public class ConfigurationFileUtils {
return ignoredConfigItems;
}
- public static void updateConfigurationFile(File file, Properties
newConfigItems)
+ public static void updateConfiguration(
+ File file, Properties newConfigItems, LoadHotModifiedPropsFunc
loadHotModifiedPropertiesFunc)
throws IOException, InterruptedException {
File lockFile = new File(file.getPath() + lockFileSuffix);
acquireTargetFileLock(lockFile);
try {
// read configuration file
List<String> lines = new ArrayList<>();
+ TrimProperties mergedProps = new TrimProperties();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line = null;
while ((line = reader.readLine()) != null) {
lines.add(line);
+ mergedProps.load(new StringReader(line));
}
}
+ // overwrite old configuration with new value
+ for (String key : newConfigItems.stringPropertyNames()) {
+ mergedProps.put(key, newConfigItems.getProperty(key));
+ }
+
+ // load hot modified properties
+ if (loadHotModifiedPropertiesFunc != null) {
+ loadHotModifiedPropertiesFunc.loadHotModifiedProperties(mergedProps);
+ }
+
// generate new configuration file content in memory
StringBuilder contentsOfNewConfigurationFile = new StringBuilder();
for (String currentLine : lines) {
@@ -341,4 +355,10 @@ public class ConfigurationFileUtils {
private static void releaseFileLock(File file) throws IOException {
Files.deleteIfExists(file.toPath());
}
+
+ @FunctionalInterface
+ public interface LoadHotModifiedPropsFunc {
+ void loadHotModifiedProperties(TrimProperties properties)
+ throws IOException, InterruptedException;
+ }
}