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

Reply via email to