This is an automated email from the ASF dual-hosted git repository. xingtanzjr pushed a commit to branch xingtanzjr/fix_empty_partition in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 5dbaf7f4ac0dfa862fe6b671ff8c3c920ba7a0b1 Author: Jinrui.Zhang <[email protected]> AuthorDate: Tue May 3 16:03:37 2022 +0800 handle the situation that there is no data/schema partion for query --- .../java/org/apache/iotdb/commons/partition/DataPartition.java | 5 +++++ .../java/org/apache/iotdb/commons/partition/Partition.java | 2 ++ .../org/apache/iotdb/commons/partition/SchemaPartition.java | 5 +++++ .../java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java | 5 +++++ .../org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java | 10 +++++++++- 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java b/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java index df98015fb6..a46b8bc246 100644 --- a/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java +++ b/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java @@ -41,6 +41,11 @@ public class DataPartition extends Partition { super(seriesSlotExecutorName, seriesPartitionSlotNum); } + @Override + public boolean isEmpty() { + return dataPartitionMap == null || dataPartitionMap.isEmpty(); + } + public DataPartition( Map<String, Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, List<TRegionReplicaSet>>>> dataPartitionMap, diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/partition/Partition.java b/node-commons/src/main/java/org/apache/iotdb/commons/partition/Partition.java index 839c330f90..426a9e6f50 100644 --- a/node-commons/src/main/java/org/apache/iotdb/commons/partition/Partition.java +++ b/node-commons/src/main/java/org/apache/iotdb/commons/partition/Partition.java @@ -38,4 +38,6 @@ public abstract class Partition { protected TSeriesPartitionSlot calculateDeviceGroupId(String deviceName) { return executor.getSeriesPartitionSlot(deviceName); } + + public abstract boolean isEmpty(); } diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java b/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java index 586c380e54..9149d8139c 100644 --- a/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java +++ b/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java @@ -36,6 +36,11 @@ public class SchemaPartition extends Partition { super(seriesSlotExecutorName, seriesPartitionSlotNum); } + @Override + public boolean isEmpty() { + return schemaPartitionMap == null || schemaPartitionMap.isEmpty(); + } + public SchemaPartition( Map<String, Map<TSeriesPartitionSlot, TRegionReplicaSet>> schemaPartitionMap, String seriesSlotExecutorName, diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java index efdc5d11f0..d2837312cb 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java @@ -120,4 +120,9 @@ public class Analysis { public void setTypeProvider(TypeProvider typeProvider) { this.typeProvider = typeProvider; } + + public boolean hasDataSource() { + return (dataPartition != null && !dataPartition.isEmpty()) + || (schemaPartition != null && !schemaPartition.isEmpty()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java index 776a75d58e..8b77c4ef1f 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java @@ -135,6 +135,10 @@ public class QueryExecution implements IQueryExecution { } public void start() { + if (skipExecute()) { + stateMachine.transitionToFinished(); + return; + } doLogicalPlan(); doDistributedPlan(); if (context.getQueryType() == QueryType.READ) { @@ -143,6 +147,10 @@ public class QueryExecution implements IQueryExecution { schedule(); } + private boolean skipExecute() { + return context.getQueryType() == QueryType.READ && !analysis.hasDataSource(); + } + // Analyze the statement in QueryContext. Generate the analysis this query need private static Analysis analyze( Statement statement, @@ -223,7 +231,7 @@ public class QueryExecution implements IQueryExecution { @Override public TsBlock getBatchResult() { try { - if (resultHandle.isAborted() || resultHandle.isFinished()) { + if (resultHandle == null || resultHandle.isAborted() || resultHandle.isFinished()) { return null; } ListenableFuture<Void> blocked = resultHandle.isBlocked();
