This is an automated email from the ASF dual-hosted git repository. rong pushed a commit to branch iotdb-5869 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 7881a62ac37cd800cb77b4d0def15c3a82b94523 Author: yschengzi <[email protected]> AuthorDate: Fri May 19 21:21:35 2023 +0800 [IOTDB-5901][To rel/1.1] Load: load tsfile without data will throw NPE (#9894) --- .../java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java | 18 ++++++++++++++++++ .../planner/plan/node/load/LoadSingleTsFileNode.java | 4 ++++ .../mpp/plan/scheduler/load/LoadTsFileScheduler.java | 8 +++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java index 200f7ca8ba4..5fb44b58a41 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java @@ -25,6 +25,7 @@ import org.apache.iotdb.it.framework.IoTDBTestRunner; import org.apache.iotdb.it.utils.TsFileGenerator; import org.apache.iotdb.itbase.category.ClusterIT; import org.apache.iotdb.itbase.category.LocalStandaloneIT; +import org.apache.iotdb.jdbc.IoTDBSQLException; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding; import org.apache.iotdb.tsfile.read.common.Path; @@ -132,6 +133,8 @@ public class IOTDBLoadTsFileIT { statement.execute(String.format("delete database %s", SchemaConfig.STORAGE_GROUP_0)); statement.execute(String.format("delete database %s", SchemaConfig.STORAGE_GROUP_1)); + } catch (IoTDBSQLException e) { + LOGGER.info(String.format("delete storage group message : %s", e.getMessage())); } } @@ -565,6 +568,21 @@ public class IOTDBLoadTsFileIT { } } + @Test + public void testLoadWithEmptyTsFile() throws Exception { + try (TsFileGenerator generator = new TsFileGenerator(new File(tmpDir, "1-0-0-0.tsfile"))) {} + + try (Connection connection = EnvFactory.getEnv().getConnection(); + Statement statement = connection.createStatement()) { + + statement.execute(String.format("load \"%s\"", tmpDir.getAbsolutePath())); + + try (ResultSet resultSet = statement.executeQuery("show timeseries")) { + Assert.assertFalse(resultSet.next()); + } + } + } + private static class SchemaConfig { private static final String STORAGE_GROUP_0 = "root.sg.test_0"; private static final String STORAGE_GROUP_1 = "root.sg.test_1"; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/load/LoadSingleTsFileNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/load/LoadSingleTsFileNode.java index fdc15a0320b..d68184b04d3 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/load/LoadSingleTsFileNode.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/load/LoadSingleTsFileNode.java @@ -69,6 +69,10 @@ public class LoadSingleTsFileNode extends WritePlanNode { this.deleteAfterLoad = deleteAfterLoad; } + public boolean isTsFileEmpty() { + return resource.getDevices().isEmpty(); + } + public boolean needDecodeTsFile( Function<List<Pair<String, TTimePartitionSlot>>, List<TRegionReplicaSet>> partitionFetcher) throws IOException { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/load/LoadTsFileScheduler.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/load/LoadTsFileScheduler.java index 435768c1d27..bf37b748587 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/load/LoadTsFileScheduler.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/scheduler/load/LoadTsFileScheduler.java @@ -135,7 +135,13 @@ public class LoadTsFileScheduler implements IScheduler { LoadSingleTsFileNode node = tsFileNodeList.get(i); boolean isLoadSingleTsFileSuccess = true; try { - if (!node.needDecodeTsFile( + if (node.isTsFileEmpty()) { + logger.info( + String.format( + "Load skip TsFile %s, because it has no data.", + node.getTsFileResource().getTsFilePath())); + + } else if (!node.needDecodeTsFile( partitionFetcher::queryDataPartition)) { // do not decode, load locally isLoadSingleTsFileSuccess = loadLocally(node); node.clean();
