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

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new ebd2a4b707 [fix](dynamic partition) fix create hot partition failed 
without error response (#20996)
ebd2a4b707 is described below

commit ebd2a4b7076e32ad970dafc363cfcf165156d3d6
Author: yujun <[email protected]>
AuthorDate: Tue Jul 18 10:56:37 2023 +0800

    [fix](dynamic partition) fix create hot partition failed without error 
response (#20996)
---
 .../doris/common/util/DynamicPartitionUtil.java    | 40 ++++++++++++++------
 .../doris/catalog/DynamicPartitionTableTest.java   | 44 +++++++++++++++++++++-
 .../test_outer_join_with_window_function.groovy    |  1 -
 ...t_outer_join_with_window_function_datev2.groovy |  1 -
 .../test_dynamic_partition.groovy                  | 22 +++++++++++
 5 files changed, 93 insertions(+), 15 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
index 552ff2decb..7d0e5833fb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
@@ -231,11 +231,24 @@ public class DynamicPartitionUtil {
         
Env.getCurrentSystemInfo().selectBackendIdsForReplicaCreation(replicaAlloc, 
null);
     }
 
-    private static void checkReplicaAllocation(ReplicaAllocation replicaAlloc, 
Database db) throws DdlException {
+    private static void checkReplicaAllocation(ReplicaAllocation replicaAlloc, 
int hotPartitionNum,
+            Database db) throws DdlException {
         if (replicaAlloc.getTotalReplicaNum() <= 0) {
             
ErrorReport.reportDdlException(ErrorCode.ERROR_DYNAMIC_PARTITION_REPLICATION_NUM_ZERO);
         }
+
         
Env.getCurrentSystemInfo().selectBackendIdsForReplicaCreation(replicaAlloc, 
null);
+        if (hotPartitionNum <= 0) {
+            return;
+        }
+
+        try {
+            
Env.getCurrentSystemInfo().selectBackendIdsForReplicaCreation(replicaAlloc, 
TStorageMedium.SSD);
+        } catch (DdlException e) {
+            throw new DdlException("Failed to find enough backend for ssd 
storage medium. When setting "
+                    + DynamicPartitionProperty.HOT_PARTITION_NUM + " > 0, the 
hot partitions will store "
+                    + "in ssd. Please check the replication num,replication 
tag and storage medium.");
+        }
     }
 
     private static void checkHotPartitionNum(String val) throws DdlException {
@@ -600,28 +613,33 @@ public class DynamicPartitionUtil {
             analyzedProperties.put(DynamicPartitionProperty.TIME_ZONE, val);
         }
 
+        int hotPartitionNum = 0;
+        if 
(properties.containsKey(DynamicPartitionProperty.HOT_PARTITION_NUM)) {
+            String val = 
properties.get(DynamicPartitionProperty.HOT_PARTITION_NUM);
+            checkHotPartitionNum(val);
+            hotPartitionNum = Integer.parseInt(val);
+            properties.remove(DynamicPartitionProperty.HOT_PARTITION_NUM);
+            analyzedProperties.put(DynamicPartitionProperty.HOT_PARTITION_NUM, 
val);
+        }
+
         // check replication_allocation first, then replciation_num
+        ReplicaAllocation replicaAlloc = null;
         if 
(properties.containsKey(DynamicPartitionProperty.REPLICATION_ALLOCATION)) {
-            ReplicaAllocation replicaAlloc = 
PropertyAnalyzer.analyzeReplicaAllocation(properties, "dynamic_partition");
-            checkReplicaAllocation(replicaAlloc, db);
+            replicaAlloc = 
PropertyAnalyzer.analyzeReplicaAllocation(properties, "dynamic_partition");
             properties.remove(DynamicPartitionProperty.REPLICATION_ALLOCATION);
             
analyzedProperties.put(DynamicPartitionProperty.REPLICATION_ALLOCATION, 
replicaAlloc.toCreateStmt());
         } else if 
(properties.containsKey(DynamicPartitionProperty.REPLICATION_NUM)) {
             String val = 
properties.get(DynamicPartitionProperty.REPLICATION_NUM);
             checkReplicationNum(val, db);
             properties.remove(DynamicPartitionProperty.REPLICATION_NUM);
+            replicaAlloc = new ReplicaAllocation(Short.valueOf(val));
             
analyzedProperties.put(DynamicPartitionProperty.REPLICATION_ALLOCATION,
-                    new ReplicaAllocation(Short.valueOf(val)).toCreateStmt());
+                    replicaAlloc.toCreateStmt());
         } else {
-            checkReplicaAllocation(olapTable.getDefaultReplicaAllocation(), 
db);
+            replicaAlloc = olapTable.getDefaultReplicaAllocation();
         }
+        checkReplicaAllocation(replicaAlloc, hotPartitionNum, db);
 
-        if 
(properties.containsKey(DynamicPartitionProperty.HOT_PARTITION_NUM)) {
-            String val = 
properties.get(DynamicPartitionProperty.HOT_PARTITION_NUM);
-            checkHotPartitionNum(val);
-            properties.remove(DynamicPartitionProperty.HOT_PARTITION_NUM);
-            analyzedProperties.put(DynamicPartitionProperty.HOT_PARTITION_NUM, 
val);
-        }
         if 
(properties.containsKey(DynamicPartitionProperty.RESERVED_HISTORY_PERIODS)) {
             String reservedHistoryPeriods = 
properties.get(DynamicPartitionProperty.RESERVED_HISTORY_PERIODS);
             checkReservedHistoryPeriodValidate(reservedHistoryPeriods,
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
index 3609e56592..22c19fb159 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
@@ -28,6 +28,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ExceptionChecker;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.system.Backend;
 import org.apache.doris.thrift.TStorageMedium;
 import org.apache.doris.utframe.UtFrameUtils;
 
@@ -82,6 +83,15 @@ public class DynamicPartitionTableTest {
         UtFrameUtils.cleanDorisFeDir(runningDir);
     }
 
+    private static void changeBeDisk(TStorageMedium storageMedium) {
+        List<Backend> backends = Env.getCurrentSystemInfo().getAllBackends();
+        for (Backend be : backends) {
+            for (DiskInfo diskInfo : be.getDisks().values()) {
+                diskInfo.setStorageMedium(storageMedium);
+            }
+        }
+    }
+
     private static void createTable(String sql) throws Exception {
         CreateTableStmt createTableStmt = (CreateTableStmt) 
UtFrameUtils.parseAndAnalyzeStmt(sql, connectContext);
         Env.getCurrentEnv().createTable(createTableStmt);
@@ -970,6 +980,8 @@ public class DynamicPartitionTableTest {
 
     @Test
     public void testHotPartitionNum() throws Exception {
+        changeBeDisk(TStorageMedium.SSD);
+
         Database testDb =
                 
Env.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:test");
         // 1. hour
@@ -1188,9 +1200,11 @@ public class DynamicPartitionTableTest {
     }
 
     @Test(expected = DdlException.class)
-    public void testHotPartitionNumAbnormal() throws Exception {
+    public void testHotPartitionNumAbnormalLT0() throws Exception {
+        changeBeDisk(TStorageMedium.SSD);
+
         // dynamic_partition.hot_partition_num must larger than 0.
-        String createOlapTblStmt = "CREATE TABLE 
test.`hot_partition_hour_tbl1` (\n"
+        String createOlapTblStmt = "CREATE TABLE 
test.`hot_partition_hour_tbl1_lt0` (\n"
                 + "  `k1` datetime NULL COMMENT \"\",\n"
                 + "  `k2` int NULL COMMENT \"\"\n"
                 + ") ENGINE=OLAP\n"
@@ -1211,6 +1225,32 @@ public class DynamicPartitionTableTest {
         createTable(createOlapTblStmt);
     }
 
+    @Test(expected = DdlException.class)
+    public void testHotPartitionNumAbnormalMissSSD() throws Exception {
+        changeBeDisk(TStorageMedium.HDD);
+
+        // when dynamic_partition.hot_partition_num > 0, it require ssd 
storage medium.
+        String createOlapTblStmt = "CREATE TABLE 
test.`hot_partition_hour_tbl1_miss_ssd` (\n"
+                + "  `k1` datetime NULL COMMENT \"\",\n"
+                + "  `k2` int NULL COMMENT \"\"\n"
+                + ") ENGINE=OLAP\n"
+                + "PARTITION BY RANGE(`k1`)\n"
+                + "()\n"
+                + "DISTRIBUTED BY HASH(`k2`) BUCKETS 3\n"
+                + "PROPERTIES (\n"
+                + "\"replication_num\" = \"1\",\n"
+                + "\"dynamic_partition.enable\" = \"true\",\n"
+                + "\"dynamic_partition.start\" = \"-3\",\n"
+                + "\"dynamic_partition.end\" = \"3\",\n"
+                + "\"dynamic_partition.create_history_partition\" = 
\"true\",\n"
+                + "\"dynamic_partition.time_unit\" = \"hour\",\n"
+                + "\"dynamic_partition.prefix\" = \"p\",\n"
+                + "\"dynamic_partition.buckets\" = \"1\",\n"
+                + "\"dynamic_partition.hot_partition_num\" = \"1\"\n"
+                + ");";
+        createTable(createOlapTblStmt);
+    }
+
     @Test
     public void testRuntimeInfo() throws Exception {
         DynamicPartitionScheduler scheduler = new 
DynamicPartitionScheduler("test", 10);
diff --git 
a/regression-test/suites/correctness_p0/test_outer_join_with_window_function.groovy
 
b/regression-test/suites/correctness_p0/test_outer_join_with_window_function.groovy
index dfbea21562..3c195713ae 100644
--- 
a/regression-test/suites/correctness_p0/test_outer_join_with_window_function.groovy
+++ 
b/regression-test/suites/correctness_p0/test_outer_join_with_window_function.groovy
@@ -218,7 +218,6 @@ suite("test_outer_join_with_with_window_function") {
         "dynamic_partition.buckets" = "4",
         "dynamic_partition.create_history_partition" = "true",
         "dynamic_partition.history_partition_num" = "50",
-        "dynamic_partition.hot_partition_num" = "2",
         "dynamic_partition.reserved_history_periods" = "NULL",
         "dynamic_partition.start_day_of_month" = "1",
         "in_memory" = "false",
diff --git 
a/regression-test/suites/correctness_p0/test_outer_join_with_window_function_datev2.groovy
 
b/regression-test/suites/correctness_p0/test_outer_join_with_window_function_datev2.groovy
index 169e92c8ba..16abf0fb8a 100644
--- 
a/regression-test/suites/correctness_p0/test_outer_join_with_window_function_datev2.groovy
+++ 
b/regression-test/suites/correctness_p0/test_outer_join_with_window_function_datev2.groovy
@@ -222,7 +222,6 @@ suite("test_outer_join_with_window_function_datev2") {
         "dynamic_partition.buckets" = "4",
         "dynamic_partition.create_history_partition" = "true",
         "dynamic_partition.history_partition_num" = "50",
-        "dynamic_partition.hot_partition_num" = "2",
         "dynamic_partition.reserved_history_periods" = "NULL",
         "dynamic_partition.start_day_of_month" = "1",
         "in_memory" = "false",
diff --git 
a/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition.groovy
 
b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition.groovy
index 1a69dda4c7..f4680ff681 100644
--- 
a/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition.groovy
+++ 
b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition.groovy
@@ -149,4 +149,26 @@ suite("test_dynamic_partition") {
         exception "errCode = 2,"
     }
     sql "drop table if exists dy_par_bad"
+    test {
+        sql """
+        CREATE TABLE IF NOT EXISTS dy_par_bad
+        ( k1 date NOT NULL, k2 varchar(20) NOT NULL, k3 int sum NOT NULL )
+        AGGREGATE KEY(k1,k2)
+        PARTITION BY RANGE(k1) ( )
+        DISTRIBUTED BY HASH(k1) BUCKETS 3
+        PROPERTIES (
+            "dynamic_partition.enable"="true",
+            "dynamic_partition.end"="3",
+            "dynamic_partition.start"="-3",
+            "dynamic_partition.prefix"="p",
+            "dynamic_partition.time_unit"="DAY",
+            "dynamic_partition.create_history_partition"="true",
+            "dynamic_partition.hot_partition_num" = "2",
+            "dynamic_partition.replication_allocation" = 
"tag.location.default: 1")
+        """
+        // check exception message contains
+        // dynamic_partition.hot_partition_num > 0 will require ssd storage 
medium
+        exception "errCode = 2,"
+    }
+    sql "drop table if exists dy_par_bad"
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to