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:34 UTC

[iotdb] 01/01: fix ClientManager not closed

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