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]