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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 80e8815  [improvement](restore) allow query on part of partitions when 
others are in RESTORE (#8245)
80e8815 is described below

commit 80e88159d9550179be6329985bcb648967647096
Author: GoGoWen <82132356+gogo...@users.noreply.github.com>
AuthorDate: Thu Mar 3 22:34:10 2022 +0800

    [improvement](restore) allow query on part of partitions when others are in 
RESTORE (#8245)
---
 .../java/org/apache/doris/analysis/Analyzer.java   | 14 ++++++++-
 .../java/org/apache/doris/backup/RestoreJob.java   | 34 ++++++++++++++++++++++
 .../java/org/apache/doris/catalog/Partition.java   |  3 +-
 .../org/apache/doris/planner/OlapScanNode.java     |  8 +++++
 4 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index db6e6c5..9bcb5a1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -22,6 +22,7 @@ import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.OlapTable.OlapTableState;
+import org.apache.doris.catalog.Partition.PartitionState;
 import org.apache.doris.catalog.Table;
 import org.apache.doris.catalog.Table.TableType;
 import org.apache.doris.catalog.Type;
@@ -81,6 +82,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Repository of analysis state for single select block.
@@ -585,7 +587,17 @@ public class Analyzer {
 
         if (table.getType() == TableType.OLAP && (((OlapTable) 
table).getState() == OlapTableState.RESTORE
                 || ((OlapTable) table).getState() == 
OlapTableState.RESTORE_WITH_LOAD)) {
-            ErrorReport.reportAnalysisException(ErrorCode.ERR_BAD_TABLE_STATE, 
"RESTORING");
+            Boolean isNotRestoring = ((OlapTable) 
table).getPartitions().stream().filter(
+                    partition -> partition.getState() == PartitionState.RESTORE
+            ).collect(Collectors.toList()).isEmpty();
+
+            if(!isNotRestoring){
+                // if doing restore with partitions, the status check push 
down to OlapScanNode::computePartitionInfo to
+                // support query that partitions is not restoring.
+            } else {
+                // if doing restore with table, throw exception here
+                
ErrorReport.reportAnalysisException(ErrorCode.ERR_BAD_TABLE_STATE, "RESTORING");
+            }
         }
 
         // tableName.getTbl() stores the table name specified by the user in 
the from statement.
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 005bb9c..f6f1830 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
@@ -36,6 +36,7 @@ import org.apache.doris.catalog.OdbcTable;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.OlapTable.OlapTableState;
 import org.apache.doris.catalog.Partition;
+import org.apache.doris.catalog.Partition.PartitionState;
 import org.apache.doris.catalog.PartitionInfo;
 import org.apache.doris.catalog.PartitionItem;
 import org.apache.doris.catalog.PartitionType;
@@ -469,6 +470,16 @@ public class RestoreJob extends AbstractJob {
                 }
 
                 olapTbl.setState(OlapTableState.RESTORE);
+                // set restore status for partitions
+                BackupOlapTableInfo tblInfo = 
jobInfo.backupOlapTableObjects.get(tableName);
+                for (Map.Entry<String, BackupPartitionInfo> partitionEntry : 
tblInfo.partitions.entrySet()) {
+                    String partitionName = partitionEntry.getKey();
+                    Partition partition = olapTbl.getPartition(partitionName);
+                    if (partition == null) {
+                        continue;
+                    }
+                    partition.setState(PartitionState.RESTORE);
+                }
             } finally {
                 olapTbl.writeUnlock();
             }
@@ -578,6 +589,7 @@ public class RestoreJob extends AbstractJob {
                                         return;
                                     }
                                 }
+
                             } else {
                                 // partitions does not exist
                                 PartitionInfo localPartitionInfo = 
localOlapTbl.getPartitionInfo();
@@ -1076,6 +1088,16 @@ public class RestoreJob extends AbstractJob {
             tbl.writeLock();
             try {
                 olapTbl.setState(OlapTableState.RESTORE);
+                // set restore status for partitions
+                BackupOlapTableInfo tblInfo = 
jobInfo.backupOlapTableObjects.get(tableName);
+                for (Map.Entry<String, BackupPartitionInfo> partitionEntry : 
tblInfo.partitions.entrySet()) {
+                    String partitionName = partitionEntry.getKey();
+                    Partition partition = olapTbl.getPartition(partitionName);
+                    if (partition == null) {
+                        continue;
+                    }
+                    partition.setState(PartitionState.RESTORE);
+                }
             } finally {
                 tbl.writeUnlock();
             }
@@ -1650,6 +1672,18 @@ public class RestoreJob extends AbstractJob {
                         || olapTbl.getState() == 
OlapTableState.RESTORE_WITH_LOAD) {
                     olapTbl.setState(OlapTableState.NORMAL);
                 }
+
+                BackupOlapTableInfo tblInfo = 
jobInfo.backupOlapTableObjects.get(tableName);
+                for (Map.Entry<String, BackupPartitionInfo> partitionEntry : 
tblInfo.partitions.entrySet()) {
+                    String partitionName = partitionEntry.getKey();
+                    Partition partition = olapTbl.getPartition(partitionName);
+                    if (partition == null) {
+                        continue;
+                    }
+                    if (partition.getState() == PartitionState.RESTORE) {
+                        partition.setState(PartitionState.NORMAL);
+                    }
+                }
             } finally {
                 tbl.writeUnlock();
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Partition.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Partition.java
index 3120c64..8b94e28 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Partition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Partition.java
@@ -52,7 +52,8 @@ public class Partition extends MetaObject implements Writable 
{
         @Deprecated
         ROLLUP,
         @Deprecated
-        SCHEMA_CHANGE
+        SCHEMA_CHANGE,
+        RESTORE
     }
 
     @SerializedName(value = "id")
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
index ab0e3b2..5ef9ed6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -39,6 +39,7 @@ import org.apache.doris.catalog.MaterializedIndex;
 import org.apache.doris.catalog.MaterializedIndexMeta;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Partition;
+import org.apache.doris.catalog.Partition.PartitionState;
 import org.apache.doris.catalog.PartitionInfo;
 import org.apache.doris.catalog.PartitionItem;
 import org.apache.doris.catalog.PartitionType;
@@ -597,6 +598,13 @@ public class OlapScanNode extends ScanNode {
                   .collect(Collectors.toList());
         }
         selectedPartitionNum = selectedPartitionIds.size();
+
+        for(long id : selectedPartitionIds){
+            Partition partition = olapTable.getPartition(id);
+            if(partition.getState() == PartitionState.RESTORE){
+                
ErrorReport.reportAnalysisException(ErrorCode.ERR_BAD_PARTITION_STATE, 
partition.getName(), "RESTORING");
+            }
+        }
         LOG.debug("partition prune cost: {} ms, partitions: {}",
                 (System.currentTimeMillis() - start), selectedPartitionIds);
     }

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

Reply via email to