You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2021/05/05 16:41:10 UTC

[iotdb] 01/02: add clusterinfo test

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

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

commit 5568154f9c451f1f16935cccd818b34e24a4f716
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Thu May 6 00:34:36 2021 +0800

    add clusterinfo test
---
 .../java/org/apache/iotdb/cluster/ClusterMain.java | 12 +++-
 .../iotdb/cluster/server/MetaClusterServer.java    | 11 +++
 ...sterInfoService.java => ClusterInfoServer.java} | 10 +--
 .../server/clusterInfo/ClusterInfoServerMBean.java |  3 +
 .../server/clusterInfo/ClusterInfoServiceImpl.java |  2 +-
 .../server/clusterinfo/ClusterInfoServerTest.java  | 82 ++++++++++++++++++++++
 .../clusterinfo/ClusterInfoServiceImplTest.java    | 75 +++++++++++++++++---
 .../server/clusterinfo/ClusterInfoServiceTest.java | 44 ------------
 .../cluster/server/member/MetaGroupMemberTest.java |  5 +-
 .../iotdb/db/sql/{ClusterIT.java => Cases.java}    | 61 +---------------
 .../java/org/apache/iotdb/db/sql/ClusterIT.java    |  4 ++
 .../iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java   |  4 ++
 .../iotdb/db/sql/nodes5/FiveNodeCluster2IT.java    |  4 ++
 .../iotdb/db/sql/nodes5/FiveNodeCluster4IT.java    |  4 ++
 14 files changed, 200 insertions(+), 121 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
index eb91d0c..3518a8b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
@@ -29,7 +29,7 @@ import org.apache.iotdb.cluster.partition.slot.SlotStrategy;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.server.MetaClusterServer;
 import org.apache.iotdb.cluster.server.Response;
-import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoService;
+import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServer;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.db.conf.IoTDBConfigCheck;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 
+import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.thrift.TException;
 import org.apache.thrift.async.TAsyncClientManager;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
@@ -109,7 +110,7 @@ public class ClusterMain {
         metaServer.buildCluster();
         // Currently, we do not reigher ClusterInfoService as a JMX Bean,
         // so we use startService() rather than start()
-        ClusterInfoService.getInstance().startService();
+        ClusterInfoServer.getInstance().startService();
       } catch (TTransportException
           | StartupException
           | QueryProcessException
@@ -126,7 +127,7 @@ public class ClusterMain {
         metaServer.joinCluster();
         // Currently, we do not reigher ClusterInfoService as a JMX Bean,
         // so we use startService() rather than start()
-        ClusterInfoService.getInstance().startService();
+        ClusterInfoServer.getInstance().startService();
       } catch (TTransportException
           | StartupException
           | QueryProcessException
@@ -307,4 +308,9 @@ public class ClusterMain {
           }
         });
   }
