Skip to content

Commit a2a03e8

Browse files
CaideyipiJackieTien97
authored andcommitted
[To dev/1.3] Fix pipe historical extraction when device metadata is unavailable (#18541) (#18548)
1 parent 98965cc commit a2a03e8

2 files changed

Lines changed: 33 additions & 2 deletions

File tree

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSource.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ private boolean mayTsFileResourceOverlappedWithPattern(final TsFileResource reso
512512
.getDeviceIsAlignedMapFromCache(resource.getTsFile(), false);
513513
deviceSet =
514514
Objects.nonNull(deviceIsAlignedMap) ? deviceIsAlignedMap.keySet() : resource.getDevices();
515-
} catch (final IOException e) {
515+
} catch (final IOException | RuntimeException e) {
516516
LOGGER.warn(
517517
"Pipe {}@{}: failed to get devices from TsFile {}, extract it anyway",
518518
pipeName,
@@ -545,7 +545,7 @@ private boolean isTsFileResourceCoveredByPattern(final TsFileResource resource)
545545
.getDeviceIsAlignedMapFromCache(resource.getTsFile(), false);
546546
deviceSet =
547547
Objects.nonNull(deviceIsAlignedMap) ? deviceIsAlignedMap.keySet() : resource.getDevices();
548-
} catch (final IOException e) {
548+
} catch (final IOException | RuntimeException e) {
549549
return false;
550550
}
551551

‎iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileSourceTest.java‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.iotdb.commons.utils.FileUtils;
3131
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
3232
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
33+
import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.FileTimeIndex;
3334
import org.apache.iotdb.pipe.api.customizer.parameter.PipeParameterValidator;
3435
import org.apache.iotdb.pipe.api.customizer.parameter.PipeParameters;
3536

@@ -143,6 +144,36 @@ public void testTsFileResourceCoveredByPattern() throws Exception {
143144
}
144145
}
145146

147+
@Test
148+
public void testMissingTsFileResourceDoesNotBlockHistoricalExtraction() throws Exception {
149+
final File tempDir = Files.createTempDirectory("pipeHistoricalMissingResource").toFile();
150+
151+
try {
152+
final PipeHistoricalDataRegionTsFileSource source =
153+
new PipeHistoricalDataRegionTsFileSource();
154+
final TsFileResource resource = createTsFileResource(tempDir, "missing-resource.tsfile");
155+
resource.setTimeIndex(new FileTimeIndex());
156+
157+
setPrivateField(source, "pipeName", "pipe");
158+
setPrivateField(source, "dataRegionId", 1);
159+
setPrivateField(source, "pipePattern", new PrefixPipePattern("root.**"));
160+
161+
final Method mayOverlapMethod =
162+
PipeHistoricalDataRegionTsFileSource.class.getDeclaredMethod(
163+
"mayTsFileResourceOverlappedWithPattern", TsFileResource.class);
164+
mayOverlapMethod.setAccessible(true);
165+
Assert.assertTrue((Boolean) mayOverlapMethod.invoke(source, resource));
166+
167+
final Method coveredMethod =
168+
PipeHistoricalDataRegionTsFileSource.class.getDeclaredMethod(
169+
"isTsFileResourceCoveredByPattern", TsFileResource.class);
170+
coveredMethod.setAccessible(true);
171+
Assert.assertFalse((Boolean) coveredMethod.invoke(source, resource));
172+
} finally {
173+
FileUtils.deleteFileOrDirectory(tempDir);
174+
}
175+
}
176+
146177
private static void assertMayTsFileContainUnprocessedData(
147178
final File tempDir,
148179
final String fileName,

0 commit comments

Comments
 (0)