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,

Reply via email to