+
+  @TestOnly
+  public static void setMetaClusterServer(MetaClusterServer metaClusterServer) {
+    metaServer = metaClusterServer;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
index 24331d7..61463a1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.service.RegisterManager;
+import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 
 import org.apache.thrift.TException;
@@ -356,4 +357,14 @@ public class MetaClusterServer extends RaftServer
   public void handshake(Node sender, AsyncMethodCallback<Void> resultHandler) {
     asyncService.handshake(sender, resultHandler);
   }
+
+  @TestOnly
+  public void setMetaGroupMember(MetaGroupMember metaGroupMember) {
+    this.member = metaGroupMember;
+  }
+
+  @TestOnly
+  public IoTDB getIoTDB() {
+    return ioTDB;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoService.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServer.java
similarity index 91%
rename from cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoService.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServer.java
index 1e84255..53dcb5e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoService.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServer.java
@@ -30,10 +30,10 @@ import org.apache.iotdb.db.service.ServiceType;
 import org.apache.iotdb.db.service.thrift.ThriftService;
 import org.apache.iotdb.db.service.thrift.ThriftServiceThread;
 
-public class ClusterInfoService extends ThriftService {
+public class ClusterInfoServer extends ThriftService implements ClusterInfoServerMBean {
   private ClusterInfoServiceImpl serviceImpl;
 
-  public static ClusterInfoService getInstance() {
+  public static ClusterInfoServer getInstance() {
     return ClusterMonitorServiceHolder.INSTANCE;
   }
 
@@ -64,7 +64,7 @@ public class ClusterInfoService extends ThriftService {
               getID().getName(),
               ThreadName.CLUSTER_INFO_SERVICE.getName(),
               nodeConfig.getRpcAddress(),
-              clusterConfig.getClusterRpcPort(),
+              clusterConfig.getClusterInfoRpcPort(),
               nodeConfig.getRpcMaxConcurrentClientNum(),
               nodeConfig.getThriftServerAwaitTimeForStopService(),
               new ClusterInfoServiceThriftHandler(serviceImpl),
@@ -82,12 +82,12 @@ public class ClusterInfoService extends ThriftService {
 
   @Override
   public int getBindPort() {
-    return ClusterDescriptor.getInstance().getConfig().getClusterRpcPort();
+    return ClusterDescriptor.getInstance().getConfig().getClusterInfoRpcPort();
   }
 
   private static class ClusterMonitorServiceHolder {
 
-    private static final ClusterInfoService INSTANCE = new ClusterInfoService();
+    private static final ClusterInfoServer INSTANCE = new ClusterInfoServer();
 
     private ClusterMonitorServiceHolder() {}
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServerMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServerMBean.java
new file mode 100644
index 0000000..aa3c00f
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServerMBean.java
@@ -0,0 +1,3 @@
+package org.apache.iotdb.cluster.server.clusterInfo;
+
+public interface ClusterInfoServerMBean {}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java
index 85974c8..b3e4908 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java
@@ -45,7 +45,7 @@ public class ClusterInfoServiceImpl implements ClusterInfoService.Iface {
     List<DataPartitionEntry> result = new ArrayList<>(partitions.size());
     partitions.forEach(
         (multikey, nodes) ->
-            result.add(new DataPartitionEntry(multikey.getKey(1), multikey.getKey(2), nodes)));
+            result.add(new DataPartitionEntry(multikey.getKey(0), multikey.getKey(1), nodes)));
     return result;
   }
 
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
new file mode 100644
index 0000000..c0574ea
--- /dev/null
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.server.clusterinfo;
+
+import org.apache.iotdb.cluster.config.ClusterDescriptor;
+import org.apache.iotdb.cluster.rpc.thrift.ClusterInfoService;
+import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServer;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.RpcTransportFactory;
+import org.apache.iotdb.service.rpc.thrift.TSIService;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TCompactProtocol;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ClusterInfoServerTest {
+  ClusterInfoServiceImplTest test;
+  ClusterInfoServer service;
+
+  @Before
+  public void setUp() throws Exception {
+    test = new ClusterInfoServiceImplTest();
+    test.setUp();
+    service = new ClusterInfoServer();
+    service.start();
+  }
+
+  @After
+  public void tearDown() throws MetadataException {
+    test.tearDown();
+    service.stop();
+  }
+
+  @Test
+  public void getID() {
+    System.out.println(service.getID());
+  }
+
+  @Test
+  public void testConnect() {
+    TTransport transport =
+        RpcTransportFactory.INSTANCE.getTransport(
+            new TSocket(
+                IoTDBDescriptor.getInstance().getConfig().getRpcAddress(),
+                ClusterDescriptor.getInstance().getConfig().getClusterRpcPort()));
+
+    try {
+      transport.open();
+    } catch (TTransportException e) {
+      Assert.fail(e.getMessage());
+    }
+    // connection success means OK.
+    ClusterInfoService.Client client =
+        new ClusterInfoService.Client(new TBinaryProtocol(transport));
+    Assert.assertNotNull(client);
+    // client's methods have been tested on ClusterInfoServiceImplTest
+    transport.close();
+  }
+}
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 f8170ba..63eacc3 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
@@ -19,33 +19,90 @@
 
 package org.apache.iotdb.cluster.server.clusterinfo;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.cluster.ClusterMain;
+import org.apache.iotdb.cluster.partition.PartitionTable;
+import org.apache.iotdb.cluster.rpc.thrift.DataPartitionEntry;
+import org.apache.iotdb.cluster.rpc.thrift.Node;
+import org.apache.iotdb.cluster.server.MetaClusterServer;
 import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServiceImpl;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 
+import org.apache.iotdb.cluster.server.member.MetaGroupMemberTest;
+import org.apache.iotdb.db.engine.StorageEngine;
+import org.apache.iotdb.db.exception.metadata.IllegalPathException;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.db.metadata.PartialPath;
+import org.apache.thrift.TException;
+import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.powermock.reflect.Whitebox;
 
 public class ClusterInfoServiceImplTest {
 
+  ClusterInfoServiceImpl impl;
+
   @Before
-  public void setUp() {
-    ClusterInfoServiceImpl impl = new ClusterInfoServiceImpl();
-    MetaGroupMember metaGroupMember = new MetaGroupMember();
-    metaGroupMember.buildCluster();
+  public void setUp() throws Exception {
+    MetaGroupMemberTest metaGroupMemberTest = new MetaGroupMemberTest();
+    // will create a cluster with 10 nodes, ip: 0,10,20,...100
+    metaGroupMemberTest.setUp();
+    MetaGroupMember metaGroupMember = metaGroupMemberTest.getTestMetaGroupMember();
+
+    MetaClusterServer metaClusterServer = new MetaClusterServer();
+    metaClusterServer.getMember().stop();
+    metaClusterServer.setMetaGroupMember(metaGroupMember);
+
+    ClusterMain.setMetaClusterServer(metaClusterServer);
+
+    metaClusterServer.getIoTDB().metaManager.setStorageGroup(new PartialPath("root", "sg"));
+    // metaClusterServer.getMember()
+    impl = new ClusterInfoServiceImpl();
+  }
+
+  @After
+  public void tearDown() throws MetadataException {
+    ClusterMain.getMetaServer()
+        .getIoTDB()
+        .metaManager
+        .deleteStorageGroups(Collections.singletonList(new PartialPath("root", "sg")));
+    ClusterMain.getMetaServer().stop();
   }
 
   @Test
-  public void getRing() {}
+  public void getRing() throws TException {
+    List<Node> nodes = impl.getRing();
+    Assert.assertEquals(10, nodes.size());
+  }
 
   @Test
-  public void getDataPartition() {}
+  public void getDataPartition() {
+    List<DataPartitionEntry> entries = impl.getDataPartition("root.sg", 0, 100);
+    Assert.assertEquals(1, entries.size());
+    List<Node> nodes = entries.get(0).getNodes();
+    Assert.assertEquals(50, nodes.get(0).getNodeIdentifier());
+    Assert.assertEquals(60, nodes.get(1).getNodeIdentifier());
+  }
 
   @Test
-  public void getMetaPartition() {}
+  public void getMetaPartition() throws TException {
+    List<Node> nodes = impl.getMetaPartition("root.sg");
+    Assert.assertEquals(50, nodes.get(0).getNodeIdentifier());
+    Assert.assertEquals(60, nodes.get(1).getNodeIdentifier());
+  }
 
   @Test
-  public void getAllNodeStatus() {}
+  public void getAllNodeStatus() throws TException {
+    // TODO need to use mode to test getAllNodeStatus
+  }
 
   @Test
-  public void getInstrumentingInfo() {}
+  public void getInstrumentingInfo() throws TException {
+    // hard to test the content of the instrumentInfo.
+    Assert.assertNotNull(impl.getInstrumentingInfo());
+  }
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceTest.java
deleted file mode 100644
index b51c2e0..0000000
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.iotdb.cluster.server.clusterinfo;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-public class ClusterInfoServiceTest {
-
-  @Test
-  public void getID() {}
-
-  @Test
-  public void getImplementation() {}
-
-  @Test
-  public void initTProcessor() {}
-
-  @Test
-  public void initThriftServiceThread() {}
-
-  @Test
-  public void getBindIP() {}
-
-  @Test
-  public void getBindPort() {}
-}
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 90cfeab..87cc093 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
@@ -187,7 +187,6 @@ public class MetaGroupMemberTest extends BaseMember {
     mockDataClusterServer = false;
     NodeStatusManager.getINSTANCE().setMetaGroupMember(testMetaMember);
     exiledNode = null;
-    System.out.println("Init term of metaGroupMember: " + testMetaMember.getTerm().get());
   }
 
   private DataGroupMember getDataGroupMember(PartitionGroup group, Node node) {
@@ -1370,4 +1369,8 @@ public class MetaGroupMemberTest extends BaseMember {
             });
     while (resultRef.get() == null) {}
   }
+
+  public MetaGroupMember getTestMetaGroupMember() {
+    return testMetaMember;
+  }
 }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
similarity index 61%
copy from testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
copy to testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
index ce6a681..4cae584 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
@@ -16,79 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.iotdb.db.sql;
 
-import org.apache.iotdb.jdbc.Config;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.DockerComposeContainer;
-
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.HashSet;
 import java.util.Set;
+import org.junit.Assert;
+import org.junit.Test;
 
-public abstract class ClusterIT {
-
-  private static Logger logger = LoggerFactory.getLogger(ClusterIT.class);
+public abstract class Cases {
 
   private Statement writeStatement;
   private Connection writeConnection;
   private Statement readStatement;
   private Connection readConnection;
 
-  protected int getWriteRpcPort() {
-    return getContainer().getServicePort("iotdb-server_1", 6667);
-  }
-
-  protected String getWriteRpcIp() {
-    return getContainer().getServiceHost("iotdb-server_1", 6667);
-  }
-
-  protected int getReadRpcPort() {
-    return getContainer().getServicePort("iotdb-server_1", 6667);
-  }
-
-  protected String getReadRpcIp() {
-    return getContainer().getServiceHost("iotdb-server_1", 6667);
-  }
-
-  protected void startCluster() {}
-
-  protected abstract DockerComposeContainer getContainer();
-
-  @Before
-  public void setUp() throws Exception {
-    startCluster();
-
-    Class.forName(Config.JDBC_DRIVER_NAME);
-    writeConnection =
-        DriverManager.getConnection(
-            "jdbc:iotdb://" + getWriteRpcIp() + ":" + getWriteRpcPort(), "root", "root");
-    writeStatement = writeConnection.createStatement();
-    readConnection =
-        DriverManager.getConnection(
-            "jdbc:iotdb://" + getReadRpcIp() + ":" + getReadRpcPort(), "root", "root");
-    readStatement = readConnection.createStatement();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    writeStatement.close();
-    writeConnection.close();
-    readStatement.close();
-    readConnection.close();
-  }
-
   @Test
   public void testSimplePutAndGet() throws SQLException {
 
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
index ce6a681..6dc6c76 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
@@ -46,6 +46,10 @@ public abstract class ClusterIT {
   private Statement readStatement;
   private Connection readConnection;
 
+  // "root.sg1" is a special storage for testing whether the read and write operations can be run
+  // correctly if the data is not on the connected node.
+  public String defaultSG = "root.sg1";
+
   protected int getWriteRpcPort() {
     return getContainer().getServicePort("iotdb-server_1", 6667);
   }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java
index 1a5134a..80ea301 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java
@@ -6,4 +6,8 @@ public class ThreeNodeCluster2IT extends AbstractThreeNodeClusterIT {
   protected String getWriteRpcIp() {
     return getContainer().getServiceHost("iotdb-server_2", 6667);
   }
+
+  protected int getWriteRpcPort() {
+    return getContainer().getServicePort("iotdb-server_2", 6667);
+  }
 }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java
index d3a0e70..555241a 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java
@@ -6,4 +6,8 @@ public class FiveNodeCluster2IT extends AbstractFiveNodeClusterIT {
   protected String getWriteRpcIp() {
     return getContainer().getServiceHost("iotdb-server_2", 6667);
   }
+
+  protected int getWriteRpcPort() {
+    return getContainer().getServicePort("iotdb-server_2", 6667);
+  }
 }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java
index d3cfd82..945a198 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java
@@ -6,4 +6,8 @@ public class FiveNodeCluster4IT extends AbstractFiveNodeClusterIT {
   protected String getWriteRpcIp() {
     return getContainer().getServiceHost("iotdb-server_4", 6667);
   }
+
+  protected int getWriteRpcPort() {
+    return getContainer().getServicePort("iotdb-server_4", 6667);
+  }
 }