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

[iotdb] branch client_manager_add_close created (now 4171098)

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

jiangtian pushed a change to branch client_manager_add_close
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


      at 4171098  fix ClientManager not closed

This branch includes the following new commits:

     new 4171098  fix ClientManager not closed

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[iotdb] 01/01: fix ClientManager not closed

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch client_manager_add_close
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 4171098e1feb2e3e19e71d55fe3791e3eb53abe3
Author: jt <jt...@163.com>
AuthorDate: Wed Jan 5 14:41:32 2022 +0800

    fix ClientManager not closed
---
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     |   9 +
 .../apache/iotdb/cluster/client/BaseFactory.java   |  13 +
 .../apache/iotdb/cluster/client/ClientManager.java |  37 ++-
 .../iotdb/cluster/client/IClientManager.java       |   2 +
 .../cluster/client/async/AsyncDataClient.java      |   4 +
 .../iotdb/cluster/server/StoppedMemberManager.java |   7 +
 .../iotdb/cluster/server/member/RaftMember.java    |   5 +
 .../cluster/server/service/DataGroupEngine.java    |   2 +
 .../iotdb/cluster/client/ClientManagerTest.java    | 300 ++++++++++++---------
 .../cluster/client/ClientPoolFactoryTest.java      |   6 +-
 .../iotdb/cluster/client/MockClientManager.java    |   3 +
 .../cluster/client/async/AsyncDataClientTest.java  |   2 +
 .../iotdb/cluster/log/LogDispatcherTest.java       |   1 -
 .../cluster/log/applier/DataLogApplierTest.java    |   5 +-
 .../cluster/log/applier/MetaLogApplierTest.java    |   1 -
 .../iotdb/cluster/log/catchup/CatchUpTaskTest.java |   1 -
 .../cluster/log/catchup/LogCatchUpTaskTest.java    |   1 -
 .../log/catchup/SnapshotCatchUpTaskTest.java       |   1 -
 .../cluster/log/snapshot/DataSnapshotTest.java     |   2 -
 .../log/snapshot/MetaSimpleSnapshotTest.java       |   1 -
 .../cluster/log/snapshot/PullSnapshotTaskTest.java |   2 -
 .../query/ClusterAggregateExecutorTest.java        |   7 +
 .../query/fill/ClusterFillExecutorTest.java        |   7 +
 .../ClusterGroupByNoVFilterDataSetTest.java        |   7 +
 .../groupby/ClusterGroupByVFilterDataSetTest.java  |   7 +
 .../query/groupby/MergeGroupByExecutorTest.java    |   7 +
 .../query/groupby/RemoteGroupByExecutorTest.java   |   7 +
 .../query/last/ClusterLastQueryExecutorTest.java   |   7 +
 .../query/reader/ClusterReaderFactoryTest.java     |   7 +
 .../query/reader/ClusterTimeGeneratorTest.java     |   7 +
 .../cluster/query/reader/DatasourceInfoTest.java   |   3 +
 .../reader/RemoteSeriesReaderByTimestampTest.java  |   3 +
 .../query/reader/RemoteSimpleSeriesReaderTest.java |   3 +
 .../mult/AssignPathManagedMergeReaderTest.java     |   3 +
 .../reader/mult/RemoteMultSeriesReaderTest.java    |   6 +
 .../server/clusterinfo/ClusterInfoServerTest.java  |   2 +-
 .../clusterinfo/ClusterInfoServiceImplTest.java    |   6 +-
 .../caller/AppendGroupEntryHandlerTest.java        |   1 -
 .../caller/AppendNodeEntryHandlerTest.java         |   1 -
 .../handlers/caller/ElectionHandlerTest.java       |   1 -
 .../handlers/caller/HeartbeatHandlerTest.java      |   1 -
 .../handlers/caller/LogCatchUpHandlerTest.java     |   1 -
 .../server/heartbeat/DataHeartbeatThreadTest.java  |   2 +-
 .../server/heartbeat/HeartbeatThreadTest.java      |   1 -
 .../iotdb/cluster/server/member/BaseMember.java    |  16 +-
 .../cluster/server/member/DataGroupMemberTest.java |  11 +-
 .../cluster/server/member/MetaGroupMemberTest.java |  12 +-
 .../cluster/server/member/RaftMemberTest.java      |  15 ++
 48 files changed, 386 insertions(+), 170 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
index 0c53ebd..0104bc4 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
@@ -577,6 +577,9 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
     logger.info("ClusterIoTDB is deactivated.");
     // stop the iotdb kernel
     iotdb.stop();
