diff --git a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java index 54244ed08..85bea9c98 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java @@ -440,11 +440,7 @@ private void readChunkMetadataAndConstructIndexTree() throws IOException { // serialize the SEPARATOR of MetaData ReadWriteIOUtils.write(MetaMarker.SEPARATOR, out.wrapAsStream()); - TSMIterator tsmIterator = - hasChunkMetadataInDisk - ? TSMIterator.getTSMIteratorInDisk( - chunkMetadataTempFile, chunkGroupMetadataList, endPosInCMTForDevice) - : TSMIterator.getTSMIteratorInMemory(chunkGroupMetadataList); + TSMIterator tsmIterator = getTSMIterator(); Map deviceMetadataIndexMap = new TreeMap<>(); Queue measurementMetadataIndexQueue = new ArrayDeque<>(); IDeviceID currentDevice = null; @@ -532,6 +528,13 @@ private void readChunkMetadataAndConstructIndexTree() throws IOException { ReadWriteIOUtils.write(size, out.wrapAsStream()); } + protected TSMIterator getTSMIterator() throws IOException { + return hasChunkMetadataInDisk + ? TSMIterator.getTSMIteratorInDisk( + chunkMetadataTempFile, chunkGroupMetadataList, endPosInCMTForDevice) + : TSMIterator.getTSMIteratorInMemory(chunkGroupMetadataList); + } + /** * get the length of normal OutputStream. * diff --git a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/tsmiterator/DiskTSMIterator.java b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/tsmiterator/DiskTSMIterator.java index fd413b43a..44c596b1d 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/tsmiterator/DiskTSMIterator.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/tsmiterator/DiskTSMIterator.java @@ -28,6 +28,7 @@ import org.apache.tsfile.file.metadata.TimeseriesMetadata; import org.apache.tsfile.read.common.Path; import org.apache.tsfile.read.reader.LocalTsFileInput; +import org.apache.tsfile.read.reader.TsFileInput; import org.apache.tsfile.utils.Pair; import org.apache.tsfile.utils.ReadWriteIOUtils; @@ -51,8 +52,7 @@ public class DiskTSMIterator extends TSMIterator { private static final Logger LOG = LoggerFactory.getLogger(DiskTSMIterator.class); private LinkedList endPosForEachDevice; - private File cmtFile; - private LocalTsFileInput input; + protected TsFileInput input; private long fileLength = 0; private long currentPos = 0; private long nextEndPosForDevice = 0; @@ -65,7 +65,6 @@ protected DiskTSMIterator( LinkedList endPosForEachDevice) throws IOException { super(chunkGroupMetadataList); - this.cmtFile = cmtFile; this.endPosForEachDevice = endPosForEachDevice; this.input = new LocalTsFileInput(cmtFile.toPath()); this.fileLength = cmtFile.length(); @@ -78,22 +77,24 @@ public boolean hasNext() { } @Override - public Pair next() { + public Pair next() throws IOException { try { if (remainsInFile) { // deserialize from file - return getTimeSerisMetadataFromFile(); + return getTimeSeriesMetadataFromFile(); } else { // get from memory iterator return super.next(); } } catch (IOException e) { - LOG.error("Meets IOException when reading timeseries metadata from disk", e); - return null; + if (!Thread.currentThread().isInterrupted()) { + LOG.error("Meets IOException when reading timeseries metadata from disk", e); + } + throw e; } } - private Pair getTimeSerisMetadataFromFile() throws IOException { + private Pair getTimeSeriesMetadataFromFile() throws IOException { if (currentPos == nextEndPosForDevice) { // deserialize the current device name currentDevice = Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(input.wrapAsInputStream());