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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]