+    if (clientManager != null) {
+      clientManager.close();
+    }
   }
 
   private void stopThreadPools() {
@@ -598,6 +601,9 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
 
   @TestOnly
   public void setClientManager(IClientManager clientManager) {
+    if (this.clientManager != null) {
+      this.clientManager.close();
+    }
     this.clientManager = clientManager;
   }
 
@@ -608,6 +614,9 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
 
   @TestOnly
   public void setDataGroupEngine(DataGroupEngine dataGroupEngine) {
+    if (this.dataGroupEngine != null) {
+      this.dataGroupEngine.stop();
+    }
     this.dataGroupEngine = dataGroupEngine;
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/BaseFactory.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/BaseFactory.java
index 1c60df6..c8992bb 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/BaseFactory.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/BaseFactory.java
@@ -51,4 +51,17 @@ public abstract class BaseFactory<K, T> implements KeyedPooledObjectFactory<K, T
 
   @Override
   public void passivateObject(K node, PooledObject<T> pooledObject) throws Exception {}
+
+  public void close() {
+    if (managers == null) {
+      return;
+    }
+    for (int i = 0; i < managers.length; i++) {
+      TAsyncClientManager manager = managers[i];
+      if (manager != null) {
+        manager.stop();
+        managers[i] = null;
+      }
+    }
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/ClientManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/ClientManager.java
index ae24a6d..adc1574 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/ClientManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/ClientManager.java
@@ -21,9 +21,12 @@ package org.apache.iotdb.cluster.client;
 
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService;
+import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
+import org.apache.iotdb.cluster.rpc.thrift.RaftService.Client;
 
 import com.google.common.collect.Maps;
 import org.apache.commons.pool2.KeyedObjectPool;
+import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,9 +45,12 @@ public class ClientManager implements IClientManager {
 
   private static final Logger logger = LoggerFactory.getLogger(ClientManager.class);
 
-  private Map<ClientCategory, KeyedObjectPool<Node, RaftService.AsyncClient>> asyncClientPoolMap;
-  private Map<ClientCategory, KeyedObjectPool<Node, RaftService.Client>> syncClientPoolMap;
-  private final ClientPoolFactory clientPoolFactory;
+  private Map<ClientCategory, GenericKeyedObjectPool<Node, RaftService.AsyncClient>>
+      asyncClientPoolMap;
+  private Map<ClientCategory, GenericKeyedObjectPool<Node, Client>> syncClientPoolMap;
+  private ClientPoolFactory clientPoolFactory;
+
+  private Exception createStack;
 
   /**
    * {@link ClientManager.Type#RequestForwardClient} represents the clients used to forward external
@@ -72,6 +78,8 @@ public class ClientManager implements IClientManager {
       syncClientPoolMap = Maps.newHashMap();
       constructSyncClientMap(type);
     }
+
+    this.createStack = new Exception();
   }
 
   private void constructAsyncClientMap(Type type) {
@@ -220,4 +228,27 @@ public class ClientManager implements IClientManager {
       }
     }
   }
+
+  @Override
+  public void close() {
+    if (false) {
+      return;
+    }
+    if (asyncClientPoolMap != null) {
+      for (GenericKeyedObjectPool<Node, AsyncClient> value : asyncClientPoolMap.values()) {
+        value.close();
+        ((BaseFactory) value.getFactory()).close();
+      }
+      asyncClientPoolMap.clear();
+    }
+
+    if (syncClientPoolMap != null) {
+      for (GenericKeyedObjectPool<Node, Client> value : syncClientPoolMap.values()) {
+        value.close();
+        ((BaseFactory) value.getFactory()).close();
+      }
+      syncClientPoolMap.clear();
+    }
+    clientPoolFactory = null;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/IClientManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/IClientManager.java
index 6652e0c..0c0eca1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/IClientManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/IClientManager.java
@@ -32,4 +32,6 @@ public interface IClientManager {
   void returnAsyncClient(RaftService.AsyncClient client, Node node, ClientCategory category);
 
   void returnSyncClient(RaftService.Client client, Node node, ClientCategory category);
+
+  void close();
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java
index cb9c798..df6d5ea 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java
@@ -147,13 +147,17 @@ public class AsyncDataClient extends TSDataService.AsyncClient {
 
   public static class AsyncDataClientFactory extends AsyncBaseFactory<Node, AsyncDataClient> {
 
+    Exception createStack;
+
     public AsyncDataClientFactory(TProtocolFactory protocolFactory, ClientCategory category) {
       super(protocolFactory, category);
+      createStack = new Exception();
     }
 
     public AsyncDataClientFactory(
         TProtocolFactory protocolFactory, ClientCategory category, IClientManager clientManager) {
       super(protocolFactory, category, clientManager);
+      createStack = new Exception();
     }
 
     @Override
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java
index c8efe39..d5ed278 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.cluster.server.member.DataGroupMember.Factory;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 
+import org.apache.iotdb.db.utils.TestOnly;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -64,6 +65,12 @@ public class StoppedMemberManager {
     recover();
   }
 
+  public void stop() {
+    for (DataGroupMember value : removedMemberMap.values()) {
+      value.stop();
+    }
+  }
+
   /**
    * When a DataGroupMember is removed, add it here and record this removal, so in next start-up we
    * can recover it as a data source for data transfers.
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
index 1e71fed..d74579c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
@@ -304,6 +304,10 @@ public abstract class RaftMember implements RaftMemberMBean {
   public void stop() {
     setSkipElection(true);
     closeLogManager();
+    if (clientManager != null) {
+      clientManager.close();
+    }
+
     if (heartBeatService == null) {
       return;
     }
@@ -342,6 +346,7 @@ public abstract class RaftMember implements RaftMemberMBean {
         logger.error("Unexpected interruption when waiting for commitLogPool to end", e);
       }
     }
+
     leader.set(ClusterConstant.EMPTY_NODE);
     catchUpService = null;
     heartBeatService = null;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupEngine.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupEngine.java
index 58593af..1a689c6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupEngine.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupEngine.java
@@ -108,6 +108,8 @@ public class DataGroupEngine implements IService, DataGroupEngineMBean {
     for (DataGroupMember member : headerGroupMap.values()) {
       member.stop();
     }
+    stoppedMemberManager.stop();
+    headerGroupMap.clear();
   }
 
   @Override
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientManagerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientManagerTest.java
index 19794ab..307d50c 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientManagerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientManagerTest.java
@@ -55,158 +55,192 @@ public class ClientManagerTest extends BaseClientTest {
     // ---------Sync cluster clients manager test------------
     ClientManager clusterManager =
         new ClientManager(false, ClientManager.Type.RequestForwardClient);
-    RaftService.Client syncClusterClient =
-        clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA);
-
-    Assert.assertNotNull(syncClusterClient);
-    Assert.assertTrue(syncClusterClient instanceof SyncDataClient);
-    Assert.assertEquals(((SyncDataClient) syncClusterClient).getNode(), defaultNode);
-    Assert.assertTrue(syncClusterClient.getInputProtocol().getTransport().isOpen());
-    ((SyncDataClient) syncClusterClient).returnSelf();
-
-    // cluster test
-    Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
-
-    Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    try {
+      RaftService.Client syncClusterClient =
+          clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA);
+
+      Assert.assertNotNull(syncClusterClient);
+      Assert.assertTrue(syncClusterClient instanceof SyncDataClient);
+      Assert.assertEquals(((SyncDataClient) syncClusterClient).getNode(), defaultNode);
+      Assert.assertTrue(syncClusterClient.getInputProtocol().getTransport().isOpen());
+      ((SyncDataClient) syncClusterClient).returnSelf();
+
+      // cluster test
+      Assert.assertNull(
+          clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(
+          clusterManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+
+      Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(
+          clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(
+          clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    } finally {
+      clusterManager.close();
+    }
 
     // ---------Sync meta(meta heartbeat) clients manager test------------
     ClientManager metaManager = new ClientManager(false, ClientManager.Type.MetaGroupClient);
-    RaftService.Client metaClient = metaManager.borrowSyncClient(defaultNode, ClientCategory.META);
-    Assert.assertNotNull(metaClient);
-    Assert.assertTrue(metaClient instanceof SyncMetaClient);
-    Assert.assertEquals(((SyncMetaClient) metaClient).getNode(), defaultNode);
-    Assert.assertTrue(metaClient.getInputProtocol().getTransport().isOpen());
-    ((SyncMetaClient) metaClient).returnSelf();
-
-    RaftService.Client metaHeartClient =
-        metaManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT);
-    Assert.assertNotNull(metaHeartClient);
-    Assert.assertTrue(metaHeartClient instanceof SyncMetaClient);
-    Assert.assertEquals(((SyncMetaClient) metaHeartClient).getNode(), defaultNode);
-    Assert.assertTrue(metaHeartClient.getInputProtocol().getTransport().isOpen());
-    ((SyncMetaClient) metaHeartClient).returnSelf();
-
-    // cluster test
-    Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-
-    Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    try {
+      RaftService.Client metaClient =
+          metaManager.borrowSyncClient(defaultNode, ClientCategory.META);
+      Assert.assertNotNull(metaClient);
+      Assert.assertTrue(metaClient instanceof SyncMetaClient);
+      Assert.assertEquals(((SyncMetaClient) metaClient).getNode(), defaultNode);
+      Assert.assertTrue(metaClient.getInputProtocol().getTransport().isOpen());
+      ((SyncMetaClient) metaClient).returnSelf();
+
+      RaftService.Client metaHeartClient =
+          metaManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT);
+      Assert.assertNotNull(metaHeartClient);
+      Assert.assertTrue(metaHeartClient instanceof SyncMetaClient);
+      Assert.assertEquals(((SyncMetaClient) metaHeartClient).getNode(), defaultNode);
+      Assert.assertTrue(metaHeartClient.getInputProtocol().getTransport().isOpen());
+      ((SyncMetaClient) metaHeartClient).returnSelf();
+
+      // cluster test
+      Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+
+      Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    } finally {
+      metaManager.close();
+    }
 
     // ---------Sync data(data heartbeat) clients manager test------------
     ClientManager dataManager = new ClientManager(false, ClientManager.Type.DataGroupClient);
 
-    RaftService.Client dataClient = dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA);
-    Assert.assertNotNull(dataClient);
-    Assert.assertTrue(dataClient instanceof SyncDataClient);
-    Assert.assertEquals(((SyncDataClient) dataClient).getNode(), defaultNode);
-    Assert.assertTrue(dataClient.getInputProtocol().getTransport().isOpen());
-    ((SyncDataClient) dataClient).returnSelf();
-
-    RaftService.Client dataHeartClient =
-        dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT);
-    Assert.assertNotNull(dataHeartClient);
-    Assert.assertTrue(dataHeartClient instanceof SyncDataClient);
-    Assert.assertEquals(((SyncDataClient) dataHeartClient).getNode(), defaultNode);
-    Assert.assertTrue(dataHeartClient.getInputProtocol().getTransport().isOpen());
-    ((SyncDataClient) dataHeartClient).returnSelf();
-
-    // cluster test
-    Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
-
-    Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    try {
+      RaftService.Client dataClient =
+          dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA);
+      Assert.assertNotNull(dataClient);
+      Assert.assertTrue(dataClient instanceof SyncDataClient);
+      Assert.assertEquals(((SyncDataClient) dataClient).getNode(), defaultNode);
+      Assert.assertTrue(dataClient.getInputProtocol().getTransport().isOpen());
+      ((SyncDataClient) dataClient).returnSelf();
+
+      RaftService.Client dataHeartClient =
+          dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT);
+      Assert.assertNotNull(dataHeartClient);
+      Assert.assertTrue(dataHeartClient instanceof SyncDataClient);
+      Assert.assertEquals(((SyncDataClient) dataHeartClient).getNode(), defaultNode);
+      Assert.assertTrue(dataHeartClient.getInputProtocol().getTransport().isOpen());
+      ((SyncDataClient) dataHeartClient).returnSelf();
+
+      // cluster test
+      Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+
+      Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    } finally {
+      dataManager.close();
+    }
   }
 
   @Test
   public void asyncClientManagersTest() throws Exception {
     // ---------async cluster clients manager test------------
     ClientManager clusterManager = new ClientManager(true, ClientManager.Type.RequestForwardClient);
-    RaftService.AsyncClient clusterClient =
-        clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA);
-
-    Assert.assertNotNull(clusterClient);
-    Assert.assertTrue(clusterClient instanceof AsyncDataClient);
-    Assert.assertEquals(((AsyncDataClient) clusterClient).getNode(), defaultNode);
-    Assert.assertTrue(((AsyncDataClient) clusterClient).isValid());
-    Assert.assertTrue(((AsyncDataClient) clusterClient).isReady());
-
-    Assert.assertNotSame(
-        clusterClient, clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
-
-    // cluster test
-    Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
-
-    Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    try {
+      RaftService.AsyncClient clusterClient =
+          clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA);
+
+      Assert.assertNotNull(clusterClient);
+      Assert.assertTrue(clusterClient instanceof AsyncDataClient);
+      Assert.assertEquals(((AsyncDataClient) clusterClient).getNode(), defaultNode);
+      Assert.assertTrue(((AsyncDataClient) clusterClient).isValid());
+      Assert.assertTrue(((AsyncDataClient) clusterClient).isReady());
+
+      Assert.assertNotSame(
+          clusterClient, clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
+
+      // cluster test
+      Assert.assertNull(
+          clusterManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(
+          clusterManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+
+      Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(
+          clusterManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(clusterManager.borrowSyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(
+          clusterManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    } finally {
+      clusterManager.close();
+    }
 
     // ---------async meta(meta heartbeat) clients manager test------------
     ClientManager metaManager = new ClientManager(true, ClientManager.Type.MetaGroupClient);
-    RaftService.AsyncClient metaClient =
-        metaManager.borrowAsyncClient(defaultNode, ClientCategory.META);
-    Assert.assertNotNull(metaClient);
-    Assert.assertTrue(metaClient instanceof AsyncMetaClient);
-    Assert.assertEquals(((AsyncMetaClient) metaClient).getNode(), defaultNode);
-    Assert.assertTrue(((AsyncMetaClient) metaClient).isValid());
-    Assert.assertTrue(((AsyncMetaClient) metaClient).isReady());
-
-    RaftService.AsyncClient metaHeartClient =
-        metaManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT);
-    Assert.assertNotNull(metaHeartClient);
-    Assert.assertTrue(metaHeartClient instanceof AsyncMetaClient);
-    Assert.assertEquals(((AsyncMetaClient) metaHeartClient).getNode(), defaultNode);
-    Assert.assertTrue(((AsyncMetaClient) metaHeartClient).isValid());
-    Assert.assertTrue(((AsyncMetaClient) metaHeartClient).isReady());
-
-    // cluster test
-    Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-
-    Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    try {
+      RaftService.AsyncClient metaClient =
+          metaManager.borrowAsyncClient(defaultNode, ClientCategory.META);
+      Assert.assertNotNull(metaClient);
+      Assert.assertTrue(metaClient instanceof AsyncMetaClient);
+      Assert.assertEquals(((AsyncMetaClient) metaClient).getNode(), defaultNode);
+      Assert.assertTrue(((AsyncMetaClient) metaClient).isValid());
+      Assert.assertTrue(((AsyncMetaClient) metaClient).isReady());
+
+      RaftService.AsyncClient metaHeartClient =
+          metaManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT);
+      Assert.assertNotNull(metaHeartClient);
+      Assert.assertTrue(metaHeartClient instanceof AsyncMetaClient);
+      Assert.assertEquals(((AsyncMetaClient) metaHeartClient).getNode(), defaultNode);
+      Assert.assertTrue(((AsyncMetaClient) metaHeartClient).isValid());
+      Assert.assertTrue(((AsyncMetaClient) metaHeartClient).isReady());
+
+      // cluster test
+      Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(metaManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+
+      Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(metaManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    } finally {
+      metaManager.close();
+    }
 
     // ---------async data(data heartbeat) clients manager test------------
     ClientManager dataManager = new ClientManager(true, ClientManager.Type.DataGroupClient);
 
-    RaftService.AsyncClient dataClient =
-        dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA);
-    Assert.assertNotNull(dataClient);
-    Assert.assertTrue(dataClient instanceof AsyncDataClient);
-    Assert.assertEquals(((AsyncDataClient) dataClient).getNode(), defaultNode);
-    Assert.assertTrue(((AsyncDataClient) dataClient).isValid());
-    Assert.assertTrue(((AsyncDataClient) dataClient).isReady());
-
-    RaftService.AsyncClient dataHeartClient =
-        dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT);
-    Assert.assertNotNull(dataHeartClient);
-    Assert.assertTrue(dataHeartClient instanceof AsyncDataClient);
-    Assert.assertEquals(((AsyncDataClient) dataHeartClient).getNode(), defaultNode);
-    Assert.assertTrue(((AsyncDataClient) dataHeartClient).isValid());
-    Assert.assertTrue(((AsyncDataClient) dataHeartClient).isReady());
-
-    // cluster test
-    Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
-
-    Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
-    Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
-    Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META));
-    Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    try {
+      RaftService.AsyncClient dataClient =
+          dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA);
+      Assert.assertNotNull(dataClient);
+      Assert.assertTrue(dataClient instanceof AsyncDataClient);
+      Assert.assertEquals(((AsyncDataClient) dataClient).getNode(), defaultNode);
+      Assert.assertTrue(((AsyncDataClient) dataClient).isValid());
+      Assert.assertTrue(((AsyncDataClient) dataClient).isReady());
+
+      RaftService.AsyncClient dataHeartClient =
+          dataManager.borrowAsyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT);
+      Assert.assertNotNull(dataHeartClient);
+      Assert.assertTrue(dataHeartClient instanceof AsyncDataClient);
+      Assert.assertEquals(((AsyncDataClient) dataHeartClient).getNode(), defaultNode);
+      Assert.assertTrue(((AsyncDataClient) dataHeartClient).isValid());
+      Assert.assertTrue(((AsyncDataClient) dataHeartClient).isReady());
+
+      // cluster test
+      Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(dataManager.borrowAsyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+
+      Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA));
+      Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.DATA_HEARTBEAT));
+      Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META));
+      Assert.assertNull(dataManager.borrowSyncClient(defaultNode, ClientCategory.META_HEARTBEAT));
+    } finally {
+      dataManager.close();
+    }
   }
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientPoolFactoryTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientPoolFactoryTest.java
index f1e313e..f0e5514 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientPoolFactoryTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/client/ClientPoolFactoryTest.java
@@ -46,7 +46,7 @@ import java.util.NoSuchElementException;
 public class ClientPoolFactoryTest {
   private ClusterConfig clusterConfig = ClusterDescriptor.getInstance().getConfig();
 
-  private long mockMaxWaitTimeoutMs = 10 * 1000L;
+  private long mockMaxWaitTimeoutMs = 1000L;
   private int mockMaxClientPerMember = 10;
 
   private int maxClientPerNodePerMember = clusterConfig.getMaxClientPerNodePerMember();
@@ -102,6 +102,7 @@ public class ClientPoolFactoryTest {
       Assert.assertTrue(e instanceof NoSuchElementException);
     } finally {
       Assert.assertTrue(System.currentTimeMillis() - timeStart + 10 > mockMaxWaitTimeoutMs);
+      ((BaseFactory) pool.getFactory()).close();
     }
   }
 
@@ -127,6 +128,7 @@ public class ClientPoolFactoryTest {
       Assert.assertNotNull(client);
       Assert.assertTrue(clientList.contains(client));
     }
+    ((BaseFactory) pool.getFactory()).close();
   }
 
   @Test
@@ -144,6 +146,7 @@ public class ClientPoolFactoryTest {
     asyncClient = pool.borrowObject(node);
     Assert.assertNotNull(asyncClient);
     Assert.assertTrue(asyncClient instanceof AsyncDataClient);
+    ((BaseFactory) pool.getFactory()).close();
   }
 
   @Test
@@ -161,6 +164,7 @@ public class ClientPoolFactoryTest {
     mockClientManager.setAsyncClient(asyncClient);
     Assert.assertNotNull(asyncClient);
     Assert.assertTrue(asyncClient instanceof AsyncMetaClient);
+    ((BaseFactory) pool.getFactory()).close();
   }
 
   @Test
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/client/MockClientManager.java b/cluster/src/test/java/org/apache/iotdb/cluster/client/MockClientManager.java
index c3153a1..4869ea8 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/client/MockClientManager.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/client/MockClientManager.java
@@ -44,4 +44,7 @@ public abstract class MockClientManager implements IClientManager {
   public RaftService.Client borrowSyncClient(Node node, ClientCategory category) {
     return null;
   }
+
+  @Override
+  public void close() {}
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java
index e9e1b1a..7ebbb4b 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java
@@ -47,6 +47,7 @@ public class AsyncDataClientTest extends BaseClientTest {
             + "dataPort:40010, clientPort:0, clientIp:localhost),port=40010}",
         dataClient.toString());
     assertCheck(dataClient);
+    factory.close();
   }
 
   @Test
@@ -62,6 +63,7 @@ public class AsyncDataClientTest extends BaseClientTest {
             + "dataPort:40010, clientPort:0, clientIp:localhost),port=40011}",
         dataClient.toString());
     assertCheck(dataClient);
+    factory.close();
   }
 
   private void assertCheck(AsyncDataClient dataClient) {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/LogDispatcherTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/LogDispatcherTest.java
index 7856f99..31f553f 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/LogDispatcherTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/LogDispatcherTest.java
@@ -263,7 +263,6 @@ public class LogDispatcherTest {
   @After
   public void tearDown() throws Exception {
     raftMember.stop();
-    raftMember.closeLogManager();
     EnvironmentUtils.cleanAllDir();
   }
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
index 55fb316..0292f54 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
@@ -186,6 +186,9 @@ public class DataLogApplierTest extends IoTDBTest {
         .setClientManager(
             new IClientManager() {
               @Override
+              public void close() {}
+
+              @Override
               public AsyncClient borrowAsyncClient(Node node, ClientCategory category) {
                 try {
                   AsyncDataClient dataClient =
@@ -285,9 +288,7 @@ public class DataLogApplierTest extends IoTDBTest {
   @After
   public void tearDown() throws IOException, StorageEngineException {
     testDataGroupMember.stop();
-    testDataGroupMember.closeLogManager();
     testMetaGroupMember.stop();
-    testMetaGroupMember.closeLogManager();
     super.tearDown();
     ClusterIoTDB.getInstance().setClientManager(clientManager);
     NodeStatusManager.getINSTANCE().setMetaGroupMember(null);
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/MetaLogApplierTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/MetaLogApplierTest.java
index 8d3ffe8..db5360f 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/MetaLogApplierTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/MetaLogApplierTest.java
@@ -76,7 +76,6 @@ public class MetaLogApplierTest extends IoTDBTest {
   @After
   public void tearDown() throws IOException, StorageEngineException {
     testMetaGroupMember.stop();
-    testMetaGroupMember.closeLogManager();
     super.tearDown();
   }
 
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/CatchUpTaskTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/CatchUpTaskTest.java
index 9517199..8bf604c 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/CatchUpTaskTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/CatchUpTaskTest.java
@@ -199,7 +199,6 @@ public class CatchUpTaskTest {
   public void tearDown() throws Exception {
     IoTDB.metaManager.clear();
     sender.stop();
-    sender.closeLogManager();
     EnvironmentUtils.cleanAllDir();
     ClusterDescriptor.getInstance().getConfig().setUseAsyncServer(prevUseAsyncServer);
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTaskTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTaskTest.java
index 3fb5d30..0b0abcf 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTaskTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTaskTest.java
@@ -162,7 +162,6 @@ public class LogCatchUpTaskTest {
   @After
   public void tearDown() throws Exception {
     sender.stop();
-    sender.closeLogManager();
     EnvironmentUtils.cleanAllDir();
     ClusterDescriptor.getInstance().getConfig().setUseAsyncServer(prevUseAsyncServer);
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/SnapshotCatchUpTaskTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/SnapshotCatchUpTaskTest.java
index 008c235..ea20d76 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/SnapshotCatchUpTaskTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/catchup/SnapshotCatchUpTaskTest.java
@@ -143,7 +143,6 @@ public class SnapshotCatchUpTaskTest {
   @After
   public void tearDown() throws Exception {
     sender.stop();
-    sender.closeLogManager();
     EnvironmentUtils.cleanAllDir();
     ClusterDescriptor.getInstance().getConfig().setUseAsyncServer(prevUseAsyncServer);
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/DataSnapshotTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/DataSnapshotTest.java
index 937a77a..68b6e76 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/DataSnapshotTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/DataSnapshotTest.java
@@ -187,8 +187,6 @@ public abstract class DataSnapshotTest {
   @After
   public void tearDown() throws Exception {
     config.setUseAsyncServer(isAsyncServer);
-    metaGroupMember.closeLogManager();
-    dataGroupMember.closeLogManager();
     metaGroupMember.stop();
     dataGroupMember.stop();
     EnvironmentUtils.cleanEnv();
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java
index 1c9956f..c0a7bb1 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java
@@ -79,7 +79,6 @@ public class MetaSimpleSnapshotTest extends IoTDBTest {
   @After
   public void tearDown() throws IOException, StorageEngineException {
     metaGroupMember.stop();
-    metaGroupMember.closeLogManager();
     super.tearDown();
   }
 
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/PullSnapshotTaskTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/PullSnapshotTaskTest.java
index aea2a58..a31f66d 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/PullSnapshotTaskTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/PullSnapshotTaskTest.java
@@ -324,8 +324,6 @@ public class PullSnapshotTaskTest extends DataSnapshotTest {
   @Override
   @After
   public void tearDown() throws Exception {
-    sourceMember.closeLogManager();
-    targetMember.closeLogManager();
     sourceMember.stop();
     targetMember.stop();
     super.tearDown();
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/ClusterAggregateExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/ClusterAggregateExecutorTest.java
index 9063699..a0e822b 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/ClusterAggregateExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/ClusterAggregateExecutorTest.java
@@ -39,6 +39,7 @@ import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.ValueFilter;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -54,6 +55,12 @@ public class ClusterAggregateExecutorTest extends BaseQueryTest {
 
   private ClusterAggregateExecutor executor;
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void testNoFilter()
       throws QueryProcessException, StorageEngineException, IOException, IllegalPathException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/fill/ClusterFillExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/fill/ClusterFillExecutorTest.java
index 93ae2fa..8d00649 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/fill/ClusterFillExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/fill/ClusterFillExecutorTest.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.query.executor.fill.ValueFill;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -47,6 +48,12 @@ import static org.junit.Assert.assertFalse;
 
 public class ClusterFillExecutorTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void testPreviousFill()
       throws QueryProcessException, StorageEngineException, IOException, IllegalPathException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByNoVFilterDataSetTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByNoVFilterDataSetTest.java
index fa89e9e..cf5fb07 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByNoVFilterDataSetTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByNoVFilterDataSetTest.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
 import org.apache.iotdb.tsfile.read.filter.GroupByFilter;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -45,6 +46,12 @@ import static org.junit.Assert.assertFalse;
 
 public class ClusterGroupByNoVFilterDataSetTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void test()
       throws StorageEngineException, IOException, QueryProcessException, IllegalPathException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByVFilterDataSetTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByVFilterDataSetTest.java
index 66938e0..81b1a4a 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByVFilterDataSetTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/ClusterGroupByVFilterDataSetTest.java
@@ -38,6 +38,7 @@ import org.apache.iotdb.tsfile.read.expression.impl.SingleSeriesExpression;
 import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.ValueFilter;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -48,6 +49,12 @@ import static org.junit.Assert.assertFalse;
 
 public class ClusterGroupByVFilterDataSetTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void test()
       throws IOException, StorageEngineException, QueryProcessException, IllegalPathException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/MergeGroupByExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/MergeGroupByExecutorTest.java
index ae4ab51..bbd3e9c 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/MergeGroupByExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/MergeGroupByExecutorTest.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -45,6 +46,12 @@ import java.util.Set;
 
 public class MergeGroupByExecutorTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void testNoTimeFilter()
       throws QueryProcessException, IOException, IllegalPathException, StorageEngineException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutorTest.java
index 2ce2e5e..67ed43b 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutorTest.java
@@ -38,6 +38,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -50,6 +51,12 @@ import static org.junit.Assert.assertTrue;
 
 public class RemoteGroupByExecutorTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void testNoTimeFilter()
       throws QueryProcessException, IOException, StorageEngineException, IllegalPathException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutorTest.java
index 5a71048..b996d3e 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutorTest.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
 import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -48,6 +49,12 @@ import static org.junit.Assert.assertTrue;
 
 public class ClusterLastQueryExecutorTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void testLastQueryTimeFilter()
       throws QueryProcessException, StorageEngineException, IOException, IllegalPathException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactoryTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactoryTest.java
index 85147bb..eb48d6f 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactoryTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactoryTest.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.db.metadata.path.PartialPath;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.query.reader.series.SeriesRawDataBatchReader;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -41,6 +42,12 @@ import static org.junit.Assert.assertNull;
 
 public class ClusterReaderFactoryTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void testTTL()
       throws StorageEngineException, MetadataException, QueryProcessException, IOException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterTimeGeneratorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterTimeGeneratorTest.java
index 3946631..4b250e9 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterTimeGeneratorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/ClusterTimeGeneratorTest.java
@@ -41,6 +41,7 @@ import org.apache.iotdb.tsfile.read.filter.ValueFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.operator.AndFilter;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -53,6 +54,12 @@ import static org.junit.Assert.assertTrue;
 
 public class ClusterTimeGeneratorTest extends BaseQueryTest {
 
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
   @Test
   public void test()
       throws StorageEngineException, IOException, IllegalPathException, QueryProcessException {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
index b066a21..e1bea55 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
@@ -57,6 +57,9 @@ public class DatasourceInfoTest {
         .setClientManager(
             new IClientManager() {
               @Override
+              public void close() {}
+
+              @Override
               public RaftService.AsyncClient borrowAsyncClient(Node node, ClientCategory category)
                   throws IOException {
                 return new AsyncDataClient(null, null, TestUtils.getNode(0), null) {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
index 25dc9f6..5b010e2 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
@@ -69,6 +69,9 @@ public class RemoteSeriesReaderByTimestampTest {
         .setClientManager(
             new IClientManager() {
               @Override
+              public void close() {}
+
+              @Override
               public RaftService.AsyncClient borrowAsyncClient(Node node, ClientCategory category)
                   throws IOException {
                 return new AsyncDataClient(null, null, node, ClientCategory.DATA) {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
index a9af2fb..8ba4021 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
@@ -123,6 +123,9 @@ public class RemoteSimpleSeriesReaderTest {
               }
 
               @Override
+              public void close() {}
+
+              @Override
               public RaftService.Client borrowSyncClient(Node node, ClientCategory category) {
                 return null;
               }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
index 1cce03c..4ee0965 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
@@ -184,6 +184,9 @@ public class AssignPathManagedMergeReaderTest {
               }
 
               @Override
+              public void close() {}
+
+              @Override
               public RaftService.Client borrowSyncClient(Node node, ClientCategory category) {
                 return null;
               }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
index 210d0db..9797c7c 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
@@ -252,6 +252,9 @@ public class RemoteMultSeriesReaderTest {
               }
 
               @Override
+              public void close() {}
+
+              @Override
               public RaftService.Client borrowSyncClient(Node node, ClientCategory category) {
                 return null;
               }
@@ -277,6 +280,9 @@ public class RemoteMultSeriesReaderTest {
               }
 
               @Override
+              public void close() {}
+
+              @Override
               public RaftService.Client borrowSyncClient(Node node, ClientCategory category)
                   throws IOException {
                 try {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
index b1aa89b..b3689fd 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
@@ -50,7 +50,7 @@ public class ClusterInfoServerTest {
   }
 
   @After
-  public void tearDown() throws MetadataException, IOException, StorageEngineException {
+  public void tearDown() throws Exception {
     test.tearDown();
     service.stop();
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
index be2ef05..cce2f05 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
@@ -42,10 +42,11 @@ import java.util.List;
 public class ClusterInfoServiceImplTest {
 
   ClusterInfoServiceImpl impl;
+  MetaGroupMemberTest metaGroupMemberTest;
 
   @Before
   public void setUp() throws Exception {
-    MetaGroupMemberTest metaGroupMemberTest = new MetaGroupMemberTest();
+    metaGroupMemberTest = new MetaGroupMemberTest();
     // will create a cluster with 10 nodes, ip: 0,10,20,...100
     metaGroupMemberTest.setUp();
     MetaGroupMember metaGroupMember = metaGroupMemberTest.getTestMetaGroupMember();
@@ -61,11 +62,12 @@ public class ClusterInfoServiceImplTest {
   }
 
   @After
-  public void tearDown() throws MetadataException, IOException, StorageEngineException {
+  public void tearDown() throws Exception {
     ClusterIoTDB.getInstance()
         .getIotdb()
         .metaManager
         .deleteStorageGroups(Collections.singletonList(new PartialPath("root", "sg")));
+    metaGroupMemberTest.tearDown();
     ClusterIoTDB.getInstance().getMetaGroupMember().stop();
     EnvironmentUtils.cleanEnv();
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
index e468560..c66c941 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
@@ -60,7 +60,6 @@ public class AppendGroupEntryHandlerTest {
   public void tearDown() throws IOException, StorageEngineException {
     ClusterDescriptor.getInstance().getConfig().setReplicationNum(prevReplicationNum);
     member.stop();
-    member.closeLogManager();
     EnvironmentUtils.cleanAllDir();
   }
 
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandlerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandlerTest.java
index 6ee92f5..6940fda 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandlerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandlerTest.java
@@ -55,7 +55,6 @@ public class AppendNodeEntryHandlerTest {
 
   @After
   public void tearDown() throws IOException, StorageEngineException {
-    member.closeLogManager();
     member.stop();
     EnvironmentUtils.cleanAllDir();
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/ElectionHandlerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/ElectionHandlerTest.java
index 184c98c..0354bc8 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/ElectionHandlerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/ElectionHandlerTest.java
@@ -50,7 +50,6 @@ public class ElectionHandlerTest {
 
   @After
   public void tearDown() throws IOException, StorageEngineException {
-    member.closeLogManager();
     member.stop();
     EnvironmentUtils.cleanAllDir();
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java
index d6b4ecf..cc533a9 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java
@@ -65,7 +65,6 @@ public class HeartbeatHandlerTest {
 
   @After
   public void tearDown() throws IOException, StorageEngineException {
-    metaGroupMember.closeLogManager();
     metaGroupMember.stop();
     EnvironmentUtils.cleanAllDir();
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/LogCatchUpHandlerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/LogCatchUpHandlerTest.java
index bf4c12b..2e73b14 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/LogCatchUpHandlerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/LogCatchUpHandlerTest.java
@@ -52,7 +52,6 @@ public class LogCatchUpHandlerTest {
 
   @After
   public void tearDown() throws IOException, StorageEngineException {
-    member.closeLogManager();
     member.stop();
     EnvironmentUtils.cleanAllDir();
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatThreadTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatThreadTest.java
index adb8a54..ee7950c 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatThreadTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatThreadTest.java
@@ -143,7 +143,7 @@ public class DataHeartbeatThreadTest extends HeartbeatThreadTest {
   public void tearDown() throws InterruptedException, IOException, StorageEngineException {
     dataLogManager.close();
     dataLogManager = null;
-    metaGroupMember.closeLogManager();
+    metaGroupMember.stop();
     metaGroupMember = null;
     File dir = new File(SyncLogDequeSerializer.getLogDir(2));
     for (File file : dir.listFiles()) {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java
index 31c014f..ede7d34 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java
@@ -169,7 +169,6 @@ public class HeartbeatThreadTest {
   @After
   public void tearDown() throws InterruptedException, IOException, StorageEngineException {
     logManager.close();
-    member.closeLogManager();
     member.stop();
     logManager = null;
     member = null;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
index a918a58..da3d6d8 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.ClientCategory;
 import org.apache.iotdb.cluster.client.ClientManager;
 import org.apache.iotdb.cluster.client.ClientManager.Type;
+import org.apache.iotdb.cluster.client.IClientManager;
 import org.apache.iotdb.cluster.common.TestAsyncDataClient;
 import org.apache.iotdb.cluster.common.TestAsyncMetaClient;
 import org.apache.iotdb.cluster.common.TestDataGroupMember;
@@ -100,6 +101,8 @@ public class BaseMember {
   private long heartBeatInterval;
   private long electionTimeout;
 
+  private IClientManager prevClientManager;
+
   @Before
   public void setUp() throws Exception, QueryProcessException {
     prevUseAsyncApplier = ClusterDescriptor.getInstance().getConfig().isUseAsyncApplier();
@@ -180,16 +183,22 @@ public class BaseMember {
   public void tearDown() throws Exception {
     testMetaMember.stop();
     metaLogManager.close();
+
     for (DataGroupMember member : dataGroupMemberMap.values()) {
       member.stop();
-      member.closeLogManager();
     }
     dataGroupMemberMap.clear();
     for (MetaGroupMember member : metaGroupMemberMap.values()) {
       member.stop();
-      member.closeLogManager();
     }
     metaGroupMemberMap.clear();
+
+    if (prevClientManager != null) {
+      ClusterIoTDB.getInstance().getClientManager().close();
+      ClusterIoTDB.getInstance().setClientManager(prevClientManager);
+      prevClientManager = null;
+    }
+
     RegisterManager.setDeregisterTimeOut(100);
     EnvironmentUtils.cleanEnv();
     ClusterDescriptor.getInstance().getConfig().setSeedNodeUrls(prevUrls);
@@ -312,7 +321,8 @@ public class BaseMember {
     ret.setLeader(node);
     ret.setCharacter(NodeCharacter.LEADER);
     ret.setAppendLogThreadPool(testThreadPool);
-    // TODO fixme : restore normal provider
+
+    prevClientManager = ClusterIoTDB.getInstance().getClientManager();
     ClusterIoTDB.getInstance()
         .setClientManager(
             new ClientManager(true, Type.RequestForwardClient) {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java
index cb8ae04..34c1458 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java
@@ -342,9 +342,9 @@ public class DataGroupMemberTest extends BaseMember {
       assertFalse(firstMember.addNode(newNodeAfterGroup, result));
       assertFalse(midMember.addNode(newNodeAfterGroup, result));
     } finally {
-      firstMember.closeLogManager();
-      midMember.closeLogManager();
-      lastMember.closeLogManager();
+      firstMember.stop();
+      midMember.stop();
+      lastMember.stop();
     }
   }
 
@@ -627,7 +627,6 @@ public class DataGroupMemberTest extends BaseMember {
             Collections.emptyMap(),
             Collections.emptyMap(),
             null);
-    testMetaMember = super.getMetaGroupMember(TestUtils.getNode(0));
     testMetaMember.setPartitionTable(partitionTable);
     dataGroupMember.setLogManager(
         getLogManager(
@@ -1206,7 +1205,7 @@ public class DataGroupMemberTest extends BaseMember {
         answers = new Object[] {15.0, 12.0, 180.0, 5.0, 19.0, 19.0, 5.0, 19.0, 5.0, 19.0};
         checkAggregates(answers, aggregateResults);
       } finally {
-        dataGroupMember.closeLogManager();
+        dataGroupMember.stop();
       }
 
       // get an executor from a node not holding this timeseries
@@ -1230,7 +1229,7 @@ public class DataGroupMemberTest extends BaseMember {
         byteBuffers = aggrResultRef.get();
         assertNull(byteBuffers);
       } finally {
-        dataGroupMember.closeLogManager();
+        dataGroupMember.stop();
       }
     } finally {
       QueryResourceManager.getInstance().endQuery(queryContext.getQueryId());
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
index 44b0538..736b269 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
@@ -220,6 +220,9 @@ public class MetaGroupMemberTest extends BaseMember {
               @Override
               public void returnSyncClient(
                   RaftService.Client client, Node node, ClientCategory category) {}
+
+              @Override
+              public void close() {}
             });
     testMetaMember.getThisNode().setNodeIdentifier(0);
     testMetaMember.setRouter(new ClusterPlanRouter(testMetaMember.getPartitionTable()));
@@ -724,7 +727,7 @@ public class MetaGroupMemberTest extends BaseMember {
     } catch (Exception e) {
       assertTrue(e instanceof StartUpCheckFailureException);
     } finally {
-      newMember.closeLogManager();
+      newMember.stop();
       ClusterConstant.setHeartbeatIntervalMs(prevInterval);
     }
   }
@@ -928,6 +931,9 @@ public class MetaGroupMemberTest extends BaseMember {
                 @Override
                 public void returnSyncClient(
                     RaftService.Client client, Node node, ClientCategory category) {}
+
+                @Override
+                public void close() {}
               });
       status = coordinator.executeNonQueryPlan(createTimeSeriesPlan);
       if (status.getCode() == TSStatusCode.NEED_REDIRECTION.getStatusCode()) {
@@ -937,6 +943,8 @@ public class MetaGroupMemberTest extends BaseMember {
       assertTrue(IoTDB.metaManager.isPathExist(new PartialPath(TestUtils.getTestSeries(i, 0))));
     }
     testThreadPool.shutdownNow();
+
+    testMetaMember2.stop();
   }
 
   @Test
@@ -1316,7 +1324,7 @@ public class MetaGroupMemberTest extends BaseMember {
     }
     MetaGroupMember metaGroupMember = getMetaGroupMember(new Node());
     assertEquals(100, metaGroupMember.getThisNode().getNodeIdentifier());
-    metaGroupMember.closeLogManager();
+    metaGroupMember.stop();
   }
 
   @Test
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/RaftMemberTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/RaftMemberTest.java
index b94da9e..fb0cab0 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/RaftMemberTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/RaftMemberTest.java
@@ -34,13 +34,28 @@ import org.apache.iotdb.cluster.rpc.thrift.RequestCommitIndexResponse;
 import org.apache.iotdb.cluster.server.NodeCharacter;
 import org.apache.iotdb.cluster.server.Response;
 
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
 import java.io.IOException;
 
 public class RaftMemberTest extends BaseMember {
+
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
+  @Override
+  @After
+  public void tearDown() throws Exception {
+    super.tearDown();
+  }
+
   @Test
   public void testsyncLeaderStrongConsistencyCheckFalse() {
     // 1. write request : Strong consistency level with syncLeader false