This is an automated email from the ASF dual-hosted git repository.
w41ter 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 a6ef7e00e4c [fix](restore) Fix view signature #41120 (#41150)
a6ef7e00e4c is described below
commit a6ef7e00e4ce53bc3b4942fcbd804849b189a175
Author: walter <[email protected]>
AuthorDate: Mon Sep 23 22:04:20 2024 +0800
[fix](restore) Fix view signature #41120 (#41150)
cherry pick from #41120
---
.../java/org/apache/doris/backup/RestoreJob.java | 21 ++++++++++++++-------
.../java/org/apache/doris/catalog/Database.java | 4 ++++
.../java/org/apache/doris/catalog/OlapTable.java | 2 +-
.../main/java/org/apache/doris/catalog/View.java | 4 +++-
.../test_backup_restore_with_view.groovy | 17 +++++++++++++++++
5 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
index bad61892b95..a35858e498a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
@@ -776,16 +776,23 @@ public class RestoreJob extends AbstractJob {
if (localTbl != null) {
Preconditions.checkState(localTbl.getType() ==
TableType.VIEW);
View localView = (View) localTbl;
- if
(!localView.getSignature(BackupHandler.SIGNATURE_VERSION)
-
.equals(remoteView.getSignature(BackupHandler.SIGNATURE_VERSION))) {
- status = new Status(ErrCode.COMMON_ERROR, "View "
- +
jobInfo.getAliasByOriginNameIfSet(backupViewName)
- + " already exist but with different schema");
- return;
+ String localViewSignature =
localView.getSignature(BackupHandler.SIGNATURE_VERSION);
+ // keep compatible with old version, compare the signature
without reset view def
+ if
(!localViewSignature.equals(remoteView.getSignature(BackupHandler.SIGNATURE_VERSION)))
{
+ // reset view def to dest db name and compare
signature again
+ String srcDbName = jobInfo.dbName;
+ remoteView.resetViewDefForRestore(srcDbName,
db.getName());
+ if
(!localViewSignature.equals(remoteView.getSignature(BackupHandler.SIGNATURE_VERSION)))
{
+ status = new Status(ErrCode.COMMON_ERROR, "View "
+ +
jobInfo.getAliasByOriginNameIfSet(backupViewName)
+ + " already exist but with different
schema");
+ return;
+ }
}
} else {
String srcDbName = jobInfo.dbName;
- remoteView.resetIdsForRestore(env, srcDbName,
db.getFullName());
+ remoteView.resetViewDefForRestore(srcDbName, db.getName());
+ remoteView.resetIdsForRestore(env);
restoredTbls.add(remoteView);
}
}
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 0eed9534f0a..eec5bf2b2a4 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
@@ -213,6 +213,10 @@ public class Database extends MetaObject implements
Writable, DatabaseIf<Table>
return fullQualifiedName;
}
+ public String getName() {
+ return ClusterNamespace.getNameFromFullName(fullQualifiedName);
+ }
+
public void setNameWithLock(String newName) {
writeLock();
try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
index 795d1b52d39..48c70917da4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
@@ -643,7 +643,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf {
baseIndexId = newIdxId;
}
MaterializedIndexMeta indexMeta =
origIdxIdToMeta.get(entry.getKey());
- indexMeta.resetIndexIdForRestore(newIdxId, srcDbName,
db.getFullName());
+ indexMeta.resetIndexIdForRestore(newIdxId, srcDbName,
db.getName());
indexIdToMeta.put(newIdxId, indexMeta);
indexNameToId.put(entry.getValue(), newIdxId);
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/View.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/View.java
index d9e4ac84d92..54a8f87dc16 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/View.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/View.java
@@ -244,9 +244,11 @@ public class View extends Table {
return copied;
}
- public void resetIdsForRestore(Env env, String srcDbName, String dbName) {
+ public void resetIdsForRestore(Env env) {
id = env.getNextId();
+ }
+ public void resetViewDefForRestore(String srcDbName, String dbName) {
// the source db name is not setted in old BackupMeta, keep compatible
with the old one.
if (srcDbName != null) {
inlineViewDef = inlineViewDef.replaceAll(srcDbName, dbName);
diff --git
a/regression-test/suites/backup_restore/test_backup_restore_with_view.groovy
b/regression-test/suites/backup_restore/test_backup_restore_with_view.groovy
index eee4a70c745..4ba7c652be2 100644
--- a/regression-test/suites/backup_restore/test_backup_restore_with_view.groovy
+++ b/regression-test/suites/backup_restore/test_backup_restore_with_view.groovy
@@ -93,6 +93,23 @@ suite("test_backup_restore_with_view", "backup_restore") {
assertTrue(show_view.contains("${tableName}"))
+ // restore to db1, test the view signature.
+ sql """
+ RESTORE SNAPSHOT ${dbName1}.${snapshotName}
+ FROM `${repoName}`
+ PROPERTIES
+ (
+ "backup_timestamp" = "${snapshot}",
+ "reserve_replica" = "true"
+ )
+ """
+
+ syncer.waitAllRestoreFinish(dbName1)
+ restore_result = sql_return_maparray """ SHOW RESTORE FROM ${dbName1}
WHERE Label ="${snapshotName}" """
+ restore_result.last()
+ logger.info("show restore result: ${restore_result}")
+ assertTrue(restore_result.last().State == "FINISHED")
+
sql "DROP TABLE ${dbName}.${tableName} FORCE"
sql "DROP VIEW ${dbName}.${viewName}"
sql "DROP DATABASE ${dbName} FORCE"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]