[Fix](query) Fix the calc logic of dispatch read time (#15036)
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
index 7b4a4e3..3503201 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
@@ -126,34 +126,38 @@
// topological dispatch according to dependency relations between FragmentInstances
private Future<FragInstanceDispatchResult> dispatchRead(List<FragmentInstance> instances) {
long startTime = System.nanoTime();
- for (FragmentInstance instance : instances) {
- try (SetThreadName threadName = new SetThreadName(instance.getId().getFullId())) {
- dispatchOneInstance(instance);
- } catch (FragmentInstanceDispatchException e) {
- return immediateFuture(new FragInstanceDispatchResult(e.getFailureStatus()));
- } catch (Throwable t) {
- LOGGER.warn(DISPATCH_FAILED, t);
- return immediateFuture(
- new FragInstanceDispatchResult(
- RpcUtils.getStatus(
- TSStatusCode.INTERNAL_SERVER_ERROR, UNEXPECTED_ERRORS + t.getMessage())));
- } finally {
- // friendly for gc, clear the plan node tree, for some queries select all devices, it will
- // release lots of memory
- if (!queryContext.isExplainAnalyze()) {
- // EXPLAIN ANALYZE will use these instances, so we can't clear them
- instance.getFragment().clearUselessField();
- } else {
- // TypeProvider is not used in EXPLAIN ANALYZE, so we can clear it
- instance.getFragment().clearTypeProvider();
- }
- long dispatchReadTime = System.nanoTime() - startTime;
- QUERY_EXECUTION_METRIC_SET.recordExecutionCost(DISPATCH_READ, dispatchReadTime);
- queryContext.recordDispatchCost(dispatchReadTime);
+ try {
+ for (FragmentInstance instance : instances) {
+ try (SetThreadName threadName = new SetThreadName(instance.getId().getFullId())) {
+ dispatchOneInstance(instance);
+ } catch (FragmentInstanceDispatchException e) {
+ return immediateFuture(new FragInstanceDispatchResult(e.getFailureStatus()));
+ } catch (Throwable t) {
+ LOGGER.warn(DISPATCH_FAILED, t);
+ return immediateFuture(
+ new FragInstanceDispatchResult(
+ RpcUtils.getStatus(
+ TSStatusCode.INTERNAL_SERVER_ERROR, UNEXPECTED_ERRORS + t.getMessage())));
+ } finally {
+ // friendly for gc, clear the plan node tree, for some queries select all devices, it will
+ // release lots of memory
+ if (!queryContext.isExplainAnalyze()) {
+ // EXPLAIN ANALYZE will use these instances, so we can't clear them
+ instance.getFragment().clearUselessField();
+ } else {
+ // TypeProvider is not used in EXPLAIN ANALYZE, so we can clear it
+ instance.getFragment().clearTypeProvider();
+ }
+ }
}
+
+ return immediateFuture(new FragInstanceDispatchResult(true));
+ } finally {
+ long queryDispatchReadTime = System.nanoTime() - startTime;
+ QUERY_EXECUTION_METRIC_SET.recordExecutionCost(DISPATCH_READ, queryDispatchReadTime);
+ queryContext.recordDispatchCost(queryDispatchReadTime);
}
- return immediateFuture(new FragInstanceDispatchResult(true));
}
private Future<FragInstanceDispatchResult> dispatchWriteSync(List<FragmentInstance> instances) {