From 3a0f5facf48111f2272e68335d7173cb46baa7ca Mon Sep 17 00:00:00 2001 From: Di Wang Date: Fri, 6 Nov 2026 12:37:56 +0800 Subject: [PATCH] Retry inconsistent region metadata while waiting for migrations Treat transient cross-node SHOW REGIONS mismatches as unmet conditions in migration waits while preserving their deadlines and final assertions. --- .../pass/commit/RegionMigrateFileAssertions.java | 3 +++ .../stream/IoTDBRegionMigrateNormalForIoTV2StreamIT.java | 3 +++ .../daily/iotv1/IoTDBRegionMigrateWithCompressionRatioIT.java | 3 +++ .../daily/iotv1/IoTDBRegionMigrateWithLastEmptyDeletionIT.java | 3 +++ 4 files changed, 12 insertions(+) diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/RegionMigrateFileAssertions.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/RegionMigrateFileAssertions.java index 0dff2731f42d2..8b4909fd8b7b2 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/RegionMigrateFileAssertions.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/RegionMigrateFileAssertions.java @@ -21,6 +21,7 @@ import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.env.cluster.node.DataNodeWrapper; +import org.apache.iotdb.itbase.exception.InconsistentDataException; import org.awaitility.Awaitility; import org.junit.Assert; @@ -67,8 +68,10 @@ static void awaitModsVisibleOnReplicas( static void awaitRegionReplicas( Statement statement, int dataRegionId, Set expectedReplicaDataNodeIds) { + // Parallel SHOW REGIONS queries can observe different stages of the migration. Awaitility.await() .atMost(10, TimeUnit.MINUTES) + .ignoreException(InconsistentDataException.class) .pollDelay(1, TimeUnit.SECONDS) .pollInterval(2, TimeUnit.SECONDS) .untilAsserted( diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/stream/IoTDBRegionMigrateNormalForIoTV2StreamIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/stream/IoTDBRegionMigrateNormalForIoTV2StreamIT.java index 588ac0615e191..9edf9f5dbfdf9 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/stream/IoTDBRegionMigrateNormalForIoTV2StreamIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/commit/stream/IoTDBRegionMigrateNormalForIoTV2StreamIT.java @@ -27,6 +27,7 @@ import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.framework.IoTDBTestRunner; import org.apache.iotdb.itbase.category.ClusterIT; +import org.apache.iotdb.itbase.exception.InconsistentDataException; import org.apache.iotdb.rpc.TSStatusCode; import org.awaitility.Awaitility; @@ -115,8 +116,10 @@ public void migrationShouldPreserveOtherRegionFiles() throws Exception { Set expectedDataNodes = new HashSet<>(regionMap.get(selectedRegion)); expectedDataNodes.remove(source); expectedDataNodes.add(destination); + // Parallel SHOW REGIONS queries can observe different stages of the migration. Awaitility.await() .atMost(1, TimeUnit.MINUTES) + .ignoreException(InconsistentDataException.class) .untilAsserted( () -> Assert.assertEquals( diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithCompressionRatioIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithCompressionRatioIT.java index 1f4dff2b3d04d..dfa885d34a3e9 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithCompressionRatioIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithCompressionRatioIT.java @@ -23,6 +23,7 @@ import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.framework.IoTDBTestRunner; import org.apache.iotdb.itbase.category.DailyIT; +import org.apache.iotdb.itbase.exception.InconsistentDataException; import org.apache.tsfile.utils.Pair; import org.awaitility.Awaitility; @@ -112,8 +113,10 @@ public void testWithCompressionRatio() throws Exception { "migrate region %d from %d to %d", dataRegionIdForTest, leaderId, newLeaderId)); double finalCompressionRatioBeforeMigration = compressionRatioBeforeMigration[0]; + // Parallel SHOW REGIONS queries can observe different stages of the migration. Awaitility.await() .atMost(10, TimeUnit.MINUTES) + .ignoreException(InconsistentDataException.class) .pollDelay(1, TimeUnit.SECONDS) .untilAsserted( () -> { diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithLastEmptyDeletionIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithLastEmptyDeletionIT.java index 8a81e1ec4ad54..1a55c5aeed074 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithLastEmptyDeletionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/regionmigration/pass/daily/iotv1/IoTDBRegionMigrateWithLastEmptyDeletionIT.java @@ -23,6 +23,7 @@ import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.framework.IoTDBTestRunner; import org.apache.iotdb.itbase.category.DailyIT; +import org.apache.iotdb.itbase.exception.InconsistentDataException; import org.apache.tsfile.utils.Pair; import org.awaitility.Awaitility; @@ -90,8 +91,10 @@ public void testWithLastEmptyDeletion() throws Exception { String.format( "migrate region %d from %d to %d", dataRegionIdForTest, leaderId, newLeaderId)); + // Parallel SHOW REGIONS queries can observe different stages of the migration. Awaitility.await() .atMost(10, TimeUnit.MINUTES) + .ignoreException(InconsistentDataException.class) .pollDelay(1, TimeUnit.SECONDS) .until( () -> {