w41ter commented on code in PR #47314:
URL: https://github.com/apache/doris/pull/47314#discussion_r1928048046


##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -215,6 +216,8 @@ public enum RestoreJobState {
     private boolean isCleanPartitions = false;
     // Whether to restore the data into a temp table, and then replace the 
origin one.
     private boolean isAtomicRestore = false;
+    // Whether to restore the table replace with the exists table.

Review Comment:
   ```suggestion
       // Whether to restore the table by replacing the exists but conflicted 
table.
   ```



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -252,23 +256,26 @@ public RestoreJob(String label, String backupTs, long 
dbId, String dbName, Backu
         this.isCleanTables = isCleanTables;
         this.isCleanPartitions = isCleanPartitions;
         this.isAtomicRestore = isAtomicRestore;
+        this.isForceReplace = isForceReplace;

Review Comment:
   ```suggestion
                if (this.isAtomicRestore) {
                this.isForceReplace = isForceReplace;
           }
   ```



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -1294,6 +1330,9 @@ private boolean 
genFileMappingWhenBackupReplicasEqual(PartitionInfo localPartInf
             restoreReplicaNum = remoteReplicaAlloc.getTotalReplicaNum();
         }
         if (localReplicaNum != restoreReplicaNum) {
+            if (isForceReplace) {
+                return true;
+            }

Review Comment:
   ```suggestion
   ```



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -2060,8 +2099,8 @@ private Status allTabletCommitted(boolean isReplay) {
         }
 
         // replace the origin tables in atomic.
-        if (isAtomicRestore) {
-            Status st = atomicReplaceOlapTables(db, isReplay);
+        if (isAtomicRestore || isForceReplace) {
+            Status st = restoreWithReplaceOlapTables(db, isReplay);

Review Comment:
   ```suggestion
           if (isAtomicRestore) {
               Status st = atomicReplaceOlapTables(db, isReplay);
   ```



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -691,31 +698,44 @@ private void checkAndPrepareMeta() {
                 Table remoteTbl = backupMeta.getTable(tableName);
                 Preconditions.checkNotNull(remoteTbl);
                 Table localTbl = 
db.getTableNullable(jobInfo.getAliasByOriginNameIfSet(tableName));
+                boolean isSchemaChanged = false;
                 if (localTbl != null && localTbl.getType() != TableType.OLAP) {
-                    // table already exist, but is not OLAP
-                    status = new Status(ErrCode.COMMON_ERROR,
-                            "The type of local table should be same as type of 
remote table: "
-                                    + remoteTbl.getName());
-                    return;
+                    if (!isForceReplace) {
+                        isSchemaChanged = true;
+                    } else {
+                        // table already exist, but is not OLAP
+                        status = new Status(ErrCode.COMMON_ERROR,
+                                "The type of local table should be same as 
type of remote table: "
+                                        + remoteTbl.getName());
+                        return;
+                    }
                 }
 
                 if (localTbl != null) {
                     OlapTable localOlapTbl = (OlapTable) localTbl;
                     OlapTable remoteOlapTbl = (OlapTable) remoteTbl;
 
                     if (localOlapTbl.isColocateTable() || (reserveColocate && 
remoteOlapTbl.isColocateTable())) {
-                        status = new Status(ErrCode.COMMON_ERROR, "Not support 
to restore to local table "
-                                + tableName + " with colocate group.");
-                        return;
+                        if (!isForceReplace) {
+                            isSchemaChanged = true;
+                        } else {
+                            status = new Status(ErrCode.COMMON_ERROR, "Not 
support to restore to local table "
+                                    + tableName + " with colocate group.");
+                            return;
+                        }

Review Comment:
   Keep the original logic for now, as we don't support the colocate group yet.



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -691,31 +698,44 @@ private void checkAndPrepareMeta() {
                 Table remoteTbl = backupMeta.getTable(tableName);
                 Preconditions.checkNotNull(remoteTbl);
                 Table localTbl = 
db.getTableNullable(jobInfo.getAliasByOriginNameIfSet(tableName));
+                boolean isSchemaChanged = false;
                 if (localTbl != null && localTbl.getType() != TableType.OLAP) {
-                    // table already exist, but is not OLAP
-                    status = new Status(ErrCode.COMMON_ERROR,
-                            "The type of local table should be same as type of 
remote table: "
-                                    + remoteTbl.getName());
-                    return;
+                    if (!isForceReplace) {
+                        isSchemaChanged = true;

Review Comment:
   Consider adding some logs here



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -725,13 +745,17 @@ private void checkAndPrepareMeta() {
                         String remoteTblSignature = remoteOlapTbl.getSignature(
                                 BackupHandler.SIGNATURE_VERSION, 
intersectPartNames);
                         if (!localTblSignature.equals(remoteTblSignature)) {
-                            String alias = 
jobInfo.getAliasByOriginNameIfSet(tableName);
-                            LOG.warn("Table {} already exists but with 
different schema, "
-                                    + "local table: {}, remote table: {}",
-                                    alias, localTblSignature, 
remoteTblSignature);
-                            status = new Status(ErrCode.COMMON_ERROR, "Table "
-                                    + alias + " already exist but with 
different schema");
-                            return;
+                            if (isForceReplace) {
+                                isSchemaChanged = true;

Review Comment:
   Consider adding some logs here



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -768,7 +796,11 @@ private void checkAndPrepareMeta() {
                                 // Same partition, same range or a single 
partitioned table.
                                 if 
(genFileMappingWhenBackupReplicasEqual(localPartInfo, localPartition,
                                         localTbl, backupPartInfo, 
partitionName, tblInfo, remoteReplicaAlloc)) {
-                                    return;
+                                    if (isForceReplace) {
+                                        isSchemaChanged = true;
+                                    } else {
+                                        return;
+                                    }

Review Comment:
   ```suggestion
                                       return;
   ```
   
   Atomic restore will skip this step.



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -691,31 +698,44 @@ private void checkAndPrepareMeta() {
                 Table remoteTbl = backupMeta.getTable(tableName);
                 Preconditions.checkNotNull(remoteTbl);
                 Table localTbl = 
db.getTableNullable(jobInfo.getAliasByOriginNameIfSet(tableName));
+                boolean isSchemaChanged = false;
                 if (localTbl != null && localTbl.getType() != TableType.OLAP) {
-                    // table already exist, but is not OLAP
-                    status = new Status(ErrCode.COMMON_ERROR,
-                            "The type of local table should be same as type of 
remote table: "
-                                    + remoteTbl.getName());
-                    return;
+                    if (!isForceReplace) {
+                        isSchemaChanged = true;
+                    } else {
+                        // table already exist, but is not OLAP
+                        status = new Status(ErrCode.COMMON_ERROR,
+                                "The type of local table should be same as 
type of remote table: "
+                                        + remoteTbl.getName());
+                        return;
+                    }
                 }
 
                 if (localTbl != null) {
                     OlapTable localOlapTbl = (OlapTable) localTbl;
                     OlapTable remoteOlapTbl = (OlapTable) remoteTbl;
 
                     if (localOlapTbl.isColocateTable() || (reserveColocate && 
remoteOlapTbl.isColocateTable())) {
-                        status = new Status(ErrCode.COMMON_ERROR, "Not support 
to restore to local table "
-                                + tableName + " with colocate group.");
-                        return;
+                        if (!isForceReplace) {
+                            isSchemaChanged = true;
+                        } else {
+                            status = new Status(ErrCode.COMMON_ERROR, "Not 
support to restore to local table "
+                                    + tableName + " with colocate group.");
+                            return;
+                        }
                     }
 
                     localOlapTbl.readLock();
                     try {
                         List<String> intersectPartNames = Lists.newArrayList();
                         Status st = 
localOlapTbl.getIntersectPartNamesWith(remoteOlapTbl, intersectPartNames);
                         if (!st.ok()) {
-                            status = st;
-                            return;
+                            if (isForceReplace) {
+                                isSchemaChanged = true;

Review Comment:
   Consider adding some logs here



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -778,10 +810,14 @@ private void checkAndPrepareMeta() {
                                     PartitionItem remoteItem = 
remoteOlapTbl.getPartitionInfo()
                                             .getItem(backupPartInfo.id);
                                     if 
(localPartitionInfo.getAnyIntersectItem(remoteItem, false) != null) {
-                                        status = new 
Status(ErrCode.COMMON_ERROR, "Partition " + partitionName
-                                                + " in table " + 
localTbl.getName()
-                                                + " has conflict partition 
item with existing items");
-                                        return;
+                                        if (isForceReplace) {
+                                            isSchemaChanged = true;
+                                        } else {
+                                            status = new 
Status(ErrCode.COMMON_ERROR, "Partition " + partitionName
+                                                    + " in table " + 
localTbl.getName()
+                                                    + " has conflict partition 
item with existing items");
+                                            return;
+                                        }

Review Comment:
   Keep the original logic, as the atomic restore won't step in here.



##########
fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java:
##########
@@ -2427,8 +2466,7 @@ private void cancelInternal(boolean isReplay) {
         LOG.info("finished to cancel restore job. is replay: {}. {}", 
isReplay, this);
     }
 
-    private Status atomicReplaceOlapTables(Database db, boolean isReplay) {
-        assert isAtomicRestore;
+    private Status restoreWithReplaceOlapTables(Database db, boolean isReplay) 
{

Review Comment:
   The name atomicReplaceOlapTables is enough, please revert the below changes.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


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

Reply via email to