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

jiangtian pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new a64b844702f [To dev/1.3] Fix setting illegal 
default_storage_group_level does not report an error (#14483)
a64b844702f is described below

commit a64b844702fa4f019d989a91614dee23d25a87cc
Author: Jiang Tian <[email protected]>
AuthorDate: Wed Dec 18 18:06:11 2024 +0800

    [To dev/1.3] Fix setting illegal default_storage_group_level does not 
report an error (#14483)
    
    * Fix setting illegal default_storage_group_level does not report an error
    
    (cherry picked from commit 391d153759086ff947e238b196021e71aafbce1b)
    
    * spotless
    
    * allow illegal config during startup
---
 .../it/env/cluster/config/MppCommonConfig.java     |  6 +++
 .../env/cluster/config/MppSharedCommonConfig.java  |  7 ++++
 .../org/apache/iotdb/itbase/env/CommonConfig.java  |  4 ++
 .../iotdb/db/it/IoTDBSetConfigurationIT.java       | 49 ++++++++++++++++++++++
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 14 ++++++-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  | 12 ++++--
 .../exception/sql/StatementAnalyzeException.java   |  4 ++
 .../analyze/cache/partition/PartitionCache.java    |  2 +-
 .../schemaengine/schemaregion/utils/MetaUtils.java |  9 +++-
 .../apache/iotdb/db/metadata/MetaUtilsTest.java    |  9 ++--
 .../conf/iotdb-system.properties.template          |  5 +++
 11 files changed, 110 insertions(+), 11 deletions(-)

diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
index 4edf6dd9420..edabfddd7bf 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
@@ -490,6 +490,12 @@ public class MppCommonConfig extends MppBaseConfig 
implements CommonConfig {
     return this;
   }
 
+  @Override
+  public CommonConfig setDefaultStorageGroupLevel(int 
defaultStorageGroupLevel) {
+    setProperty("default_storage_group_level", 
String.valueOf(defaultStorageGroupLevel));
+    return this;
+  }
+
   // For part of the log directory
   public String getClusterConfigStr() {
     return 
fromConsensusFullNameToAbbr(properties.getProperty(CONFIG_NODE_CONSENSUS_PROTOCOL_CLASS))
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
index 700ca3821c3..c167cad215f 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
@@ -498,4 +498,11 @@ public class MppSharedCommonConfig implements CommonConfig 
{
     cnConfig.setQueryMemoryProportion(queryMemoryProportion);
     return this;
   }
+
+  @Override
+  public CommonConfig setDefaultStorageGroupLevel(int 
defaultStorageGroupLevel) {
+    dnConfig.setDefaultStorageGroupLevel(defaultStorageGroupLevel);
+    cnConfig.setDefaultStorageGroupLevel(defaultStorageGroupLevel);
+    return this;
+  }
 }
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java 
b/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java
index 38f5a9d8030..1ad4668b53c 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java
@@ -155,4 +155,8 @@ public interface CommonConfig {
       int pipeConnectorRequestSliceThresholdBytes);
 
   CommonConfig setQueryMemoryProportion(String queryMemoryProportion);
+
+  default CommonConfig setDefaultStorageGroupLevel(int 
defaultStorageGroupLevel) {
+    return this;
+  }
 }
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 da6db7a12a8..fa8a450d675 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
@@ -39,11 +39,16 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.sql.Connection;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Arrays;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class})
 public class IoTDBSetConfigurationIT {
@@ -202,4 +207,48 @@ public class IoTDBSetConfigurationIT {
             + CommonConfig.SYSTEM_CONFIG_NAME;
     return new File(systemPropertiesPath);
   }
+
+  @Test
+  public void testSetDefaultSGLevel() throws SQLException {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      // legal value
+      statement.execute("set configuration 
\"default_storage_group_level\"=\"3\"");
+      statement.execute("INSERT INTO root.a.b.c.d1(timestamp, s1) VALUES (1, 
1)");
+      ResultSet databases = statement.executeQuery("show databases");
+      databases.next();
+      Assert.assertEquals("root.a.b.c", databases.getString(1));
+      assertFalse(databases.next());
+
+      // path too short
+      try {
+        statement.execute("INSERT INTO root.fail(timestamp, s1) VALUES (1, 
1)");
+      } catch (SQLException e) {
+        assertEquals(
+            "509: root.fail is not a legal path, because it is no longer than 
default sg level: 3",
+            e.getMessage());
+      }
+
+      // illegal value
+      try {
+        statement.execute("set configuration 
\"default_storage_group_level\"=\"-1\"");
+      } catch (SQLException e) {
+        assertTrue(e.getMessage().contains("Illegal defaultStorageGroupLevel: 
-1, should >= 1"));
+      }
+    }
+
+    // can start with an illegal value
+    EnvFactory.getEnv().cleanClusterEnvironment();
+    
EnvFactory.getEnv().getConfig().getCommonConfig().setDefaultStorageGroupLevel(-1);
+    EnvFactory.getEnv().initClusterEnvironment();
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute("INSERT INTO root.a.b.c.d1(timestamp, s1) VALUES (1, 
1)");
+      ResultSet databases = statement.executeQuery("show databases");
+      databases.next();
+      // the default value should take effect
+      Assert.assertEquals("root.a", databases.getString(1));
+      assertFalse(databases.next());
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 577bfa25e12..f1d0cc13bc6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -2433,7 +2433,19 @@ public class IoTDBConfig {
     return defaultStorageGroupLevel;
   }
 
-  void setDefaultStorageGroupLevel(int defaultStorageGroupLevel) {
+  void setDefaultStorageGroupLevel(int defaultStorageGroupLevel, boolean 
startUp) {
+    if (defaultStorageGroupLevel < 1) {
+      if (startUp) {
+        logger.warn(
+            "Illegal defaultStorageGroupLevel: {}, should >= 1, use default 
value 1",
+            defaultStorageGroupLevel);
+        defaultStorageGroupLevel = 1;
+      } else {
+        throw new IllegalArgumentException(
+            String.format(
+                "Illegal defaultStorageGroupLevel: %d, should >= 1", 
defaultStorageGroupLevel));
+      }
+    }
     this.defaultStorageGroupLevel = defaultStorageGroupLevel;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index fefc0614b2d..e7b7139ce51 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -806,7 +806,8 @@ public class IoTDBDescriptor {
 
     conf.setRpcMaxConcurrentClientNum(maxConcurrentClientNum);
 
-    loadAutoCreateSchemaProps(properties);
+    boolean startUp = true;
+    loadAutoCreateSchemaProps(properties, startUp);
 
     conf.setTsFileStorageFs(
         properties.getProperty("tsfile_storage_fs", 
conf.getTsFileStorageFs().toString()));
@@ -1627,7 +1628,8 @@ public class IoTDBDescriptor {
     return Math.max(Math.min(newThrottleThreshold, MAX_THROTTLE_THRESHOLD), 
MIN_THROTTLE_THRESHOLD);
   }
 
-  private void loadAutoCreateSchemaProps(Properties properties) throws 
IOException {
+  private void loadAutoCreateSchemaProps(Properties properties, boolean 
startUp)
+      throws IOException {
     conf.setAutoCreateSchemaEnabled(
         Boolean.parseBoolean(
             properties.getProperty(
@@ -1659,7 +1661,8 @@ public class IoTDBDescriptor {
             properties.getProperty(
                 "default_storage_group_level",
                 ConfigurationFileUtils.getConfigurationDefaultValue(
-                    "default_storage_group_level"))));
+                    "default_storage_group_level"))),
+        startUp);
     conf.setDefaultBooleanEncoding(
         properties.getProperty(
             "default_boolean_encoding",
@@ -1899,7 +1902,8 @@ public class IoTDBDescriptor {
       loadTimedService(properties);
       StorageEngine.getInstance().rebootTimedService();
       // update params of creating schema automatically
-      loadAutoCreateSchemaProps(properties);
+      boolean startUp = false;
+      loadAutoCreateSchemaProps(properties, startUp);
 
       // update tsfile-format config
       loadTsFileProps(properties);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/StatementAnalyzeException.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/StatementAnalyzeException.java
index 3ca1e397c37..219d73b1b7c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/StatementAnalyzeException.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/StatementAnalyzeException.java
@@ -28,4 +28,8 @@ public class StatementAnalyzeException extends 
RuntimeException {
   public StatementAnalyzeException(Exception cause) {
     super(cause);
   }
+
+  public StatementAnalyzeException(String message, Throwable cause) {
+    super(message, cause);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java
index 56934931b8c..91785849e76 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java
@@ -384,7 +384,7 @@ public class PartitionCache {
         }
       } catch (TException | MetadataException | ClientManagerException e) {
         throw new StatementAnalyzeException(
-            "An error occurred when executing getDeviceToStorageGroup():" + 
e.getMessage());
+            "An error occurred when executing getDeviceToDatabase():" + 
e.getMessage(), e);
       }
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MetaUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MetaUtils.java
index 67fbb6550d7..108b5f14d9d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MetaUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MetaUtils.java
@@ -61,8 +61,13 @@ public class MetaUtils {
   public static PartialPath getStorageGroupPathByLevel(PartialPath path, int 
level)
       throws MetadataException {
     String[] nodeNames = path.getNodes();
-    if (nodeNames.length <= level || 
!nodeNames[0].equals(IoTDBConstant.PATH_ROOT)) {
-      throw new IllegalPathException(path.getFullPath());
+    if (nodeNames.length <= level) {
+      throw new IllegalPathException(
+          path.getFullPath(), "it is no longer than default sg level: " + 
level);
+    }
+    if (!nodeNames[0].equals(IoTDBConstant.PATH_ROOT)) {
+      throw new IllegalPathException(
+          path.getFullPath(), "it does not start with " + 
IoTDBConstant.PATH_ROOT);
     }
     String[] storageGroupNodes = new String[level + 1];
     System.arraycopy(nodeNames, 0, storageGroupNodes, 0, level + 1);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java
index 986fdf95846..6d5b736aa74 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java
@@ -45,7 +45,6 @@ public class MetaUtilsTest {
 
   private final IMNodeFactory<IMemMNode> nodeFactory =
       MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();
-  ;
 
   @Test
   public void testGetMultiFullPaths() {
@@ -128,7 +127,9 @@ public class MetaUtilsTest {
       MetaUtils.getStorageGroupPathByLevel(new 
PartialPath("root1.laptop.d1.s1"), level);
     } catch (MetadataException e) {
       caughtException = true;
-      assertEquals("root1.laptop.d1.s1 is not a legal path", e.getMessage());
+      assertEquals(
+          "root1.laptop.d1.s1 is not a legal path, because it does not start 
with root",
+          e.getMessage());
     }
     assertTrue(caughtException);
 
@@ -137,7 +138,9 @@ public class MetaUtilsTest {
       MetaUtils.getStorageGroupPathByLevel(new PartialPath("root"), level);
     } catch (MetadataException e) {
       caughtException = true;
-      assertEquals("root is not a legal path", e.getMessage());
+      assertEquals(
+          "root is not a legal path, because it is no longer than default sg 
level: 1",
+          e.getMessage());
     }
     assertTrue(caughtException);
   }
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
index d6ca096864f..b190633c371 100644
--- 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
+++ 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
@@ -850,8 +850,13 @@ enable_auto_create_schema=true
 # Database level when creating schema automatically is enabled
 # e.g. root.sg0.d1.s2
 #      we will set root.sg0 as the database if database level is 1
+# If the incoming path is shorter than this value, the creation/insertion will 
fail.
 # effectiveMode: hot_reload
 # Datatype: int
+# Range: [1, Integer.MAX_VALUE]
+# Default: 1
+# When illegal: report an error and change nothing during hot-reload; use the 
default value in
+# start-up
 default_storage_group_level=1
 
 # ALL data types: BOOLEAN, INT32, INT64, FLOAT, DOUBLE, TEXT

Reply via email to