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

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


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 166c4856d9f branch-3.1: [fix](meta) make OP_CERATE_DB compatible with 
3.0 (#55148)
166c4856d9f is described below

commit 166c4856d9ff6c1faa012200be2d276a07e2a241
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Sun Aug 24 10:24:12 2025 -0700

    branch-3.1: [fix](meta) make OP_CERATE_DB compatible with 3.0 (#55148)
    
    ### What problem does this PR solve?
    
    Previously, we introduced a new opcode `OP_NEW_CREATE_DB` in #46326.
    If use upgrade to 3.1 from 3.0, and create a database, he can not
    downgrade to the old version
    because old version can not recognize `OP_NEW_CREATE_DB`.
    
    This PR make it compatible by still using the old opcode `OP_CREATE_DB`,
    but add catalog name in `Database`
    temporarily.
---
 .../main/java/org/apache/doris/catalog/Database.java  | 19 +++++++++++++++++++
 .../org/apache/doris/datasource/ExternalCatalog.java  |  7 ++++---
 .../org/apache/doris/datasource/InternalCatalog.java  |  5 ++---
 .../main/java/org/apache/doris/persist/EditLog.java   | 13 ++++++++++---
 .../java/org/apache/doris/persist/OperationType.java  |  4 ++--
 5 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java
index f1f9db5e33f..a2089fac133 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java
@@ -131,6 +131,12 @@ public class Database extends MetaObject implements 
Writable, DatabaseIf<Table>,
     // from dbProperties;
     private BinlogConfig binlogConfig = new BinlogConfig();
 
+    // ATTN: This field is only used for compatible with old version
+    // Do not use it except for replaying OP_CREATE_DB
+    // it will be removed in version 4.0
+    @SerializedName(value = "cn")
+    private String ctlName;
+
     public Database() {
         this(0, null);
     }
@@ -155,6 +161,19 @@ public class Database extends MetaObject implements 
Writable, DatabaseIf<Table>,
         this.dbEncryptKey = new DatabaseEncryptKey();
     }
 
+    // Only used for creating external database.
+    // DO NOT use it for internal database
+    public Database(String ctlName, String dbName) {
+        this(0, dbName);
+        Preconditions.checkState(!Strings.isNullOrEmpty(ctlName), dbName);
+        this.ctlName = ctlName;
+    }
+
+    // DO NOT use it except for replaying OP_CREATE_DB
+    public String getCtlName() {
+        return ctlName;
+    }
+
     public void markDropped() {
         isDropped = true;
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
index 083d3d20565..abee493b7f4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
@@ -22,6 +22,7 @@ import org.apache.doris.analysis.CreateTableStmt;
 import org.apache.doris.analysis.PartitionNames;
 import org.apache.doris.analysis.TableName;
 import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.InfoSchemaDb;
@@ -61,7 +62,6 @@ import 
org.apache.doris.nereids.trees.plans.commands.info.CreateOrReplaceBranchI
 import 
org.apache.doris.nereids.trees.plans.commands.info.CreateOrReplaceTagInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.DropBranchInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.DropTagInfo;
-import org.apache.doris.persist.CreateDbInfo;
 import org.apache.doris.persist.CreateTableInfo;
 import org.apache.doris.persist.DropDbInfo;
 import org.apache.doris.persist.DropInfo;
@@ -1057,8 +1057,9 @@ public abstract class ExternalCatalog
             boolean res = metadataOps.createDb(dbName, ifNotExists, 
properties);
             if (!res) {
                 // we should get the db stored in Doris, and use local name in 
edit log.
-                CreateDbInfo info = new CreateDbInfo(getName(), dbName, null);
-                Env.getCurrentEnv().getEditLog().logCreateDb(info);
+                // CreateDbInfo info = new CreateDbInfo(getName(), dbName, 
null);
+                Database db = new Database(getName(), dbName);
+                Env.getCurrentEnv().getEditLog().logCreateDb(db);
             }
         } catch (Exception e) {
             LOG.warn("Failed to create database {} in catalog {}.", dbName, 
getName(), e);
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 add9667de5e..bf8d1d47e85 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
@@ -148,7 +148,6 @@ import 
org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo;
 import org.apache.doris.persist.AlterDatabasePropertyInfo;
 import org.apache.doris.persist.AutoIncrementIdUpdateLog;
 import org.apache.doris.persist.ColocatePersistInfo;
-import org.apache.doris.persist.CreateDbInfo;
 import org.apache.doris.persist.DatabaseInfo;
 import org.apache.doris.persist.DropDbInfo;
 import org.apache.doris.persist.DropInfo;
@@ -448,8 +447,8 @@ public class InternalCatalog implements CatalogIf<Database> 
{
                 }
                 try {
                     unprotectCreateDb(db);
-                    CreateDbInfo dbInfo = new 
CreateDbInfo(InternalCatalog.INTERNAL_CATALOG_NAME, db.getName(), db);
-                    Env.getCurrentEnv().getEditLog().logCreateDb(dbInfo);
+                    // CreateDbInfo dbInfo = new 
CreateDbInfo(InternalCatalog.INTERNAL_CATALOG_NAME, db.getName(), db);
+                    Env.getCurrentEnv().getEditLog().logCreateDb(db);
                 } finally {
                     db.writeUnlock();
                 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java 
b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
index d6daade3d4b..b7f73831b6d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
@@ -311,7 +311,14 @@ public class EditLog {
                 }
                 case OperationType.OP_CREATE_DB: {
                     Database db = (Database) journal.getData();
-                    CreateDbInfo info = new 
CreateDbInfo(db.getCatalog().getName(), db.getName(), db);
+                    CreateDbInfo info;
+                    if (!Strings.isNullOrEmpty(db.getCtlName())) {
+                        // if ctlName is not empty, it means this db is 
created in an external catalog
+                        // we just need db name and ctl name
+                        info = new CreateDbInfo(db.getCtlName(), db.getName(), 
null);
+                    } else {
+                        info = new CreateDbInfo(db.getCatalog().getName(), 
db.getName(), db);
+                    }
                     env.replayCreateDb(info);
                     break;
                 }
@@ -1615,8 +1622,8 @@ public class EditLog {
         logEdit(OperationType.OP_SAVE_TRANSACTION_ID, new 
Text(Long.toString(transactionId)));
     }
 
-    public void logCreateDb(CreateDbInfo info) {
-        logEdit(OperationType.OP_NEW_CREATE_DB, info);
+    public void logCreateDb(Database db) {
+        logEdit(OperationType.OP_CREATE_DB, db);
     }
 
     public void logDropDb(DropDbInfo dropDbInfo) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java 
b/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java
index 455ff56589d..a91cac18865 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java
@@ -28,13 +28,13 @@ public class OperationType {
     public static final short OP_LOCAL_EOF = -1;
     public static final short OP_SAVE_NEXTID = 0;
     @Deprecated
-    public static final short OP_CREATE_DB = 1; // deprecated, use 
OP_NEW_CREATE_DB instead
+    public static final short OP_CREATE_DB = 1; // deprecated in 4.0, use 
OP_NEW_CREATE_DB instead
     public static final short OP_DROP_DB = 2;
     public static final short OP_ALTER_DB = 3;
     public static final short OP_ERASE_DB = 4;
     public static final short OP_RECOVER_DB = 5;
     public static final short OP_RENAME_DB = 6;
-    public static final short OP_NEW_CREATE_DB = 7;
+    public static final short OP_NEW_CREATE_DB = 7; // do not use this code 
before 4.0
 
     // 10~19 110~119 210~219 ...
     public static final short OP_CREATE_TABLE = 10;


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

Reply via email to