This is an automated email from the ASF dual-hosted git repository. haonan pushed a commit to branch fix_force_Append_Writer in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit a10e7729c3badaf732a92f09ffcb904f393d86a9 Author: HTHou <[email protected]> AuthorDate: Wed May 27 16:57:24 2020 +0800 fix ForceAppendTsFileWriter --- .../write/writer/ForceAppendTsFileWriter.java | 19 ++++++++++ .../write/writer/ForceAppendTsFileWriterTest.java | 41 ++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java index f23e99b..0938e0a 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java @@ -20,7 +20,12 @@ package org.apache.iotdb.tsfile.write.writer; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import org.apache.iotdb.tsfile.exception.write.TsFileNotCompleteException; +import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetadata; +import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata; import org.apache.iotdb.tsfile.read.TsFileSequenceReader; import org.slf4j.Logger; @@ -57,6 +62,20 @@ public class ForceAppendTsFileWriter extends TsFileIOWriter { TsFileMetadata tsFileMetadata = reader.readFileMetadata(); // truncate metadata and marker truncatePosition = tsFileMetadata.getMetaOffset(); + + canWrite = true; + versionInfo = tsFileMetadata.getVersionInfo(); + totalChunkNum = tsFileMetadata.getTotalChunkNum(); + invalidChunkNum = tsFileMetadata.getInvalidChunkNum(); + + List<String> devices = reader.getAllDevices(); + for (String device : devices) { + List<ChunkMetadata> chunkMetadataList = new ArrayList<>(); + reader.readChunkMetadataInDevice(device).values() + .forEach(list -> chunkMetadataList.addAll(list)); + ChunkGroupMetadata chunkGroupMetadata = new ChunkGroupMetadata(device, chunkMetadataList); + chunkGroupMetadataList.add(chunkGroupMetadata); + } } } diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java index 694d7c1..359da39 100644 --- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java +++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java @@ -19,15 +19,24 @@ package org.apache.iotdb.tsfile.write.writer; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.io.File; +import java.util.ArrayList; +import java.util.List; import org.apache.iotdb.tsfile.constant.TestConstant; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding; import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer; import org.apache.iotdb.tsfile.fileSystem.fsFactory.FSFactory; +import org.apache.iotdb.tsfile.read.ReadOnlyTsFile; +import org.apache.iotdb.tsfile.read.TsFileSequenceReader; import org.apache.iotdb.tsfile.read.common.Path; +import org.apache.iotdb.tsfile.read.common.RowRecord; +import org.apache.iotdb.tsfile.read.expression.QueryExpression; +import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet; import org.apache.iotdb.tsfile.write.TsFileWriter; import org.apache.iotdb.tsfile.write.record.TSRecord; import org.apache.iotdb.tsfile.write.record.datapoint.FloatDataPoint; @@ -56,6 +65,38 @@ public class ForceAppendTsFileWriterTest { writer.close(); ForceAppendTsFileWriter fwriter = new ForceAppendTsFileWriter(file); assertEquals(firstMetadataPosition, fwriter.getTruncatePosition()); + + // write more data into this TsFile + writer = new TsFileWriter(fwriter); + writer.registerTimeseries(new Path("d1.s1"), + new MeasurementSchema("s1", TSDataType.FLOAT, TSEncoding.RLE)); + writer.registerTimeseries(new Path("d1.s2"), + new MeasurementSchema("s2", TSDataType.FLOAT, TSEncoding.RLE)); + writer.write(new TSRecord(3, "d1").addTuple(new FloatDataPoint("s1", 5)) + .addTuple(new FloatDataPoint("s2", 4))); + writer.close(); + ReadOnlyTsFile readOnlyTsFile = new ReadOnlyTsFile(new TsFileSequenceReader(file.getPath())); + List<Path> pathList = new ArrayList<>(); + pathList.add(new Path("d1", "s1")); + pathList.add(new Path("d1", "s2")); + QueryExpression queryExpression = QueryExpression.create(pathList, null); + QueryDataSet dataSet = readOnlyTsFile.query(queryExpression); + RowRecord record = dataSet.next(); + assertEquals(1, record.getTimestamp()); + assertEquals(5.0f, record.getFields().get(0).getFloatV(), 0.001); + assertEquals(4.0f, record.getFields().get(1).getFloatV(), 0.001); + record = dataSet.next(); + assertEquals(2, record.getTimestamp()); + assertEquals(5.0f, record.getFields().get(0).getFloatV(), 0.001); + assertEquals(4.0f, record.getFields().get(1).getFloatV(), 0.001); + record = dataSet.next(); + assertEquals(3, record.getTimestamp()); + assertEquals(5.0f, record.getFields().get(0).getFloatV(), 0.001); + assertEquals(4.0f, record.getFields().get(1).getFloatV(), 0.001); + readOnlyTsFile.close(); + assertFalse(dataSet.hasNext()); + + assertTrue(file.delete()); } }
