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

yongzao pushed a commit to branch ain-ci-env
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/ain-ci-env by this push:
     new c3d03768968 trigger CI
c3d03768968 is described below

commit c3d03768968b04d835bb5bcff0450546ff91fd8c
Author: Yongzao <[email protected]>
AuthorDate: Thu Jul 24 14:48:56 2025 +0800

    trigger CI
---
 .../org/apache/iotdb/it/env/cluster/env/AIEnv.java |  8 +++
 .../iotdb/ainode/it/AINodeClusterConfigIT.java     | 76 +++++++++++++++++++++-
 2 files changed, 81 insertions(+), 3 deletions(-)

diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AIEnv.java 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AIEnv.java
index 916a2ee8cf6..4c565e4ce26 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AIEnv.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AIEnv.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.it.env.cluster.env;
 
+import org.apache.iotdb.it.env.cluster.node.AINodeWrapper;
+
 public class AIEnv extends AbstractEnv {
   @Override
   public void initClusterEnvironment() {
@@ -35,4 +37,10 @@ public class AIEnv extends AbstractEnv {
       int configNodesNum, int dataNodesNum, int testWorkingRetryCount) {
     super.initEnvironment(configNodesNum, dataNodesNum, testWorkingRetryCount, 
true);
   }
+
+  public void stopAINode() {
+    for (AINodeWrapper aiNodeWrapper : this.aiNodeWrapperList) {
+      aiNodeWrapper.stop();
+    }
+  }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/ainode/it/AINodeClusterConfigIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/ainode/it/AINodeClusterConfigIT.java
index 2e62f618091..d2bf835aca3 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/ainode/it/AINodeClusterConfigIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/ainode/it/AINodeClusterConfigIT.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.ainode.it;
 
 import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.env.cluster.env.AIEnv;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.AIClusterIT;
 import org.apache.iotdb.itbase.env.BaseEnv;
@@ -36,9 +37,11 @@ import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.concurrent.TimeUnit;
 
 import static org.apache.iotdb.ainode.utils.AINodeTestUtils.checkHeader;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({AIClusterIT.class})
@@ -79,7 +82,6 @@ public class AINodeClusterConfigIT {
       checkHeader(resultSetMetaData, title);
       int count = 0;
       while (resultSet.next()) {
-        assertEquals("2", resultSet.getString(1));
         assertEquals("Running", resultSet.getString(2));
         count++;
       }
@@ -108,6 +110,74 @@ public class AINodeClusterConfigIT {
     Assert.fail("The target AINode is not removed successfully after all 
retries.");
   }
 
-  // TODO: We might need to add remove unknown test in the future, but current 
infrastructure is too
-  // hard to implement it.
+  @Test
+  public void aiNodeRegisterAndRemoveUnknownTestInTree() throws SQLException, 
InterruptedException {
+    try (Connection connection = 
EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT);
+        Statement statement = connection.createStatement()) {
+      aiNodeRegisterAndRemoveUnknownTest(statement);
+    }
+  }
+
+  @Test
+  public void aiNodeRegisterAndRemoveUnknownTestInTable()
+      throws SQLException, InterruptedException {
+    try (Connection connection = 
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        Statement statement = connection.createStatement()) {
+      aiNodeRegisterAndRemoveUnknownTest(statement);
+    }
+  }
+
+  private void aiNodeRegisterAndRemoveUnknownTest(Statement statement)
+      throws SQLException, InterruptedException {
+    String show_sql = "SHOW AINODES";
+    String title = "NodeID,Status,InternalAddress,InternalPort";
+    try (ResultSet resultSet = statement.executeQuery(show_sql)) {
+      ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+      checkHeader(resultSetMetaData, title);
+      int count = 0;
+      while (resultSet.next()) {
+        assertEquals("Running", resultSet.getString(2));
+        count++;
+      }
+      assertEquals(1, count);
+    }
+    // Stop AINode
+    ((AIEnv) EnvFactory.getEnv()).stopAINode();
+    boolean aiNodeStopped = false;
+    for (int retry = 0; retry < 500; retry++) {
+      try (ResultSet resultSet = statement.executeQuery(show_sql)) {
+        while (resultSet.next()) {
+          if ("Unknown".equals(resultSet.getString(2))) {
+            aiNodeStopped = true;
+          }
+        }
+      }
+      if (aiNodeStopped) {
+        break;
+      }
+      TimeUnit.SECONDS.sleep(1);
+    }
+    assertTrue(aiNodeStopped);
+    String remove_sql = "REMOVE AINODE";
+    statement.execute(remove_sql);
+    for (int retry = 0; retry < 500; retry++) {
+      try (ResultSet resultSet = statement.executeQuery(show_sql)) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        checkHeader(resultSetMetaData, title);
+        int count = 0;
+        while (resultSet.next()) {
+          count++;
+        }
+        if (count == 0) {
+          return; // Successfully removed the AI node
+        }
+      }
+      try {
+        Thread.sleep(1000); // Wait before retrying
+      } catch (InterruptedException e) {
+        Thread.currentThread().interrupt();
+      }
+    }
+    Assert.fail("The target AINode is not removed successfully after all 
retries.");
+  }
 }

Reply via email to