From 8ba8cc3947c63c48b2ded37f16f4df4abe8214ba Mon Sep 17 00:00:00 2001 From: walter Date: Wed, 17 Jul 2024 17:23:08 +0800 Subject: [PATCH] [chore](backup) Fix the db name of the restored view Cherry-pick #37412, #39855 Previously, during restore, the database name in the CREATE VIEW statement was not modified, causing the restored view to be unviewable with the SHOW VIEW command. This PR retains the original cluster's database name in the BackupMeta and manually replaces it with the new cluster's database name in the CREATE VIEW statement during restore. --- .../org/apache/doris/backup/RestoreJob.java | 3 ++- .../java/org/apache/doris/catalog/View.java | 7 +++++- ....out => test_backup_restore_with_view.out} | 0 ...y => test_backup_restore_with_view.groovy} | 24 ++++++++++++++----- 4 files changed, 26 insertions(+), 8 deletions(-) rename regression-test/data/backup_restore/{test_backup_restore_with.out => test_backup_restore_with_view.out} (100%) rename regression-test/suites/backup_restore/{test_backup_restore_with.groovy => test_backup_restore_with_view.groovy} (75%) 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 2c14243d890182..628882b36dc682 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 @@ -780,7 +780,8 @@ private void checkAndPrepareMeta() { return; } } else { - remoteView.resetIdsForRestore(env); + String srcDbName = jobInfo.dbName; + remoteView.resetIdsForRestore(env, srcDbName, db.getFullName()); restoredTbls.add(remoteView); } } 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 612d29a995e49d..5f8e1ba8138179 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 @@ -237,8 +237,13 @@ public View clone() { return copied; } - public void resetIdsForRestore(Env env) { + public void resetIdsForRestore(Env env, String srcDbName, String dbName) { id = env.getNextId(); + + // the source db name is not setted in old BackupMeta, keep compatible with the old one. + if (srcDbName != null) { + inlineViewDef = inlineViewDef.replaceAll(srcDbName, dbName); + } } @Override diff --git a/regression-test/data/backup_restore/test_backup_restore_with.out b/regression-test/data/backup_restore/test_backup_restore_with_view.out similarity index 100% rename from regression-test/data/backup_restore/test_backup_restore_with.out rename to regression-test/data/backup_restore/test_backup_restore_with_view.out diff --git a/regression-test/suites/backup_restore/test_backup_restore_with.groovy b/regression-test/suites/backup_restore/test_backup_restore_with_view.groovy similarity index 75% rename from regression-test/suites/backup_restore/test_backup_restore_with.groovy rename to regression-test/suites/backup_restore/test_backup_restore_with_view.groovy index 4ad04666bc2cc5..eee4a70c745ed5 100644 --- a/regression-test/suites/backup_restore/test_backup_restore_with.groovy +++ b/regression-test/suites/backup_restore/test_backup_restore_with_view.groovy @@ -18,6 +18,7 @@ suite("test_backup_restore_with_view", "backup_restore") { String suiteName = "backup_restore_with_view" String dbName = "${suiteName}_db" + String dbName1 = "${suiteName}_db_1" String repoName = "repo_" + UUID.randomUUID().toString().replace("-", "") String snapshotName = "${suiteName}_snapshot" String tableName = "${suiteName}_table" @@ -26,6 +27,7 @@ suite("test_backup_restore_with_view", "backup_restore") { def syncer = getSyncer() syncer.createS3Repository(repoName) sql "CREATE DATABASE IF NOT EXISTS ${dbName}" + sql "CREATE DATABASE IF NOT EXISTS ${dbName1}" int numRows = 10; sql "DROP TABLE IF EXISTS ${dbName}.${tableName} FORCE" @@ -66,11 +68,11 @@ suite("test_backup_restore_with_view", "backup_restore") { def snapshot = syncer.getSnapshotTimestamp(repoName, snapshotName) assertTrue(snapshot != null) - sql "DROP TABLE ${dbName}.${tableName} FORCE" - sql "DROP VIEW ${dbName}.${viewName}" + sql "DROP TABLE IF EXISTS ${dbName1}.${tableName} FORCE" + sql "DROP VIEW IF EXISTS ${dbName1}.${viewName}" sql """ - RESTORE SNAPSHOT ${dbName}.${snapshotName} + RESTORE SNAPSHOT ${dbName1}.${snapshotName} FROM `${repoName}` PROPERTIES ( @@ -79,14 +81,24 @@ suite("test_backup_restore_with_view", "backup_restore") { ) """ - syncer.waitAllRestoreFinish(dbName) + syncer.waitAllRestoreFinish(dbName1) + + qt_sql "SELECT * FROM ${dbName1}.${tableName} ORDER BY id ASC" + qt_sql "SELECT * FROM ${dbName1}.${viewName} ORDER BY id ASC" + def show_view_result = sql_return_maparray "SHOW VIEW FROM ${tableName} FROM ${dbName1}" + logger.info("show view result: ${show_view_result}") + assertTrue(show_view_result.size() == 1); + def show_view = show_view_result[0]['Create View'] + assertTrue(show_view.contains("${dbName1}")) + assertTrue(show_view.contains("${tableName}")) - qt_sql "SELECT * FROM ${dbName}.${tableName} ORDER BY id ASC" - qt_sql "SELECT * FROM ${dbName}.${viewName} ORDER BY id ASC" sql "DROP TABLE ${dbName}.${tableName} FORCE" sql "DROP VIEW ${dbName}.${viewName}" sql "DROP DATABASE ${dbName} FORCE" + sql "DROP TABLE ${dbName1}.${tableName} FORCE" + sql "DROP VIEW ${dbName1}.${viewName}" + sql "DROP DATABASE ${dbName1} FORCE" sql "DROP REPOSITORY `${repoName}`" }