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

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


The following commit(s) were added to refs/heads/master by this push:
     new 63b70cb9ea1 Move IoTConsensus multi-data-dir region migration ITs to 
commit suite (#18081)
63b70cb9ea1 is described below

commit 63b70cb9ea1e9cf642e2191a096676088ac96d3e
Author: Hongzhi Gao <[email protected]>
AuthorDate: Tue Jul 7 12:23:33 2026 +0800

    Move IoTConsensus multi-data-dir region migration ITs to commit suite 
(#18081)
    
    * Move IoTConsensus multi-data-dir region migration ITs to commit suite
    
    * Fix multi-region migrate IT by colocating regions before migrate
    
    * Remove unreachable colocation branch in multi-region migrate IT
    
    The if-branch was dead code: if two regions already share a DataNode,
    hasDataNodeHostingMultipleRegions() returns early before extend runs.
---
 .../commit/IoTDBMigrateMultiRegionForIoTV1IT.java  | 66 ++++++++++++++++++++++
 ...TDBRegionMigrateWithDeletionMultiDataDirIT.java | 14 ++---
 ...gionMigrateWithDeletionMultiDataDirTableIT.java | 14 ++---
 .../RegionMigrateFileAssertions.java               |  2 +-
 4 files changed, 81 insertions(+), 15 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBMigrateMultiRegionForIoTV1IT.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBMigrateMultiRegionForIoTV1IT.java
index f02a4e7f7bc..da361b32a7c 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBMigrateMultiRegionForIoTV1IT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBMigrateMultiRegionForIoTV1IT.java
@@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory;
 
 import java.sql.Connection;
 import java.sql.Statement;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -51,6 +52,7 @@ import static 
org.apache.iotdb.util.MagicUtils.makeItCloseQuietly;
 @RunWith(IoTDBTestRunner.class)
 public class IoTDBMigrateMultiRegionForIoTV1IT extends 
IoTDBRegionOperationReliabilityITFramework {
   private static final String MULTI_REGION_MIGRATE_FORMAT = "migrate region %s 
from %d to %d";
+  private static final String EXPAND_FORMAT = "extend region %d to %d";
 
   private static final Logger LOGGER =
       LoggerFactory.getLogger(IoTDBMigrateMultiRegionForIoTV1IT.class);
@@ -90,6 +92,10 @@ public class IoTDBMigrateMultiRegionForIoTV1IT extends 
IoTDBRegionOperationRelia
       Map<Integer, Set<Integer>> regionMap = getAllRegionMap(statement);
       Set<Integer> allDataNodeId = getAllDataNodes(statement);
 
+      // INSERTION1 only creates one schema region and one data region; with 
replication factor 1
+      // they are often placed on different DataNodes. Colocate them before 
multi-region migrate.
+      regionMap = ensureDataNodeHostsMultipleRegions(statement, client, 
regionMap);
+
       // With replication factor 1 every region lives on exactly one DataNode. 
Pick a source
       // DataNode that hosts at least two regions, then migrate all its 
regions to a fresh
       // destination DataNode.
@@ -177,6 +183,66 @@ public class IoTDBMigrateMultiRegionForIoTV1IT extends 
IoTDBRegionOperationRelia
     }
   }
 
+  private Map<Integer, Set<Integer>> ensureDataNodeHostsMultipleRegions(
+      Statement statement,
+      SyncConfigNodeIServiceClient client,
+      Map<Integer, Set<Integer>> regionMap)
+      throws Exception {
+    if (hasDataNodeHostingMultipleRegions(regionMap)) {
+      return regionMap;
+    }
+    List<Integer> regionIds = new ArrayList<>(regionMap.keySet());
+    Assert.assertTrue("Need at least two regions to colocate", 
regionIds.size() >= 2);
+
+    int firstRegion = regionIds.get(0);
+    int secondRegion = regionIds.get(1);
+    int targetDataNode = regionMap.get(secondRegion).iterator().next();
+    regionGroupExpand(statement, client, firstRegion, targetDataNode);
+    return getAllRegionMap(statement);
+  }
+
+  private boolean hasDataNodeHostingMultipleRegions(Map<Integer, Set<Integer>> 
regionMap) {
+    return regionMap.values().stream()
+        .flatMap(Set::stream)
+        .collect(Collectors.groupingBy(dataNodeId -> dataNodeId, 
Collectors.counting()))
+        .values()
+        .stream()
+        .anyMatch(count -> count >= 2);
+  }
+
+  private void regionGroupExpand(
+      Statement statement,
+      SyncConfigNodeIServiceClient client,
+      int selectedRegion,
+      int targetDataNode)
+      throws Exception {
+    Awaitility.await()
+        .atMost(10, TimeUnit.SECONDS)
+        .pollInterval(1, TimeUnit.SECONDS)
+        .until(
+            () -> {
+              statement.execute(String.format(EXPAND_FORMAT, selectedRegion, 
targetDataNode));
+              return true;
+            });
+
+    Predicate<TShowRegionResp> expandRegionPredicate =
+        tShowRegionResp -> {
+          Map<Integer, Set<Integer>> newRegionMap =
+              getRunningRegionMap(tShowRegionResp.getRegionInfoList());
+          Set<Integer> dataNodes = newRegionMap.get(selectedRegion);
+          return dataNodes != null && dataNodes.contains(targetDataNode);
+        };
+
+    awaitUntilSuccess(
+        client,
+        selectedRegion,
+        expandRegionPredicate,
+        Optional.of(targetDataNode),
+        Optional.empty());
+
+    LOGGER.info("Region {} has expanded to DataNode {}", selectedRegion, 
targetDataNode);
+  }
+
   private int selectDataNodeHostingMultipleRegions(Map<Integer, Set<Integer>> 
regionMap) {
     Map<Integer, Long> regionCountPerDataNode =
         regionMap.values().stream()
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithDeletionMultiDataDirIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBRegionMigrateWithDeletionMultiDataDirIT.java
similarity index 93%
rename from 
integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithDeletionMultiDataDirIT.java
rename to 
integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBRegionMigrateWithDeletionMultiDataDirIT.java
index eabb11b3155..d5c3a1b9c47 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithDeletionMultiDataDirIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBRegionMigrateWithDeletionMultiDataDirIT.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1;
+package org.apache.iotdb.confignode.it.regionmigration.pass.commit;
 
 import org.apache.iotdb.consensus.ConsensusFactory;
 import org.apache.iotdb.it.env.EnvFactory;
@@ -43,12 +43,12 @@ import java.util.concurrent.TimeUnit;
 
 import static 
org.apache.iotdb.confignode.it.regionmigration.IoTDBRegionOperationReliabilityITFramework.getAllDataNodes;
 import static 
org.apache.iotdb.confignode.it.regionmigration.IoTDBRegionOperationReliabilityITFramework.getDataRegionMapWithLeader;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.MULTI_DATA_DIRS;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitModsVisibleOnReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitRegionReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitTsFileResourceVisibleOnReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitTsFileVisibleOnReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.getReplicaDataNodeIds;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.MULTI_DATA_DIRS;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitModsVisibleOnReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitRegionReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitTsFileResourceVisibleOnReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitTsFileVisibleOnReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.getReplicaDataNodeIds;
 
 /**
  * Tree-model coverage for IoTConsensus region migration over multiple data 
dirs: a deletion (mods)
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithDeletionMultiDataDirTableIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBRegionMigrateWithDeletionMultiDataDirTableIT.java
similarity index 93%
rename from 
integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithDeletionMultiDataDirTableIT.java
rename to 
integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBRegionMigrateWithDeletionMultiDataDirTableIT.java
index ee71d48fc66..8407d37d0f5 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithDeletionMultiDataDirTableIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/IoTDBRegionMigrateWithDeletionMultiDataDirTableIT.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1;
+package org.apache.iotdb.confignode.it.regionmigration.pass.commit;
 
 import org.apache.iotdb.consensus.ConsensusFactory;
 import org.apache.iotdb.isession.SessionConfig;
@@ -45,12 +45,12 @@ import java.util.concurrent.TimeUnit;
 
 import static 
org.apache.iotdb.confignode.it.regionmigration.IoTDBRegionOperationReliabilityITFramework.getAllDataNodes;
 import static 
org.apache.iotdb.confignode.it.regionmigration.IoTDBRegionOperationReliabilityITFramework.getDataRegionMapWithLeader;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.MULTI_DATA_DIRS;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitModsVisibleOnReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitRegionReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitTsFileResourceVisibleOnReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.awaitTsFileVisibleOnReplicas;
-import static 
org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1.RegionMigrateFileAssertions.getReplicaDataNodeIds;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.MULTI_DATA_DIRS;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitModsVisibleOnReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitRegionReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitTsFileResourceVisibleOnReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.awaitTsFileVisibleOnReplicas;
+import static 
org.apache.iotdb.confignode.it.regionmigration.pass.commit.RegionMigrateFileAssertions.getReplicaDataNodeIds;
 
 /**
  * Table-model twin of {@link IoTDBRegionMigrateWithDeletionMultiDataDirIT}: a 
deletion (mods) must
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/RegionMigrateFileAssertions.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/RegionMigrateFileAssertions.java
similarity index 98%
rename from 
integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/RegionMigrateFileAssertions.java
rename to 
integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/RegionMigrateFileAssertions.java
index 1cdf5981d34..0dff2731f42 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/RegionMigrateFileAssertions.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/RegionMigrateFileAssertions.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.confignode.it.regionmigration.pass.daily.iotv1;
+package org.apache.iotdb.confignode.it.regionmigration.pass.commit;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.env.cluster.node.DataNodeWrapper;

Reply via email to