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

jackietien pushed a commit to branch ty/highAvailable
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 79623cae928a3e4070fb2c5f68bb5568d5e9e7bb
Author: JackieTien97 <[email protected]>
AuthorDate: Tue Nov 14 11:56:03 2023 +0800

    Support high available while meeting timeout exception
---
 .../db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java   | 8 +++++---
 .../main/java/org/apache/iotdb/db/service/IoTDBShutdownHook.java  | 3 +++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
index ed7601b0b3b..5312e2d7be9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
@@ -31,6 +31,7 @@ import org.apache.thrift.async.AsyncMethodCallback;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicLong;
 
 import static org.apache.iotdb.commons.client.ThriftClient.isConnectionBroken;
@@ -97,9 +98,10 @@ public class AsyncSendPlanNodeHandler implements 
AsyncMethodCallback<TSendBatchP
 
   private boolean needRetry(Exception e) {
     Throwable rootCause = ExceptionUtils.getRootCause(e);
-    // if the exception is SocketException and its error message is Broken 
pipe, it means that the
-    // remote node may go offline
-    return isConnectionBroken(rootCause);
+    // 1. connection broken it means that the remote node may go offline
+    // 2. or the method call is time out
+    // 3. or the target node is ReadOnly
+    return isConnectionBroken(rootCause) || (e instanceof TimeoutException);
   }
 
   private boolean needRetry(TSendSinglePlanNodeResp resp) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/IoTDBShutdownHook.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/IoTDBShutdownHook.java
index af5d90f5110..db520211787 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/IoTDBShutdownHook.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/IoTDBShutdownHook.java
@@ -55,6 +55,9 @@ public class IoTDBShutdownHook extends Thread {
 
   @Override
   public void run() {
+    // stop external rpc service firstly.
+    RPCService.getInstance().stop();
+
     // close rocksdb if possible to avoid lose data
     if 
(SchemaEngineMode.valueOf(CommonDescriptor.getInstance().getConfig().getSchemaEngineMode())
         .equals(SchemaEngineMode.Rocksdb_based)) {

Reply via email to