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

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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 9b500faa0c1 [fix](create table) create table fail not write drop table 
editlog #37488 (#37506)
9b500faa0c1 is described below

commit 9b500faa0c1b211256c1a39b3620f41231075a77
Author: yujun <yu.jun.re...@gmail.com>
AuthorDate: Tue Jul 9 13:44:43 2024 +0800

    [fix](create table) create table fail not write drop table editlog #37488 
(#37506)
    
    cherry pick from #37488
---
 .../apache/doris/datasource/InternalCatalog.java   | 29 ++++++++++-----
 .../test_create_table_exception.groovy             | 43 +++++++++++++++-------
 2 files changed, 49 insertions(+), 23 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index 06b9c33eea9..19672e0ccc4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -973,13 +973,13 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         return true;
     }
 
-    public void dropTable(Database db, long tableId, boolean isForceDrop,
+    private void dropTable(Database db, long tableId, boolean isForceDrop, 
boolean isReplay,
                           Long recycleTime) throws MetaNotFoundException {
         Table table = db.getTableOrMetaException(tableId);
         db.writeLock();
         table.writeLock();
         try {
-            unprotectDropTable(db, table, isForceDrop, true, recycleTime);
+            unprotectDropTable(db, table, isForceDrop, isReplay, recycleTime);
             
Env.getCurrentEnv().getQueryStats().clear(Env.getCurrentInternalCatalog().getId(),
 db.getId(), tableId);
             
Env.getCurrentEnv().getAnalysisManager().removeTableStats(table.getId());
         } finally {
@@ -990,7 +990,7 @@ public class InternalCatalog implements CatalogIf<Database> 
{
 
     public void replayDropTable(Database db, long tableId, boolean isForceDrop,
             Long recycleTime) throws MetaNotFoundException {
-        dropTable(db, tableId, isForceDrop, recycleTime);
+        dropTable(db, tableId, isForceDrop, true, recycleTime);
     }
 
     public void replayEraseTable(long tableId) {
@@ -2639,6 +2639,7 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         // if failed in any step, use this set to do clear things
         Set<Long> tabletIdSet = new HashSet<>();
         // create partition
+        boolean hadLogEditCreateTable = false;
         try {
             if (partitionInfo.getType() == PartitionType.UNPARTITIONED) {
                 if (storagePolicy.equals("") && properties != null && 
!properties.isEmpty()) {
@@ -2762,11 +2763,6 @@ public class InternalCatalog implements 
CatalogIf<Database> {
             if (!result.first) {
                 
ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, tableName);
             }
-            if (DebugPointUtil.isEnable("FE.createOlapTable.exception")) {
-                LOG.info("debug point FE.createOlapTable.exception, throw e");
-                // not commit, not log edit
-                throw new DdlException("debug point 
FE.createOlapTable.exception");
-            }
 
             if (result.second) {
                 if (Env.getCurrentColocateIndex().isColocateTable(tableId)) {
@@ -2779,6 +2775,9 @@ public class InternalCatalog implements 
CatalogIf<Database> {
                 }
                 LOG.info("duplicate create table[{};{}], skip next steps", 
tableName, tableId);
             } else {
+                // if table not exists, then db.createTableWithLock will write 
an editlog.
+                hadLogEditCreateTable = true;
+
                 // we have added these index to memory, only need to persist 
here
                 if (Env.getCurrentColocateIndex().isColocateTable(tableId)) {
                     GroupId groupId = 
Env.getCurrentColocateIndex().getGroup(tableId);
@@ -2797,17 +2796,27 @@ public class InternalCatalog implements 
CatalogIf<Database> {
                         .createOrUpdateRuntimeInfo(tableId, 
DynamicPartitionScheduler.LAST_UPDATE_TIME,
                                 TimeUtils.getCurrentFormatTime());
             }
+
+            if (DebugPointUtil.isEnable("FE.createOlapTable.exception")) {
+                LOG.info("debug point FE.createOlapTable.exception, throw e");
+                throw new DdlException("debug point 
FE.createOlapTable.exception");
+            }
         } catch (DdlException e) {
             LOG.warn("create table failed {} - {}", tabletIdSet, 
e.getMessage());
             for (Long tabletId : tabletIdSet) {
                 Env.getCurrentInvertedIndex().deleteTablet(tabletId);
             }
-            // only remove from memory, because we have not persist it
+            // edit log write DropTableInfo will result in deleting colocate 
group,
+            // but follow fe may need wait 30s (recycle bin mgr run every 30s).
             if (Env.getCurrentColocateIndex().isColocateTable(tableId)) {
                 Env.getCurrentColocateIndex().removeTable(tableId);
             }
             try {
-                dropTable(db, tableId, true, 0L);
+                dropTable(db, tableId, true, false, 0L);
+                if (hadLogEditCreateTable) {
+                    DropInfo info = new DropInfo(db.getId(), tableId, 
olapTable.getName(), -1L, true, 0L);
+                    Env.getCurrentEnv().getEditLog().logDropTable(info);
+                }
             } catch (Exception ex) {
                 LOG.warn("drop table", ex);
             }
diff --git 
a/regression-test/suites/partition_p0/test_create_table_exception.groovy 
b/regression-test/suites/partition_p0/test_create_table_exception.groovy
index 49cadcd3af4..96f097c7670 100644
--- a/regression-test/suites/partition_p0/test_create_table_exception.groovy
+++ b/regression-test/suites/partition_p0/test_create_table_exception.groovy
@@ -31,9 +31,9 @@ suite("test_create_table_exception") {
         def table3 = "dynamic_partition_table"
         try {
             
GetDebugPoint().enableDebugPointForAllFEs('FE.createOlapTable.exception', null)
-            def createTable = { ->
+            def createTable = { tableIdx ->
                 try_sql """
-                    CREATE TABLE $table1 (
+                    CREATE TABLE ${table1}_${tableIdx} (
                         `k1` int(11) NULL,
                         `k2` int(11) NULL
                     )
@@ -41,12 +41,13 @@ suite("test_create_table_exception") {
                     COMMENT 'OLAP'
                     DISTRIBUTED BY HASH(`k1`) BUCKETS 10
                     PROPERTIES (
+                    "colocate_with" = "col_grp_${tableIdx}",
                     "replication_num"="3"
                     );
                 """
 
                 try_sql """
-                    CREATE TABLE IF NOT EXISTS $table2 (
+                    CREATE TABLE IF NOT EXISTS ${table2}_${tableIdx} (
                         lo_orderdate int(11) NOT NULL COMMENT "",
                         lo_orderkey bigint(20) NOT NULL COMMENT "",
                         lo_linenumber bigint(20) NOT NULL COMMENT "",
@@ -79,7 +80,7 @@ suite("test_create_table_exception") {
                 """
 
                 try_sql """
-                    CREATE TABLE $table3 (
+                    CREATE TABLE ${table3}_${tableIdx} (
                         time date,
                         key1 int,
                         key2 int,
@@ -109,19 +110,35 @@ suite("test_create_table_exception") {
                     );
                 """
             }
-            createTable()
+            createTable(1)
             def result = sql """show tables;"""
             assertEquals(result.size(), 0)
+
+            def checkResult = { ->
+                def tables = sql """show tables;"""
+                log.info("tables=" + tables)
+                assertEquals(3, tables.size())
+
+                def groups = sql """ show proc "/colocation_group" """
+                log.info("groups=" + groups)
+                assertEquals(1, groups.size())
+            }
+
             
GetDebugPoint().disableDebugPointForAllFEs('FE.createOlapTable.exception')
-            createTable()
-            result = sql """show tables;"""
-            log.info(result.toString())
-            assertEquals(result.size(), 3)
+            createTable(2)
+            checkResult()
+
+            sleep 1000
+            cluster.restartFrontends(cluster.getMasterFe().index)
+            sleep 32_000
+            def newMasterFe = cluster.getMasterFe()
+            def newMasterFeUrl =  
"jdbc:mysql://${newMasterFe.host}:${newMasterFe.queryPort}/?useLocalSessionState=false&allowLoadLocalInfile=false"
+            newMasterFeUrl = context.config.buildUrlWithDb(newMasterFeUrl, 
context.dbName)
+            connect('root', '', newMasterFeUrl) {
+                checkResult()
+            }
+
         } finally {
-            
GetDebugPoint().disableDebugPointForAllFEs('FE.createOlapTable.exception')
-            sql """drop table if exists ${table1}"""
-            sql """drop table if exists ${table2}"""
-            sql """drop table if exists ${table3}"""
         }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to