This is an automated email from the ASF dual-hosted git repository.
Caideyipi pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/dev/1.3 by this push:
new e142ae4836a [To dev/1.3] Fix pipe historical extraction when device
metadata is unavailable (#18541) (#18548)
e142ae4836a is described below
commit e142ae4836ae09227137569c351ff5c73d6e7316
Author: Caideyipi <[email protected]>
AuthorDate: Mon Aug 31 17:08:21 2026 +0800
[To dev/1.3] Fix pipe historical extraction when device metadata is
unavailable (#18541) (#18548)
---
.../PipeHistoricalDataRegionTsFileSource.java | 4 +--
.../PipeHistoricalDataRegionTsFileSourceTest.java | 31 ++++++++++++++++++++++
2 files changed, 33 insertions(+), 2 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSource.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSource.java
index d0dd6549f07..1d984f9e18f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSource.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSource.java
@@ -691,7 +691,7 @@ public class PipeHistoricalDataRegionTsFileSource
implements PipeHistoricalDataR
.getDeviceIsAlignedMapFromCache(resource.getTsFile(), false);
deviceSet =
Objects.nonNull(deviceIsAlignedMap) ? deviceIsAlignedMap.keySet() :
resource.getDevices();
- } catch (final IOException e) {
+ } catch (final IOException | RuntimeException e) {
LOGGER.warn(
"Pipe {}@{}: failed to get devices from TsFile {}, extract it
anyway",
pipeName,
@@ -714,7 +714,7 @@ public class PipeHistoricalDataRegionTsFileSource
implements PipeHistoricalDataR
.getDeviceIsAlignedMapFromCache(resource.getTsFile(), false);
deviceSet =
Objects.nonNull(deviceIsAlignedMap) ? deviceIsAlignedMap.keySet() :
resource.getDevices();
- } catch (final IOException e) {
+ } catch (final IOException | RuntimeException e) {
return false;
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSourceTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSourceTest.java
index 61e55dc5cac..7562e54e581 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSourceTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSourceTest.java
@@ -34,6 +34,7 @@ import
org.apache.iotdb.commons.pipe.event.ProgressReportEvent;
import org.apache.iotdb.commons.utils.FileUtils;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
import
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
+import
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.FileTimeIndex;
import org.apache.iotdb.pipe.api.customizer.parameter.PipeParameterValidator;
import org.apache.iotdb.pipe.api.customizer.parameter.PipeParameters;
import org.apache.iotdb.pipe.api.event.Event;
@@ -412,6 +413,36 @@ public class PipeHistoricalDataRegionTsFileSourceTest {
}
}
+ @Test
+ public void testMissingTsFileResourceDoesNotBlockHistoricalExtraction()
throws Exception {
+ final File tempDir =
Files.createTempDirectory("pipeHistoricalMissingResource").toFile();
+
+ try {
+ final PipeHistoricalDataRegionTsFileSource source =
+ new PipeHistoricalDataRegionTsFileSource();
+ final TsFileResource resource = createTsFileResource(tempDir,
"missing-resource.tsfile");
+ resource.setTimeIndex(new FileTimeIndex());
+
+ setPrivateField(source, "pipeName", "pipe");
+ setPrivateField(source, "dataRegionId", 1);
+ setPrivateField(source, "pipePattern", new PrefixPipePattern("root.**"));
+
+ final Method mayOverlapMethod =
+ PipeHistoricalDataRegionTsFileSource.class.getDeclaredMethod(
+ "mayTsFileResourceOverlappedWithPattern", TsFileResource.class);
+ mayOverlapMethod.setAccessible(true);
+ Assert.assertTrue((Boolean) mayOverlapMethod.invoke(source, resource));
+
+ final Method coveredMethod =
+ PipeHistoricalDataRegionTsFileSource.class.getDeclaredMethod(
+ "isTsFileResourceCoveredByPattern", TsFileResource.class);
+ coveredMethod.setAccessible(true);
+ Assert.assertFalse((Boolean) coveredMethod.invoke(source, resource));
+ } finally {
+ FileUtils.deleteFileOrDirectory(tempDir);
+ }
+ }
+
private static void assertMayTsFileContainUnprocessedData(
final File tempDir,
final String fileName,