You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/07/28 03:32:03 UTC

[iotdb] branch rel/0.13 updated: [To rel/0.13] [IOTDB-3943] Optimize session timeout feature (#6783)

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

haonan pushed a commit to branch rel/0.13
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.13 by this push:
     new a0ca9448be [To rel/0.13] [IOTDB-3943] Optimize session timeout feature (#6783)
a0ca9448be is described below

commit a0ca9448be3bb2a2c84463d416507ed132e8efec
Author: suchenglong <40...@qq.com>
AuthorDate: Thu Jul 28 11:31:58 2022 +0800

    [To rel/0.13] [IOTDB-3943] Optimize session timeout feature (#6783)
    
    Co-authored-by: Haonan <hh...@outlook.com>
---
 .../test/java/org/apache/iotdb/jdbc/UtilsTest.java |  11 ++
 .../db/query/control/SessionTimeoutManager.java    |   7 +
 .../iotdb/db/service/basic/ServiceProvider.java    |  18 +-
 .../service/thrift/impl/InfluxDBServiceImpl.java   |  26 ++-
 .../db/service/thrift/impl/TSServiceImpl.java      | 195 ++++++++++++---------
 .../main/java/org/apache/iotdb/rpc/RpcUtils.java   |   4 +
 .../apache/iotdb/rpc/SessionTimeoutException.java  |  43 +++++
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |   1 +
 .../apache/iotdb/session/SessionConnection.java    | 161 ++++++++++-------
 9 files changed, 311 insertions(+), 155 deletions(-)

diff --git a/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java b/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java
index a8ec17502d..1ab1a95d04 100644
--- a/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java
+++ b/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.jdbc;
 
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.SessionTimeoutException;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 
@@ -118,6 +119,16 @@ public class UtilsTest {
       fail();
     }
 
+    try {
+      TSStatus errorStatus = new TSStatus(TSStatusCode.SESSION_TIMEOUT.getStatusCode());
+      RpcUtils.verifySuccess(errorStatus);
+      fail();
+    } catch (SessionTimeoutException e) {
+      assertTrue(true);
+    } catch (Exception e) {
+      fail();
+    }
+
     try {
       TSStatus errorStatus = new TSStatus(TSStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
       RpcUtils.verifySuccess(errorStatus);
diff --git a/server/src/main/java/org/apache/iotdb/db/query/control/SessionTimeoutManager.java b/server/src/main/java/org/apache/iotdb/db/query/control/SessionTimeoutManager.java
index 8e907eeded..1f179c5e40 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/control/SessionTimeoutManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/control/SessionTimeoutManager.java
@@ -106,6 +106,13 @@ public class SessionTimeoutManager {
     return SessionTimeoutManagerHelper.INSTANCE;
   }
 
+  public boolean isSessionAlive(long sessionId) {
+    if (SESSION_TIMEOUT == 0) {
+      return true;
+    }
+    return sessionIdToLastActiveTime.containsKey(sessionId);
+  }
+
   private static class SessionTimeoutManagerHelper {
 
     private static final SessionTimeoutManager INSTANCE = new SessionTimeoutManager();
diff --git a/server/src/main/java/org/apache/iotdb/db/service/basic/ServiceProvider.java b/server/src/main/java/org/apache/iotdb/db/service/basic/ServiceProvider.java
index 987acbc6d7..b3e20c32f9 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/basic/ServiceProvider.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/basic/ServiceProvider.java
@@ -109,12 +109,26 @@ public abstract class ServiceProvider {
     boolean isLoggedIn = currSessionId != null && currSessionId == sessionId;
     if (!isLoggedIn) {
       LOGGER.info("{}: Not login. ", IoTDBConstant.GLOBAL_DB_NAME);
+      return false;
     } else {
       SessionTimeoutManager.getInstance().refresh(sessionId);
     }
     return isLoggedIn;
   }
 
+  /**
+   * Check whether current session is timeout.
+   *
+   * @param sessionId Session id.
+   * @return true: If session timeout; false: If not session timeout.
+   */
+  public boolean checkSessionTimeout(long sessionId) {
+    if (!SessionTimeoutManager.getInstance().isSessionAlive(sessionId)) {
+      return true;
+    }
+    return false;
+  }
+
   public boolean checkAuthorization(PhysicalPlan plan, String username) throws AuthException {
     if (!plan.isAuthenticationRequired()) {
       return true;
@@ -230,7 +244,9 @@ public abstract class ServiceProvider {
           TSStatusCode.NOT_LOGIN_ERROR,
           "Log in failed. Either you are not authorized or the session has timed out.");
     }
-
+    if (checkSessionTimeout(sessionId)) {
+      return RpcUtils.getStatus(TSStatusCode.SESSION_TIMEOUT, "Session timeout");
+    }
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "{}: receive close operation from Session {}",
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InfluxDBServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InfluxDBServiceImpl.java
index 9b97cf61f9..7febf56420 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InfluxDBServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InfluxDBServiceImpl.java
@@ -86,10 +86,10 @@ public class InfluxDBServiceImpl implements InfluxDBService.Iface {
 
   @Override
   public TSStatus writePoints(TSWritePointsReq req) {
-    if (!serviceProvider.checkLogin(req.sessionId)) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.sessionId);
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     List<TSStatus> tsStatusList = new ArrayList<>();
     int executeCode = TSStatusCode.SUCCESS_STATUS.getStatusCode();
     for (Point point :
@@ -114,10 +114,26 @@ public class InfluxDBServiceImpl implements InfluxDBService.Iface {
     return new TSStatus().setCode(executeCode).setSubStatus(tsStatusList);
   }
 
+  private boolean isStatusNotSuccess(TSStatus tsStatus) {
+    return tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode();
+  }
+
+  private TSStatus checkLoginStatus(long sessionId) {
+    if (!serviceProvider.checkLogin(sessionId)) {
+      return getNotLoggedInStatus();
+    }
+    if (serviceProvider.checkSessionTimeout(sessionId)) {
+      return RpcUtils.getInfluxDBStatus(
+          TSStatusCode.SESSION_TIMEOUT.getStatusCode(), "Session timeout");
+    }
+    return RpcUtils.getInfluxDBStatus(TSStatusCode.SUCCESS_STATUS);
+  }
+
   @Override
   public TSStatus createDatabase(TSCreateDatabaseReq req) throws TException {
-    if (!serviceProvider.checkLogin(req.sessionId)) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.sessionId);
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
     try {
       SetStorageGroupPlan setStorageGroupPlan =
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java
index 44a911f6cb..534ac9915b 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/TSServiceImpl.java
@@ -359,12 +359,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSFetchMetadataResp fetchMetadata(TSFetchMetadataReq req) {
     TSFetchMetadataResp resp = new TSFetchMetadataResp();
-
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return resp.setStatus(getNotLoggedInStatus());
+    TSStatus status = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(status)) {
+      return resp.setStatus(status);
     }
-
-    TSStatus status;
     try {
       switch (req.getType()) {
         case "METADATA_IN_JSON":
@@ -506,8 +504,9 @@ public class TSServiceImpl implements TSIService.Iface {
     long t1 = System.currentTimeMillis();
     List<TSStatus> result = new ArrayList<>();
     boolean isAllSuccessful = true;
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
 
     InsertRowsPlan insertRowsPlan;
@@ -612,8 +611,9 @@ public class TSServiceImpl implements TSIService.Iface {
   public TSExecuteStatementResp executeStatement(TSExecuteStatementReq req) {
     String statement = req.getStatement();
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus());
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return RpcUtils.getTSExecuteStatementResp(loginStatus);
       }
 
       long startTime = System.currentTimeMillis();
@@ -650,10 +650,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSExecuteStatementResp executeQueryStatement(TSExecuteStatementReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus());
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return RpcUtils.getTSExecuteStatementResp(loginStatus);
       }
-
       long startTime = System.currentTimeMillis();
       String statement = req.getStatement();
       PhysicalPlan physicalPlan =
@@ -686,10 +686,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSExecuteStatementResp executeRawDataQuery(TSRawDataQueryReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus());
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return RpcUtils.getTSExecuteStatementResp(loginStatus);
       }
-
       long startTime = System.currentTimeMillis();
       PhysicalPlan physicalPlan =
           serviceProvider
@@ -732,10 +732,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSExecuteStatementResp executeLastDataQuery(TSLastDataQueryReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus());
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return RpcUtils.getTSExecuteStatementResp(loginStatus);
       }
-
       long startTime = System.currentTimeMillis();
       PhysicalPlan physicalPlan =
           serviceProvider
@@ -962,7 +962,7 @@ public class TSServiceImpl implements TSIService.Iface {
           continue;
         }
         TSStatus executionStatus = insertTabletsInternally(insertTabletPlans, sessionId);
-        if (executionStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()
+        if (isStatusNotSuccess(executionStatus)
             && executionStatus.getCode() != TSStatusCode.NEED_REDIRECTION.getStatusCode()) {
           return RpcUtils.getTSExecuteStatementResp(executionStatus).setQueryId(queryId);
         }
@@ -1000,10 +1000,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSFetchResultsResp fetchResults(TSFetchResultsReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return RpcUtils.getTSFetchResultsResp(getNotLoggedInStatus());
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return RpcUtils.getTSFetchResultsResp(loginStatus);
       }
-
       if (!SESSION_MANAGER.hasDataset(req.queryId)) {
         return RpcUtils.getTSFetchResultsResp(
             RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, "Has not executed query"));
@@ -1066,10 +1066,10 @@ public class TSServiceImpl implements TSIService.Iface {
   /** update statement can be: 1. select-into statement 2. non-query statement */
   @Override
   public TSExecuteStatementResp executeUpdateStatement(TSExecuteStatementReq req) {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus());
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return RpcUtils.getTSExecuteStatementResp(loginStatus);
     }
-
     try {
       PhysicalPlan physicalPlan =
           serviceProvider
@@ -1186,10 +1186,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus insertRecords(TSInsertRecordsReq req) {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session {} insertRecords, first device {}, first time {}",
@@ -1235,6 +1235,22 @@ public class TSServiceImpl implements TSIService.Iface {
         allCheckSuccess, tsStatus, insertRowsPlan.getResults(), req.prefixPaths.size());
   }
 
+  /**
+   * Checking the Login Status.
+   *
+   * @param sessionId Session id.
+   * @return When not login or session timeout, will return error status.
+   */
+  private TSStatus checkLoginStatus(long sessionId) {
+    if (!serviceProvider.checkLogin(sessionId)) {
+      return getNotLoggedInStatus();
+    }
+    if (serviceProvider.checkSessionTimeout(sessionId)) {
+      return getSessionTimeoutStatus();
+    }
+    return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+  }
+
   private TSStatus judgeFinalTsStatus(
       boolean allCheckSuccess,
       TSStatus executeTsStatus,
@@ -1258,10 +1274,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus insertRecordsOfOneDevice(TSInsertRecordsOfOneDeviceReq req) {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session {} insertRecords, device {}, first time {}",
@@ -1304,10 +1320,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus insertStringRecordsOfOneDevice(TSInsertStringRecordsOfOneDeviceReq req) {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session {} insertRecords, device {}, first time {}",
@@ -1362,10 +1378,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus insertStringRecords(TSInsertStringRecordsReq req) {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session {} insertRecords, first device {}, first time {}",
@@ -1476,10 +1492,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus insertRecord(TSInsertRecordReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       AUDIT_LOGGER.debug(
           "Session {} insertRecord, device {}, time {}",
           SESSION_MANAGER.getCurrSessionId(),
@@ -1511,10 +1527,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus insertStringRecord(TSInsertStringRecordReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       AUDIT_LOGGER.debug(
           "Session {} insertRecord, device {}, time {}",
           SESSION_MANAGER.getCurrSessionId(),
@@ -1547,10 +1563,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus deleteData(TSDeleteDataReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       DeletePlan plan = new DeletePlan();
       plan.setDeleteStartTime(req.getStartTime());
       plan.setDeleteEndTime(req.getEndTime());
@@ -1574,10 +1590,10 @@ public class TSServiceImpl implements TSIService.Iface {
   public TSStatus insertTablet(TSInsertTabletReq req) {
     long t1 = System.currentTimeMillis();
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       InsertTabletPlan insertTabletPlan =
           new InsertTabletPlan(new PartialPath(req.getPrefixPath()), req.measurements);
       insertTabletPlan.setTimes(QueryDataSetUtils.readTimesFromBuffer(req.timestamps, req.size));
@@ -1610,10 +1626,10 @@ public class TSServiceImpl implements TSIService.Iface {
   public TSStatus insertTablets(TSInsertTabletsReq req) {
     long t1 = System.currentTimeMillis();
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       return insertTabletsInternally(req);
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_TABLETS, e.getErrorCode());
@@ -1670,8 +1686,9 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus setStorageGroup(long sessionId, String storageGroup) {
     try {
-      if (!serviceProvider.checkLogin(sessionId)) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(sessionId);
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
 
       SetStorageGroupPlan plan = new SetStorageGroupPlan(new PartialPath(storageGroup));
@@ -1689,8 +1706,9 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus deleteStorageGroups(long sessionId, List<String> storageGroups) {
     try {
-      if (!serviceProvider.checkLogin(sessionId)) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(sessionId);
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
 
       List<PartialPath> storageGroupList = new ArrayList<>();
@@ -1711,10 +1729,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus createTimeseries(TSCreateTimeseriesReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       if (AUDIT_LOGGER.isDebugEnabled()) {
         AUDIT_LOGGER.debug(
             "Session-{} create timeseries {}", SESSION_MANAGER.getCurrSessionId(), req.getPath());
@@ -1743,8 +1761,9 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus createAlignedTimeseries(TSCreateAlignedTimeseriesReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
 
       // if measurements.size() == 1, convert to create timeseries
@@ -1801,10 +1820,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus createMultiTimeseries(TSCreateMultiTimeseriesReq req) {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       if (AUDIT_LOGGER.isDebugEnabled()) {
         AUDIT_LOGGER.debug(
             "Session-{} create {} timeseries, the first is {}",
@@ -1888,8 +1907,9 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus deleteTimeseries(long sessionId, List<String> paths) {
     try {
-      if (!serviceProvider.checkLogin(sessionId)) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(sessionId);
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
 
       List<PartialPath> pathList = new ArrayList<>();
@@ -1915,10 +1935,10 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus createSchemaTemplate(TSCreateSchemaTemplateReq req) throws TException {
     try {
-      if (!serviceProvider.checkLogin(req.getSessionId())) {
-        return getNotLoggedInStatus();
+      TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+      if (isStatusNotSuccess(loginStatus)) {
+        return loginStatus;
       }
-
       if (AUDIT_LOGGER.isDebugEnabled()) {
         AUDIT_LOGGER.debug(
             "Session-{} create schema template {}",
@@ -2019,10 +2039,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus setSchemaTemplate(TSSetSchemaTemplateReq req) throws TException {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session-{} set device template {}.{}",
@@ -2042,10 +2062,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus unsetSchemaTemplate(TSUnsetSchemaTemplateReq req) throws TException {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session-{} unset schema template {}.{}",
@@ -2066,8 +2086,9 @@ public class TSServiceImpl implements TSIService.Iface {
   @Override
   public TSStatus unsetUsingTemplate(long sessionId, String templateName, String prefixPath)
       throws TException {
-    if (!serviceProvider.checkLogin(sessionId)) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(sessionId);
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
 
     if (AUDIT_LOGGER.isDebugEnabled()) {
@@ -2090,10 +2111,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus setUsingTemplate(TSSetUsingTemplateReq req) throws TException {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session-{} create timeseries of schema template on path {}",
@@ -2112,10 +2133,10 @@ public class TSServiceImpl implements TSIService.Iface {
 
   @Override
   public TSStatus dropSchemaTemplate(TSDropSchemaTemplateReq req) throws TException {
-    if (!serviceProvider.checkLogin(req.getSessionId())) {
-      return getNotLoggedInStatus();
+    TSStatus loginStatus = checkLoginStatus(req.getSessionId());
+    if (isStatusNotSuccess(loginStatus)) {
+      return loginStatus;
     }
-
     if (AUDIT_LOGGER.isDebugEnabled()) {
       AUDIT_LOGGER.debug(
           "Session-{} drop schema template {}.",
@@ -2128,6 +2149,14 @@ public class TSServiceImpl implements TSIService.Iface {
     return status != null ? status : executeNonQueryPlan(plan);
   }
 
+  private boolean isStatusNotSuccess(TSStatus tsStatus) {
+    return tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode();
+  }
+
+  private TSStatus getSessionTimeoutStatus() {
+    return RpcUtils.getStatus(TSStatusCode.SESSION_TIMEOUT, "Session timeout");
+  }
+
   @Override
   public TSStatus executeOperationSync(TSOperationSyncWriteReq req) {
     PhysicalPlan physicalPlan;
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
index b2943259d3..a43cf353d9 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
@@ -90,6 +90,10 @@ public class RpcUtils {
     if (status.getCode() == TSStatusCode.NEED_REDIRECTION.getStatusCode()) {
       return;
     }
+    if (status.getCode() == TSStatusCode.SESSION_TIMEOUT.getStatusCode()) {
+      throw new SessionTimeoutException(status);
+    }
+
     if (status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       throw new StatementExecutionException(status);
     }
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/SessionTimeoutException.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/SessionTimeoutException.java
new file mode 100644
index 0000000000..8c25d8bed7
--- /dev/null
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/SessionTimeoutException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.rpc;
+
+import org.apache.iotdb.service.rpc.thrift.TSStatus;
+
+public class SessionTimeoutException extends StatementExecutionException {
+  public SessionTimeoutException(TSStatus status) {
+    super(status);
+  }
+
+  public SessionTimeoutException(org.apache.iotdb.protocol.influxdb.rpc.thrift.TSStatus status) {
+    super(status);
+  }
+
+  public SessionTimeoutException(String reason) {
+    super(reason);
+  }
+
+  public SessionTimeoutException(Throwable cause) {
+    super(cause);
+  }
+
+  public SessionTimeoutException(String message, Throwable cause) {
+    super(message, cause);
+  }
+}
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
index ebc13545e9..0de8ca7779 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
@@ -74,6 +74,7 @@ public enum TSStatusCode {
   WRITE_PROCESS_ERROR(412),
   WRITE_PROCESS_REJECT(413),
   QUERY_ID_NOT_EXIST(414),
+  SESSION_TIMEOUT(415),
 
   UNSUPPORTED_INDEX_FUNC_ERROR(421),
   UNSUPPORTED_INDEX_TYPE_ERROR(422),
diff --git a/session/src/main/java/org/apache/iotdb/session/SessionConnection.java b/session/src/main/java/org/apache/iotdb/session/SessionConnection.java
index 5bfe101e69..06a960b21a 100644
--- a/session/src/main/java/org/apache/iotdb/session/SessionConnection.java
+++ b/session/src/main/java/org/apache/iotdb/session/SessionConnection.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.RedirectException;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.SessionTimeoutException;
 import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.EndPoint;
 import org.apache.iotdb.service.rpc.thrift.TSAppendSchemaTemplateReq;
@@ -231,11 +232,11 @@ public class SessionConnection {
   protected void setStorageGroup(String storageGroup)
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     try {
-      RpcUtils.verifySuccessWithRedirection(client.setStorageGroup(sessionId, storageGroup));
+      verifySuccessWithRedirectionWrapper(client.setStorageGroup(sessionId, storageGroup));
     } catch (TException e) {
       if (reconnect()) {
         try {
-          RpcUtils.verifySuccess(client.setStorageGroup(sessionId, storageGroup));
+          verifySuccessWrapper(client.setStorageGroup(sessionId, storageGroup));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -248,11 +249,11 @@ public class SessionConnection {
   protected void deleteStorageGroups(List<String> storageGroups)
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     try {
-      RpcUtils.verifySuccessWithRedirection(client.deleteStorageGroups(sessionId, storageGroups));
+      verifySuccessWithRedirectionWrapper(client.deleteStorageGroups(sessionId, storageGroups));
     } catch (TException e) {
       if (reconnect()) {
         try {
-          RpcUtils.verifySuccess(client.deleteStorageGroups(sessionId, storageGroups));
+          verifySuccessWrapper(client.deleteStorageGroups(sessionId, storageGroups));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -266,12 +267,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.createTimeseries(request));
+      verifySuccessWrapper(client.createTimeseries(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.createTimeseries(request));
+          verifySuccessWrapper(client.createTimeseries(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -285,12 +286,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.createAlignedTimeseries(request));
+      verifySuccessWrapper(client.createAlignedTimeseries(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.createAlignedTimeseries(request));
+          verifySuccessWrapper(client.createAlignedTimeseries(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -304,12 +305,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.createMultiTimeseries(request));
+      verifySuccessWrapper(client.createMultiTimeseries(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.createMultiTimeseries(request));
+          verifySuccessWrapper(client.createMultiTimeseries(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -345,7 +346,7 @@ public class SessionConnection {
     try {
       execReq.setEnableRedirectQuery(enableRedirect);
       execResp = client.executeQueryStatement(execReq);
-      RpcUtils.verifySuccessWithRedirection(execResp.getStatus());
+      verifySuccessWithRedirectionWrapper(execResp.getStatus());
     } catch (TException e) {
       if (reconnect()) {
         try {
@@ -381,13 +382,13 @@ public class SessionConnection {
     try {
       execReq.setEnableRedirectQuery(enableRedirect);
       TSExecuteStatementResp execResp = client.executeUpdateStatement(execReq);
-      RpcUtils.verifySuccess(execResp.getStatus());
+      verifySuccessWrapper(execResp.getStatus());
     } catch (TException e) {
       if (reconnect()) {
         try {
           execReq.setSessionId(sessionId);
           execReq.setStatementId(statementId);
-          RpcUtils.verifySuccess(client.executeUpdateStatement(execReq).status);
+          verifySuccessWrapper(client.executeUpdateStatement(execReq).status);
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -406,7 +407,7 @@ public class SessionConnection {
     try {
       execReq.setEnableRedirectQuery(enableRedirect);
       execResp = client.executeRawDataQuery(execReq);
-      RpcUtils.verifySuccessWithRedirection(execResp.getStatus());
+      verifySuccessWithRedirectionWrapper(execResp.getStatus());
     } catch (TException e) {
       if (reconnect()) {
         try {
@@ -444,7 +445,7 @@ public class SessionConnection {
     TSExecuteStatementResp tsExecuteStatementResp;
     try {
       tsExecuteStatementResp = client.executeLastDataQuery(tsLastDataQueryReq);
-      RpcUtils.verifySuccessWithRedirection(tsExecuteStatementResp.getStatus());
+      verifySuccessWithRedirectionWrapper(tsExecuteStatementResp.getStatus());
     } catch (TException e) {
       if (reconnect()) {
         try {
@@ -477,12 +478,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirection(client.insertRecord(request));
+      verifySuccessWithRedirectionWrapper(client.insertRecord(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertRecord(request));
+          verifySuccessWrapper(client.insertRecord(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -492,16 +493,44 @@ public class SessionConnection {
     }
   }
 
+  private void verifySuccessWrapper(TSStatus tsStatus)
+      throws StatementExecutionException, TException {
+    try {
+      RpcUtils.verifySuccess(tsStatus);
+    } catch (SessionTimeoutException e) {
+      throw new TException(e);
+    }
+  }
+
+  private void verifySuccessWithRedirectionWrapper(TSStatus tsStatus)
+      throws StatementExecutionException, RedirectException, TException {
+    try {
+      RpcUtils.verifySuccessWithRedirection(tsStatus);
+    } catch (SessionTimeoutException e) {
+      throw new TException(e);
+    }
+  }
+
+  private void verifySuccessWithRedirectionForMultiDevicesWrapper(
+      TSStatus tsStatus, List<String> prefixPaths)
+      throws StatementExecutionException, RedirectException, TException {
+    try {
+      RpcUtils.verifySuccessWithRedirectionForMultiDevices(tsStatus, prefixPaths);
+    } catch (SessionTimeoutException e) {
+      throw new TException(e);
+    }
+  }
+
   protected void insertRecord(TSInsertStringRecordReq request)
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirection(client.insertStringRecord(request));
+      verifySuccessWithRedirectionWrapper(client.insertStringRecord(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertStringRecord(request));
+          verifySuccessWrapper(client.insertStringRecord(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -515,13 +544,13 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirectionForMultiDevices(
+      verifySuccessWithRedirectionForMultiDevicesWrapper(
           client.insertRecords(request), request.getPrefixPaths());
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertRecords(request));
+          verifySuccessWrapper(client.insertRecords(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -535,13 +564,13 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirectionForMultiDevices(
+      verifySuccessWithRedirectionForMultiDevicesWrapper(
           client.insertStringRecords(request), request.getPrefixPaths());
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertStringRecords(request));
+          verifySuccessWrapper(client.insertStringRecords(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -555,12 +584,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirection(client.insertRecordsOfOneDevice(request));
+      verifySuccessWithRedirectionWrapper(client.insertRecordsOfOneDevice(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertRecordsOfOneDevice(request));
+          verifySuccessWrapper(client.insertRecordsOfOneDevice(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -574,12 +603,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirection(client.insertStringRecordsOfOneDevice(request));
+      verifySuccessWithRedirectionWrapper(client.insertStringRecordsOfOneDevice(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertStringRecordsOfOneDevice(request));
+          verifySuccessWrapper(client.insertStringRecordsOfOneDevice(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -593,12 +622,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirection(client.insertTablet(request));
+      verifySuccessWithRedirectionWrapper(client.insertTablet(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertTablet(request));
+          verifySuccessWrapper(client.insertTablet(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -612,13 +641,13 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirectionForMultiDevices(
+      verifySuccessWithRedirectionForMultiDevicesWrapper(
           client.insertTablets(request), request.getPrefixPaths());
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.insertTablets(request));
+          verifySuccessWrapper(client.insertTablets(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -631,11 +660,11 @@ public class SessionConnection {
   protected void deleteTimeseries(List<String> paths)
       throws IoTDBConnectionException, StatementExecutionException {
     try {
-      RpcUtils.verifySuccess(client.deleteTimeseries(sessionId, paths));
+      verifySuccessWrapper(client.deleteTimeseries(sessionId, paths));
     } catch (TException e) {
       if (reconnect()) {
         try {
-          RpcUtils.verifySuccess(client.deleteTimeseries(sessionId, paths));
+          verifySuccessWrapper(client.deleteTimeseries(sessionId, paths));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -649,12 +678,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.deleteData(request));
+      verifySuccessWrapper(client.deleteData(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.deleteData(request));
+          verifySuccessWrapper(client.deleteData(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -668,12 +697,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.testInsertStringRecord(request));
+      verifySuccessWrapper(client.testInsertStringRecord(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.testInsertStringRecord(request));
+          verifySuccessWrapper(client.testInsertStringRecord(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -687,12 +716,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.testInsertRecord(request));
+      verifySuccessWrapper(client.testInsertRecord(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.testInsertRecord(request));
+          verifySuccessWrapper(client.testInsertRecord(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -706,12 +735,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.testInsertStringRecords(request));
+      verifySuccessWrapper(client.testInsertStringRecords(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.testInsertStringRecords(request));
+          verifySuccessWrapper(client.testInsertStringRecords(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -725,12 +754,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.testInsertRecords(request));
+      verifySuccessWrapper(client.testInsertRecords(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.testInsertRecords(request));
+          verifySuccessWrapper(client.testInsertRecords(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -744,12 +773,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.testInsertTablet(request));
+      verifySuccessWrapper(client.testInsertTablet(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.testInsertTablet(request));
+          verifySuccessWrapper(client.testInsertTablet(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -763,12 +792,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.testInsertTablets(request));
+      verifySuccessWrapper(client.testInsertTablets(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.testInsertTablets(request));
+          verifySuccessWrapper(client.testInsertTablets(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -817,12 +846,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.createSchemaTemplate(request));
+      verifySuccessWrapper(client.createSchemaTemplate(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.createSchemaTemplate(request));
+          verifySuccessWrapper(client.createSchemaTemplate(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -836,12 +865,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.appendSchemaTemplate(request));
+      verifySuccessWrapper(client.appendSchemaTemplate(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.appendSchemaTemplate(request));
+          verifySuccessWrapper(client.appendSchemaTemplate(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -855,12 +884,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.pruneSchemaTemplate(request));
+      verifySuccessWrapper(client.pruneSchemaTemplate(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.pruneSchemaTemplate(request));
+          verifySuccessWrapper(client.pruneSchemaTemplate(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -875,7 +904,7 @@ public class SessionConnection {
     TSQueryTemplateResp execResp;
     try {
       execResp = client.querySchemaTemplate(req);
-      RpcUtils.verifySuccess(execResp.getStatus());
+      verifySuccessWrapper(execResp.getStatus());
     } catch (TException e) {
       if (reconnect()) {
         try {
@@ -896,12 +925,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.setSchemaTemplate(request));
+      verifySuccessWrapper(client.setSchemaTemplate(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.setSchemaTemplate(request));
+          verifySuccessWrapper(client.setSchemaTemplate(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -915,12 +944,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.unsetSchemaTemplate(request));
+      verifySuccessWrapper(client.unsetSchemaTemplate(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.unsetSchemaTemplate(request));
+          verifySuccessWrapper(client.unsetSchemaTemplate(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -934,12 +963,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.setUsingTemplate(request));
+      verifySuccessWrapper(client.setUsingTemplate(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.setUsingTemplate(request));
+          verifySuccessWrapper(client.setUsingTemplate(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -952,11 +981,11 @@ public class SessionConnection {
   protected void deactivateTemplate(String tName, String pPath)
       throws IoTDBConnectionException, StatementExecutionException {
     try {
-      RpcUtils.verifySuccess(client.unsetUsingTemplate(sessionId, tName, pPath));
+      verifySuccessWrapper(client.unsetUsingTemplate(sessionId, tName, pPath));
     } catch (TException e) {
       if (reconnect()) {
         try {
-          RpcUtils.verifySuccess(client.unsetUsingTemplate(sessionId, tName, pPath));
+          verifySuccessWrapper(client.unsetUsingTemplate(sessionId, tName, pPath));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -970,12 +999,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccess(client.dropSchemaTemplate(request));
+      verifySuccessWrapper(client.dropSchemaTemplate(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.dropSchemaTemplate(request));
+          verifySuccessWrapper(client.dropSchemaTemplate(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }
@@ -989,12 +1018,12 @@ public class SessionConnection {
       throws IoTDBConnectionException, StatementExecutionException, RedirectException {
     request.setSessionId(sessionId);
     try {
-      RpcUtils.verifySuccessWithRedirection(client.executeOperationSync(request));
+      verifySuccessWithRedirectionWrapper(client.executeOperationSync(request));
     } catch (TException e) {
       if (reconnect()) {
         try {
           request.setSessionId(sessionId);
-          RpcUtils.verifySuccess(client.executeOperationSync(request));
+          verifySuccessWrapper(client.executeOperationSync(request));
         } catch (TException tException) {
           throw new IoTDBConnectionException(tException);
         }