From 653f8e8b87a178c77d93b5098f34d5c342e673b6 Mon Sep 17 00:00:00 2001 From: Jackie Tien Date: Fri, 21 Jan 2022 13:55:23 +0800 Subject: [PATCH] [IOTDB-2460] Fix NoSuchFileException while querying and ttl happened same time (#4937) --- .../db/engine/storagegroup/TsFileResource.java | 2 +- .../storagegroup/timeindex/DeviceTimeIndex.java | 3 ++- .../storagegroup/timeindex/FileTimeIndex.java | 13 ++++++++++++- .../engine/storagegroup/timeindex/ITimeIndex.java | 3 ++- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java index 1984f9495a..2efa04c2c9 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java @@ -434,7 +434,7 @@ public class TsFileResource { } public Set getDevices() { - return timeIndex.getDevices(file.getPath()); + return timeIndex.getDevices(file.getPath(), this); } public boolean endTimeEmpty() { diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/DeviceTimeIndex.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/DeviceTimeIndex.java index d7a7122fc8..ce65f62e97 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/DeviceTimeIndex.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/DeviceTimeIndex.java @@ -20,6 +20,7 @@ package org.apache.iotdb.db.engine.storagegroup.timeindex; import org.apache.iotdb.db.engine.StorageEngine; +import org.apache.iotdb.db.engine.storagegroup.TsFileResource; import org.apache.iotdb.db.exception.PartitionViolationException; import org.apache.iotdb.db.rescon.CachedStringPool; import org.apache.iotdb.db.utils.SerializeUtils; @@ -160,7 +161,7 @@ public class DeviceTimeIndex implements ITimeIndex { } @Override - public Set getDevices(String tsFilePath) { + public Set getDevices(String tsFilePath, TsFileResource tsFileResource) { return deviceToIndex.keySet(); } diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/FileTimeIndex.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/FileTimeIndex.java index 5defc50298..b0768be64b 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/FileTimeIndex.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/FileTimeIndex.java @@ -20,6 +20,7 @@ package org.apache.iotdb.db.engine.storagegroup.timeindex; import org.apache.iotdb.db.engine.StorageEngine; +import org.apache.iotdb.db.engine.storagegroup.TsFileResource; import org.apache.iotdb.db.exception.PartitionViolationException; import org.apache.iotdb.tsfile.read.TsFileSequenceReader; import org.apache.iotdb.tsfile.utils.FilePathUtils; @@ -33,6 +34,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; +import java.nio.file.NoSuchFileException; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -79,9 +82,17 @@ public class FileTimeIndex implements ITimeIndex { } @Override - public Set getDevices(String tsFilePath) { + public Set getDevices(String tsFilePath, TsFileResource tsFileResource) { try (TsFileSequenceReader fileReader = new TsFileSequenceReader(tsFilePath)) { return new HashSet<>(fileReader.getAllDevices()); + } catch (NoSuchFileException e) { + // deleted by ttl + if (tsFileResource.isDeleted()) { + return Collections.emptySet(); + } else { + logger.error("Can't read file {} from disk ", tsFilePath, e); + throw new RuntimeException("Can't read file " + tsFilePath + " from disk"); + } } catch (IOException e) { logger.error("Can't read file {} from disk ", tsFilePath, e); throw new RuntimeException("Can't read file " + tsFilePath + " from disk"); diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/ITimeIndex.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/ITimeIndex.java index 37fac06661..9252aa4ed7 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/ITimeIndex.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/ITimeIndex.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.engine.storagegroup.timeindex; +import org.apache.iotdb.db.engine.storagegroup.TsFileResource; import org.apache.iotdb.db.exception.PartitionViolationException; import java.io.IOException; @@ -62,7 +63,7 @@ public interface ITimeIndex { * * @return device names */ - Set getDevices(String tsFilePath); + Set getDevices(String tsFilePath, TsFileResource tsFileResource); /** @return whether end time is empty (Long.MIN_VALUE) */ boolean endTimeEmpty(); -- GitLab