This is an automated email from the ASF dual-hosted git repository.
hxd pushed a commit to branch feature_read_data_from_unclosed_tsfile
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to
refs/heads/feature_read_data_from_unclosed_tsfile by this push:
new 990f886 temporary commit
990f886 is described below
commit 990f886a8a5b9991927a923aa542b6cbd549f19b
Author: xiangdong huang <[email protected]>
AuthorDate: Tue Mar 5 22:06:02 2019 +0800
temporary commit
---
.../engine/bufferwrite/BufferWriteProcessor.java | 1 -
.../bufferwrite}/RestorableTsFileIOWriter.java | 2 +-
.../bufferwrite}/RestorableTsFileIOWriterTest.java | 5 +-
.../iotdb/tsfile/common/conf/TSFileDescriptor.java | 4 +
.../iotdb/tsfile/read/TsFileSequenceReader.java | 8 +
.../apache/iotdb/tsfile/write/TsFileWriter.java | 32 ++-
.../apache/iotdb/tsfile/write/record/TSRecord.java | 3 +-
.../tsfile/write/writer/DefaultTsFileOutput.java | 6 +-
.../writer/NativeRestorableTsFileIOWriter.java | 37 +--
.../iotdb/tsfile/write/writer/TsFileIOWriter.java | 7 +
.../writer/NativeRestorableTsFileIOWriterTest.java | 260 +++++++++++++++++++++
11 files changed, 344 insertions(+), 21 deletions(-)
diff --git
a/iotdb/src/main/java/org/apache/iotdb/db/engine/bufferwrite/BufferWriteProcessor.java
b/iotdb/src/main/java/org/apache/iotdb/db/engine/bufferwrite/BufferWriteProcessor.java
index ecdcaa3..dc56312 100644
---
a/iotdb/src/main/java/org/apache/iotdb/db/engine/bufferwrite/BufferWriteProcessor.java
+++
b/iotdb/src/main/java/org/apache/iotdb/db/engine/bufferwrite/BufferWriteProcessor.java
@@ -53,7 +53,6 @@ import org.apache.iotdb.tsfile.utils.Pair;
import org.apache.iotdb.tsfile.write.record.TSRecord;
import org.apache.iotdb.tsfile.write.record.datapoint.DataPoint;
import org.apache.iotdb.tsfile.write.schema.FileSchema;
-import org.apache.iotdb.tsfile.write.writer.RestorableTsFileIOWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriter.java
b/iotdb/src/main/java/org/apache/iotdb/db/engine/bufferwrite/RestorableTsFileIOWriter.java
similarity index 99%
rename from
tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriter.java
rename to
iotdb/src/main/java/org/apache/iotdb/db/engine/bufferwrite/RestorableTsFileIOWriter.java
index 83b627a..7331104 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriter.java
+++
b/iotdb/src/main/java/org/apache/iotdb/db/engine/bufferwrite/RestorableTsFileIOWriter.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.iotdb.tsfile.write.writer;
+package org.apache.iotdb.db.engine.bufferwrite;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
diff --git
a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriterTest.java
b/iotdb/src/test/java/org/apache/iotdb/db/engine/bufferwrite/RestorableTsFileIOWriterTest.java
similarity index 98%
rename from
tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriterTest.java
rename to
iotdb/src/test/java/org/apache/iotdb/db/engine/bufferwrite/RestorableTsFileIOWriterTest.java
index eadcaa5..e341e5b 100644
---
a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriterTest.java
+++
b/iotdb/src/test/java/org/apache/iotdb/db/engine/bufferwrite/RestorableTsFileIOWriterTest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.iotdb.tsfile.write.writer;
+package org.apache.iotdb.db.engine.bufferwrite;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@@ -46,12 +46,13 @@ import org.apache.iotdb.tsfile.utils.BytesUtils;
import org.apache.iotdb.tsfile.utils.Pair;
import org.apache.iotdb.tsfile.write.schema.FileSchema;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
-import org.apache.iotdb.tsfile.write.writer.RestorableTsFileIOWriter;
import org.apache.iotdb.tsfile.write.writer.TsFileIOWriter;
import org.junit.After;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+
public class RestorableTsFileIOWriterTest {
private RestorableTsFileIOWriter writer;
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java
index 83852e0..b4189fa 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileDescriptor.java
@@ -113,6 +113,10 @@ public class TSFileDescriptor {
TSFileConfig.pageSizeInByte = Integer
.parseInt(properties
.getProperty("page_size_in_byte",
Integer.toString(TSFileConfig.pageSizeInByte)));
+ if (TSFileConfig.pageSizeInByte > TSFileConfig.groupSizeInByte) {
+ LOGGER.warn("page_size is greater than group size, will set it as the
same with group size");
+ TSFileConfig.pageSizeInByte = TSFileConfig.groupSizeInByte;
+ }
TSFileConfig.maxNumberOfPointsInPage = Integer.parseInt(
properties
.getProperty("max_number_of_points_in_page",
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
index d50af27..4460098 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
@@ -365,4 +365,12 @@ public class TsFileSequenceReader {
return ReadWriteIOUtils
.readAsPossible(tsFileInput.wrapAsFileChannel(), target, position,
length);
}
+
+ /**
+ *
+ * @param pos the position of the file you want to move to
+ */
+ public void setPosition(long pos) throws IOException {
+ tsFileInput.position(pos);
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
index 0a291db..cb7194c 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
@@ -22,12 +22,12 @@ import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
-
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.exception.write.NoMeasurementException;
import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
+import org.apache.iotdb.tsfile.file.header.PageHeader;
import org.apache.iotdb.tsfile.write.chunk.ChunkGroupWriterImpl;
import org.apache.iotdb.tsfile.write.chunk.IChunkGroupWriter;
import org.apache.iotdb.tsfile.write.record.TSRecord;
@@ -91,6 +91,15 @@ public class TsFileWriter {
/**
* init this TsFileWriter.
*
+ * @param fileWriter the io writer of this TsFile
+ */
+ public TsFileWriter(TsFileIOWriter fileWriter) {
+ this(fileWriter, new FileSchema(),
TSFileDescriptor.getInstance().getConfig());
+ }
+
+ /**
+ * init this TsFileWriter.
+ *
* @param file the File to be written by this TsFileWriter
* @param schema the schema of this TsFile
*/
@@ -131,6 +140,11 @@ public class TsFileWriter {
this.schema = schema;
this.pageSize = TSFileConfig.pageSizeInByte;
this.chunkGroupSizeThreshold = TSFileConfig.groupSizeInByte;
+ if (this.pageSize >= chunkGroupSizeThreshold) {
+ LOG.warn(
+ "TsFile's page size {} is greater than chunk group size {}, please
enlarge the chunk group"
+ + " size or decrease page size. ", pageSize,
chunkGroupSizeThreshold);
+ }
}
/**
@@ -290,4 +304,20 @@ public class TsFileWriter {
flushAllChunkGroups();
fileWriter.endFile(this.schema);
}
+
+ /**
+ * this function is only for Test.
+ * @return
+ */
+ public TsFileIOWriter getIOWriter() {
+ return this.fileWriter;
+ }
+
+ /**
+ * this function is only for Test
+ * @throws IOException
+ */
+ public void flushForTest() throws IOException {
+ flushAllChunkGroups();
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/TSRecord.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/TSRecord.java
index b30a483..9ce98a7 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/TSRecord.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/TSRecord.java
@@ -64,8 +64,9 @@ public class TSRecord {
*
* @param tuple data point to be added
*/
- public void addTuple(DataPoint tuple) {
+ public TSRecord addTuple(DataPoint tuple) {
this.dataPointList.add(tuple);
+ return this;
}
/**
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/DefaultTsFileOutput.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/DefaultTsFileOutput.java
index 4ea8be8..0ab5e21 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/DefaultTsFileOutput.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/DefaultTsFileOutput.java
@@ -31,12 +31,16 @@ import java.nio.ByteBuffer;
*/
public class DefaultTsFileOutput implements TsFileOutput {
- FileOutputStream outputStream;
+ private FileOutputStream outputStream;
public DefaultTsFileOutput(File file) throws FileNotFoundException {
this.outputStream = new FileOutputStream(file);
}
+ public DefaultTsFileOutput(File file, boolean append) throws
FileNotFoundException {
+ this.outputStream = new FileOutputStream(file, append);
+ }
+
public DefaultTsFileOutput(FileOutputStream outputStream) {
this.outputStream = outputStream;
}
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/NativeRestorableTsFileIOWriter.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/NativeRestorableTsFileIOWriter.java
index 19f98a6..35842c3 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/NativeRestorableTsFileIOWriter.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/NativeRestorableTsFileIOWriter.java
@@ -38,15 +38,22 @@ public class NativeRestorableTsFileIOWriter extends
TsFileIOWriter {
private static final Logger LOGGER = LoggerFactory
.getLogger(NativeRestorableTsFileIOWriter.class);
+ private long truncatedPosition = -1;
- public NativeRestorableTsFileIOWriter(String insertFilePath) throws
IOException {
- super();
- File insertFile = new File(insertFilePath);
+ public long getTruncatedPosition() {
+ return truncatedPosition;
+ }
- if (!insertFile.exists()) {
- this.out = new DefaultTsFileOutput(insertFile);
+ public NativeRestorableTsFileIOWriter(File file) throws IOException {
+ super();
+ long fileSize;
+ if (!file.exists()) {
+ this.out = new DefaultTsFileOutput(file, true);
startFile();
return;
+ } else {
+ fileSize = file.length();
+ this.out = new DefaultTsFileOutput(file, true);
}
//we need to read data to recover TsFileIOWriter.chunkGroupMetaDataList
@@ -68,22 +75,24 @@ public class NativeRestorableTsFileIOWriter extends
TsFileIOWriter {
long versionOfChunkGroup = 0;
boolean newGroup = true;
- TsFileSequenceReader reader = new TsFileSequenceReader(insertFilePath);
- if (reader.fileSize() <= 4) {
- LOGGER.debug("{} does not worth to recover, will create a new one.",
insertFilePath);
+ TsFileSequenceReader reader = new
TsFileSequenceReader(file.getAbsolutePath(), false);
+ if (fileSize <= magicStringBytes.length) {
+ LOGGER.debug("{} only has magic header, does not worth to recover.",
file.getAbsolutePath());
reader.close();
this.out.truncate(0);
startFile();
+ truncatedPosition = magicStringBytes.length;
return;
}
if (reader.readTailMagic().equals(reader.readHeadMagic())) {
- LOGGER.debug("{} is an complete TsFile.", insertFilePath);
+ LOGGER.debug("{} is an complete TsFile.", file.getAbsolutePath());
complete = true;
return;
}
// not a complete file, we will recover it...
- long pos = magicStringBytes.length;
+ truncatedPosition = magicStringBytes.length;
+ reader.setPosition(truncatedPosition);
boolean goon = true;
byte marker;
try {
@@ -141,7 +150,7 @@ public class NativeRestorableTsFileIOWriter extends
TsFileIOWriter {
metadatas.add(currentChunkGroup);
newGroup = true;
//we get a complete chunk group now.
- pos = getPos();
+ truncatedPosition = getPos();
} catch (IOException e) {
goon = false;
}
@@ -154,10 +163,10 @@ public class NativeRestorableTsFileIOWriter extends
TsFileIOWriter {
} catch (IOException e2) {
} finally {
//something wrong or all data is complete. We will discard current
FileMetadata
- out.truncate(pos);
+ LOGGER.info("File {} has {} bytes, and will be truncated from {}.",
+ file.getAbsolutePath(), file.length(), truncatedPosition);
+ out.truncate(truncatedPosition);
}
-
-
}
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
index ae896dc..83616fc 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
@@ -321,4 +321,11 @@ public class TsFileIOWriter {
return complete;
}
+ /**
+ * close the inputstream or file channel in force. This is just used for
Testing.
+ */
+ public void forceClose() throws IOException {
+ out.close();
+ }
+
}
diff --git
a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/NativeRestorableTsFileIOWriterTest.java
b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/NativeRestorableTsFileIOWriterTest.java
new file mode 100644
index 0000000..10bcda0
--- /dev/null
+++
b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/NativeRestorableTsFileIOWriterTest.java
@@ -0,0 +1,260 @@
+package org.apache.iotdb.tsfile.write.writer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
+import org.apache.iotdb.tsfile.encoding.decoder.Decoder;
+import org.apache.iotdb.tsfile.file.MetaMarker;
+import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
+import org.apache.iotdb.tsfile.file.header.ChunkHeader;
+import org.apache.iotdb.tsfile.file.header.PageHeader;
+import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetaData;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
+import org.apache.iotdb.tsfile.file.metadata.TsDeviceMetadata;
+import org.apache.iotdb.tsfile.file.metadata.TsDeviceMetadataIndex;
+import org.apache.iotdb.tsfile.file.metadata.TsFileMetaData;
+import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.file.metadata.statistics.FloatStatistics;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+import org.apache.iotdb.tsfile.read.reader.page.PageReader;
+import org.apache.iotdb.tsfile.write.TsFileWriter;
+import org.apache.iotdb.tsfile.write.record.TSRecord;
+import org.apache.iotdb.tsfile.write.record.datapoint.FloatDataPoint;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NativeRestorableTsFileIOWriterTest {
+ private int bkChunkGroupSize;
+
+ private static final String FILE_NAME = "test.ts";
+ @Before
+ public void setUp() throws Exception {
+ bkChunkGroupSize = TSFileConfig.groupSizeInByte;
+ TSFileConfig.groupSizeInByte = 20;
+ TSFileConfig.pageSizeInByte = 5;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ TSFileConfig.groupSizeInByte = bkChunkGroupSize;
+ }
+
+ @Test
+ public void testOnlyHeadMagic() throws Exception {
+ File file = new File(FILE_NAME);
+ TsFileWriter writer = new TsFileWriter(file);
+ writer.getIOWriter().forceClose();
+ NativeRestorableTsFileIOWriter rWriter = new
NativeRestorableTsFileIOWriter(file);
+ writer = new TsFileWriter(rWriter);
+ writer.close();
+ assertEquals(TsFileIOWriter.magicStringBytes.length,
rWriter.getTruncatedPosition());
+ printFile(FILE_NAME);
+
+ assertTrue(file.delete());
+
+ }
+
+ @Test
+ public void testOnlyFirstMask() throws Exception {
+ File file = new File(FILE_NAME);
+ TsFileWriter writer = new TsFileWriter(file);
+ //we have to flush using inner API.
+ writer.getIOWriter().out.write(new byte[] {MetaMarker.CHUNK_HEADER});
+ writer.getIOWriter().forceClose();
+ assertEquals(TsFileIOWriter.magicStringBytes.length + 1, file.length());
+ NativeRestorableTsFileIOWriter rWriter = new
NativeRestorableTsFileIOWriter(file);
+ writer = new TsFileWriter(rWriter);
+ writer.close();
+ printFile(FILE_NAME);
+ assertEquals(TsFileIOWriter.magicStringBytes.length,
rWriter.getTruncatedPosition());
+ assertTrue(file.delete());
+ }
+
+ @Test
+ public void testOnlyOneIncompleteChunkHeader() throws Exception {
+ File file = new File(FILE_NAME);
+ TsFileWriter writer = new TsFileWriter(file);
+
+ ChunkHeader header = new ChunkHeader("s1", 100, TSDataType.FLOAT,
CompressionType.SNAPPY,
+ TSEncoding.PLAIN, 5);
+ ByteBuffer buffer = ByteBuffer.allocate(header.getSerializedSize());
+ header.serializeTo(buffer);
+ buffer.flip();
+ byte[] data = new byte[3];
+ buffer.get(data, 0, 3);
+ writer.getIOWriter().out.write(data);
+ writer.getIOWriter().forceClose();
+ NativeRestorableTsFileIOWriter rWriter = new
NativeRestorableTsFileIOWriter(file);
+ writer = new TsFileWriter(rWriter);
+ writer.close();
+ assertEquals(TsFileIOWriter.magicStringBytes.length,
rWriter.getTruncatedPosition());
+ assertTrue(file.delete());
+ }
+
+ @Test
+ public void testOnlyOneChunkHeader() throws Exception {
+ File file = new File(FILE_NAME);
+ TsFileWriter writer = new TsFileWriter(file);
+ writer.getIOWriter()
+ .startFlushChunk(new MeasurementSchema("s1", TSDataType.FLOAT,
TSEncoding.PLAIN),
+ CompressionType.SNAPPY, TSDataType.FLOAT,
+ TSEncoding.PLAIN, new FloatStatistics(), 100, 50, 100, 10);
+ writer.getIOWriter().forceClose();
+
+ NativeRestorableTsFileIOWriter rWriter = new
NativeRestorableTsFileIOWriter(file);
+ writer = new TsFileWriter(rWriter);
+ writer.close();
+ assertEquals(TsFileIOWriter.magicStringBytes.length,
rWriter.getTruncatedPosition());
+ assertTrue(file.delete());
+ }
+
+ @Test
+ public void testOnlyOneChunkHeaderAndSomePage() throws Exception {
+
+ }
+
+ @Test
+ public void testOnlyOneCompleteChunk() throws Exception {
+
+ }
+
+ @Test
+ public void testOnlyOneChunkAndMore() throws Exception {
+
+ }
+
+ @Test
+ public void testOnlyOneChunkGroup() throws Exception {
+ File file = new File(FILE_NAME);
+ TsFileWriter writer = new TsFileWriter(file);
+ writer.addMeasurement(new MeasurementSchema("s1", TSDataType.FLOAT,
TSEncoding.RLE));
+ writer.addMeasurement(new MeasurementSchema("s2", TSDataType.FLOAT,
TSEncoding.RLE));
+ writer.write(new TSRecord(1, "d1").addTuple(new FloatDataPoint("s1", 5))
+ .addTuple(new FloatDataPoint("s2", 4)));
+ writer.write(new TSRecord(2, "d1").addTuple(new FloatDataPoint("s1", 5))
+ .addTuple(new FloatDataPoint("s2", 4)));
+ writer.flushForTest();
+
+ NativeRestorableTsFileIOWriter rWriter = new
NativeRestorableTsFileIOWriter(file);
+ writer = new TsFileWriter(rWriter);
+ writer.close();
+ assertEquals(TsFileIOWriter.magicStringBytes.length,
rWriter.getTruncatedPosition());
+ assertTrue(file.delete());
+ }
+
+ @Test
+ public void testOneChunkGroupAndMore() throws Exception {
+
+ }
+
+ @Test
+ public void testNoSeperatorMask() throws Exception {
+
+ }
+
+ @Test
+ public void testHavingSeperatorMask() throws Exception {
+
+ }
+
+ @Test
+ public void testHavingSomeFileMetadata() throws Exception {
+
+ }
+
+ @Test
+ public void testOpenCompleteFile() throws Exception {
+
+ }
+
+ public void printFile(String fileName) throws IOException {
+ TsFileSequenceReader reader = new TsFileSequenceReader(fileName);
+ System.out.println("file length: " + new File(fileName).length());
+ System.out.println("file magic head: " + reader.readHeadMagic());
+ System.out.println("file magic tail: " + reader.readTailMagic());
+ System.out.println("Level 1 metadata position: " +
reader.getFileMetadataPos());
+ System.out.println("Level 1 metadata size: " +
reader.getFileMetadataPos());
+ TsFileMetaData metaData = reader.readFileMetadata();
+ // Sequential reading of one ChunkGroup now follows this order:
+ // first SeriesChunks (headers and data) in one ChunkGroup, then the
CHUNK_GROUP_FOOTER
+ // Because we do not know how many chunks a ChunkGroup may have, we should
read one byte (the marker) ahead and
+ // judge accordingly.
+ System.out.println("[Chunk Group]");
+ System.out.println("position: " + reader.position());
+ byte marker;
+ while ((marker = reader.readMarker()) != MetaMarker.SEPARATOR) {
+ switch (marker) {
+ case MetaMarker.CHUNK_HEADER:
+ System.out.println("\t[Chunk]");
+ System.out.println("\tposition: " + reader.position());
+ ChunkHeader header = reader.readChunkHeader();
+ System.out.println("\tMeasurement: " + header.getMeasurementID());
+ Decoder defaultTimeDecoder = Decoder.getDecoderByType(
+
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().timeSeriesEncoder),
+ TSDataType.INT64);
+ Decoder valueDecoder = Decoder
+ .getDecoderByType(header.getEncodingType(),
header.getDataType());
+ for (int j = 0; j < header.getNumOfPages(); j++) {
+ System.out.println("\t\t[Page]\n \t\tPage head position: " +
reader.position());
+ PageHeader pageHeader =
reader.readPageHeader(header.getDataType());
+ System.out.println("\t\tPage data position: " + reader.position());
+ System.out.println("\t\tpoints in the page: " +
pageHeader.getNumOfValues());
+ ByteBuffer pageData = reader.readPage(pageHeader,
header.getCompressionType());
+ System.out
+ .println("\t\tUncompressed page data size: " +
pageHeader.getUncompressedSize());
+ PageReader reader1 = new PageReader(pageData,
header.getDataType(), valueDecoder,
+ defaultTimeDecoder);
+ while (reader1.hasNextBatch()) {
+ BatchData batchData = reader1.nextBatch();
+ while (batchData.hasNext()) {
+ System.out.println(
+ "\t\t\ttime, value: " + batchData.currentTime() + ", " +
batchData
+ .currentValue());
+ batchData.next();
+ }
+ }
+ }
+ break;
+ case MetaMarker.CHUNK_GROUP_FOOTER:
+ System.out.println("Chunk Group Footer position: " +
reader.position());
+ ChunkGroupFooter chunkGroupFooter = reader.readChunkGroupFooter();
+ System.out.println("device: " + chunkGroupFooter.getDeviceID());
+ break;
+ default:
+ MetaMarker.handleUnexpectedMarker(marker);
+ }
+ }
+ System.out.println("[Metadata]");
+ List<TsDeviceMetadataIndex> deviceMetadataIndexList =
metaData.getDeviceMap().values().stream()
+ .sorted((x, y) -> (int) (x.getOffset() -
y.getOffset())).collect(Collectors.toList());
+ for (TsDeviceMetadataIndex index : deviceMetadataIndexList) {
+ TsDeviceMetadata deviceMetadata = reader.readTsDeviceMetaData(index);
+ List<ChunkGroupMetaData> chunkGroupMetaDataList =
deviceMetadata.getChunkGroupMetaDataList();
+ for (ChunkGroupMetaData chunkGroupMetaData : chunkGroupMetaDataList) {
+ System.out.println(String
+ .format("\t[Device]File Offset: %d, Device %s, Number of Chunk
Groups %d",
+ index.getOffset(), chunkGroupMetaData.getDeviceID(),
+ chunkGroupMetaDataList.size()));
+
+ for (ChunkMetaData chunkMetadata :
chunkGroupMetaData.getChunkMetaDataList()) {
+ System.out.println("\t\tMeasurement:" +
chunkMetadata.getMeasurementUid());
+ System.out.println("\t\tFile offset:" +
chunkMetadata.getOffsetOfChunkHeader());
+ }
+ }
+ }
+ reader.close();
+ }
+
+}
\ No newline at end of file