Try Fix Exception Unstable
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java index e28ddb4..a5cbeba 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/exchange/SharedTsBlockQueue.java
@@ -82,6 +82,8 @@ private long maxBytesCanReserve = IoTDBDescriptor.getInstance().getMemoryConfig().getMaxBytesPerFragmentInstance(); + private Throwable abortedCause = null; + // used for SharedTsBlockQueue listener private final ExecutorService executorService; @@ -179,6 +181,9 @@ public TsBlock remove() { if (closed) { // try throw underlying exception instead of "Source handle is aborted." + if (abortedCause != null) { + throw new IllegalStateException(abortedCause); + } try { blocked.get(); } catch (InterruptedException e) { @@ -342,6 +347,7 @@ if (closed) { return; } + abortedCause = t; closed = true; if (!blocked.isDone()) { blocked.setException(t);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java index f5ac1e34..e1bc7c9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java
@@ -322,23 +322,6 @@ .collect(Collectors.toList()); } - public Optional<TSStatus> getErrorCode() { - return stateMachine.getFailureCauses().stream() - .filter(e -> e instanceof IoTDBException || e instanceof IoTDBRuntimeException) - .findFirst() - .flatMap( - t -> { - TSStatus status; - if (t instanceof IoTDBException) { - status = new TSStatus(((IoTDBException) t).getErrorCode()); - } else { - status = new TSStatus(((IoTDBRuntimeException) t).getErrorCode()); - } - status.setMessage(t.getMessage()); - return Optional.of(status); - }); - } - public void finished() { stateMachine.finished(); } @@ -395,6 +378,8 @@ } else if (failure instanceof IoTDBRuntimeException) { status = new TSStatus(((IoTDBRuntimeException) failure).getErrorCode()); status.setMessage(failure.getMessage()); + } else { + LOGGER.warn("[Unknown exception]: ", failure); } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java index fbca6d8..2bef087 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java
@@ -117,23 +117,7 @@ } public FragmentInstanceInfo getInstanceInfo() { - return context - .getErrorCode() - .map( - s -> - new FragmentInstanceInfo( - stateMachine.getState(), - context.getEndTime(), - context.getFailedCause(), - context.getFailureInfoList(), - s)) - .orElseGet( - () -> - new FragmentInstanceInfo( - stateMachine.getState(), - context.getEndTime(), - context.getFailedCause(), - context.getFailureInfoList())); + return context.getInstanceInfo(); } public long getStartTime() {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java index 1e13446..6cf1d87 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java
@@ -19,7 +19,6 @@ package org.apache.iotdb.db.queryengine.execution.fragment; -import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.commons.concurrent.IoTDBThreadPoolFactory; import org.apache.iotdb.commons.concurrent.ThreadName; import org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil; @@ -52,7 +51,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; @@ -391,23 +389,7 @@ private FragmentInstanceInfo createFailedInstanceInfo(FragmentInstanceId instanceId) { FragmentInstanceContext context = instanceContext.get(instanceId); - Optional<TSStatus> errorCode = context.getErrorCode(); - return errorCode - .map( - tsStatus -> - new FragmentInstanceInfo( - FragmentInstanceState.FAILED, - context.getEndTime(), - context.getFailedCause(), - context.getFailureInfoList(), - tsStatus)) - .orElseGet( - () -> - new FragmentInstanceInfo( - FragmentInstanceState.FAILED, - context.getEndTime(), - context.getFailedCause(), - context.getFailureInfoList())); + return context.getInstanceInfo(); } private void removeOldInstances() {