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;