This is an automated email from the ASF dual-hosted git repository.
wangchao316 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new b954d0f [IOTDB-2592] An exception occurred when using TsFile read API
(#5105)
b954d0f is described below
commit b954d0f74f1f84c56cfb51a049c5a30bf77e8c4e
Author: liuminghui233 <[email protected]>
AuthorDate: Sat Feb 26 16:15:27 2022 +0800
[IOTDB-2592] An exception occurred when using TsFile read API (#5105)
[IOTDB-2592] An exception occurred when using TsFile read API (#5105)
---
.../java/org/apache/iotdb/tsfile/Constant.java | 2 +
.../iotdb/tsfile/TsFileForceAppendWrite.java | 1 +
.../java/org/apache/iotdb/tsfile/TsFileRead.java | 18 +++---
.../tsfile/TsFileWriteAlignedWithTSRecord.java | 16 ++++--
.../iotdb/tsfile/TsFileWriteAlignedWithTablet.java | 28 +++++----
.../iotdb/tsfile/TsFileWriteWithTSRecord.java | 16 ++++--
.../apache/iotdb/tsfile/TsFileWriteWithTablet.java | 16 ++++--
.../iotdb/tsfile/read/TsFileSequenceReader.java | 18 ++++++
.../read/controller/CachedChunkLoaderImpl.java | 67 +++++++++++++++++++---
9 files changed, 139 insertions(+), 43 deletions(-)
diff --git a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java
index 09f4213..3218470 100644
--- a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java
+++ b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java
@@ -28,4 +28,6 @@ public class Constant {
static final String SENSOR_3 = "sensor_3";
static final String DEVICE_PREFIX = "device_";
+ static final String DEVICE_1 = "root.sg.device_1";
+ static final String DEVICE_2 = "root.sg.device_2";
}
diff --git
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
index 6499b6c..b7e8644 100644
---
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
+++
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
@@ -46,6 +46,7 @@ public class TsFileForceAppendWrite {
if (f.exists()) {
Files.delete(f.toPath());
}
+
try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
// add measurements into file schema
diff --git
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
index 9ce88fc..e82ac5f 100644
--- a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
+++ b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
@@ -33,6 +33,11 @@ import
org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
import java.io.IOException;
import java.util.ArrayList;
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
/**
* The class is to show how to read TsFile file named "test.tsfile". The
TsFile file "test.tsfile"
* is generated from class TsFileWriteWithTSRecord or TsFileWriteWithTablet.
Run
@@ -40,8 +45,6 @@ import java.util.ArrayList;
*/
public class TsFileRead {
- private static final String DEVICE1 = "device_1";
-
private static void queryAndPrint(
ArrayList<Path> paths, TsFileReader readTsFile, IExpression statement)
throws IOException {
QueryExpression queryExpression = QueryExpression.create(paths, statement);
@@ -63,9 +66,9 @@ public class TsFileRead {
// use these paths(all measurements) for all the queries
ArrayList<Path> paths = new ArrayList<>();
- paths.add(new Path(DEVICE1, "sensor_1"));
- paths.add(new Path(DEVICE1, "sensor_2"));
- paths.add(new Path(DEVICE1, "sensor_3"));
+ paths.add(new Path(DEVICE_1, SENSOR_1));
+ paths.add(new Path(DEVICE_1, SENSOR_2));
+ paths.add(new Path(DEVICE_1, SENSOR_3));
// no filter, should select 1 2 3 4 6 7 8
queryAndPrint(paths, readTsFile, null);
@@ -79,7 +82,7 @@ public class TsFileRead {
// value filter : device_1.sensor_2 <= 20, should select 1 2 4 6 7
IExpression valueFilter =
- new SingleSeriesExpression(new Path(DEVICE1, "sensor_2"),
ValueFilter.ltEq(20L));
+ new SingleSeriesExpression(new Path(DEVICE_1, SENSOR_2),
ValueFilter.ltEq(20L));
queryAndPrint(paths, readTsFile, valueFilter);
// time filter : 4 <= time <= 10, value filter : device_1.sensor_3 >=
20, should select 4 7 8
@@ -87,8 +90,7 @@ public class TsFileRead {
BinaryExpression.and(
new GlobalTimeExpression(TimeFilter.gtEq(4L)),
new GlobalTimeExpression(TimeFilter.ltEq(10L)));
- valueFilter =
- new SingleSeriesExpression(new Path(DEVICE1, "sensor_3"),
ValueFilter.gtEq(20L));
+ valueFilter = new SingleSeriesExpression(new Path(DEVICE_1, SENSOR_3),
ValueFilter.gtEq(20L));
IExpression finalFilter = BinaryExpression.and(timeFilter, valueFilter);
queryAndPrint(paths, readTsFile, finalFilter);
}
diff --git
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
index a6dd75a..a9186b6 100644
---
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
+++
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
@@ -38,6 +38,11 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
public class TsFileWriteAlignedWithTSRecord {
private static final Logger logger =
LoggerFactory.getLogger(TsFileWriteAlignedWithTSRecord.class);
@@ -47,21 +52,22 @@ public class TsFileWriteAlignedWithTSRecord {
if (f.exists() && !f.delete()) {
throw new RuntimeException("can not delete " + f.getAbsolutePath());
}
+
try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
List<MeasurementSchema> measurementSchemas = new ArrayList<>();
- measurementSchemas.add(new MeasurementSchema("s1", TSDataType.INT64,
TSEncoding.RLE));
- measurementSchemas.add(new MeasurementSchema("s2", TSDataType.INT64,
TSEncoding.RLE));
- measurementSchemas.add(new MeasurementSchema("s3", TSDataType.INT64,
TSEncoding.RLE));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.INT64,
TSEncoding.RLE));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.INT64,
TSEncoding.RLE));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_3, TSDataType.INT64,
TSEncoding.RLE));
// register timeseries
- tsFileWriter.registerAlignedTimeseries(new Path("root.sg.d1"),
measurementSchemas);
+ tsFileWriter.registerAlignedTimeseries(new Path(DEVICE_1),
measurementSchemas);
List<IMeasurementSchema> writeMeasurementScheams = new ArrayList<>();
// example1
writeMeasurementScheams.add(measurementSchemas.get(0));
writeMeasurementScheams.add(measurementSchemas.get(1));
writeMeasurementScheams.add(measurementSchemas.get(2));
- writeAligned(tsFileWriter, "root.sg.d1", writeMeasurementScheams,
1000000, 0, 0);
+ writeAligned(tsFileWriter, DEVICE_1, writeMeasurementScheams, 1000000,
0, 0);
} catch (WriteProcessException e) {
logger.error("write TSRecord failed", e);
}
diff --git
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
index ecce114..bd14059 100644
---
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
+++
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
@@ -36,30 +36,36 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.DEVICE_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
public class TsFileWriteAlignedWithTablet {
private static final Logger logger =
LoggerFactory.getLogger(TsFileWriteAlignedWithTablet.class);
- private static final String deviceId = "root.sg.d1";
public static void main(String[] args) throws IOException {
File f = FSFactoryProducer.getFSFactory().getFile("alignedTablet.tsfile");
if (f.exists() && !f.delete()) {
throw new RuntimeException("can not delete " + f.getAbsolutePath());
}
+
try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
List<MeasurementSchema> measurementSchemas = new ArrayList<>();
- measurementSchemas.add(new MeasurementSchema("s1", TSDataType.TEXT,
TSEncoding.PLAIN));
- measurementSchemas.add(new MeasurementSchema("s2", TSDataType.TEXT,
TSEncoding.PLAIN));
- measurementSchemas.add(new MeasurementSchema("s3", TSDataType.TEXT,
TSEncoding.PLAIN));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.TEXT,
TSEncoding.PLAIN));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.TEXT,
TSEncoding.PLAIN));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_3, TSDataType.TEXT,
TSEncoding.PLAIN));
// register align timeseries
- tsFileWriter.registerAlignedTimeseries(new Path(deviceId),
measurementSchemas);
+ tsFileWriter.registerAlignedTimeseries(new Path(DEVICE_1),
measurementSchemas);
List<MeasurementSchema> writeMeasurementScheams = new ArrayList<>();
// example 1
writeMeasurementScheams.add(measurementSchemas.get(0));
writeMeasurementScheams.add(measurementSchemas.get(1));
writeMeasurementScheams.add(measurementSchemas.get(2));
- writeAlignedWithTablet(tsFileWriter, deviceId, writeMeasurementScheams,
200000, 0, 0);
+ writeAlignedWithTablet(tsFileWriter, DEVICE_1, writeMeasurementScheams,
200000, 0, 0);
writeNonAlignedWithTablet(tsFileWriter); // write nonAligned timeseries
} catch (WriteProcessException e) {
@@ -104,14 +110,14 @@ public class TsFileWriteAlignedWithTablet {
throws WriteProcessException, IOException {
// register nonAlign timeseries
tsFileWriter.registerTimeseries(
- new Path("root.sg.d2"), new MeasurementSchema("s1", TSDataType.INT64,
TSEncoding.RLE));
+ new Path(DEVICE_2), new MeasurementSchema(SENSOR_1, TSDataType.INT64,
TSEncoding.RLE));
tsFileWriter.registerTimeseries(
- new Path("root.sg.d2"), new MeasurementSchema("s2", TSDataType.INT64,
TSEncoding.RLE));
+ new Path(DEVICE_2), new MeasurementSchema(SENSOR_2, TSDataType.INT64,
TSEncoding.RLE));
// construct Tablet
List<MeasurementSchema> measurementSchemas = new ArrayList<>();
- measurementSchemas.add(new MeasurementSchema("s1", TSDataType.INT64,
TSEncoding.RLE));
- measurementSchemas.add(new MeasurementSchema("s2", TSDataType.INT64,
TSEncoding.RLE));
- Tablet tablet = new Tablet("root.sg.d2", measurementSchemas);
+ measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.INT64,
TSEncoding.RLE));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.INT64,
TSEncoding.RLE));
+ Tablet tablet = new Tablet(DEVICE_2, measurementSchemas);
long[] timestamps = tablet.timestamps;
Object[] values = tablet.values;
int rowNum = 100;
diff --git
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
index 21e7491..004ab10 100644
---
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
+++
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
@@ -36,12 +36,16 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
/**
* An example of writing data with TSRecord to TsFile It uses the interface:
public void
* addMeasurement(MeasurementSchema measurementSchema) throws
WriteProcessException
*/
public class TsFileWriteWithTSRecord {
- private static String deviceId = "root.sg.d1";
public static void main(String[] args) {
try {
@@ -53,19 +57,19 @@ public class TsFileWriteWithTSRecord {
try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
List<MeasurementSchema> schemas = new ArrayList<>();
- schemas.add(new MeasurementSchema("s1", TSDataType.INT64,
TSEncoding.RLE));
- schemas.add(new MeasurementSchema("s2", TSDataType.INT64,
TSEncoding.RLE));
- schemas.add(new MeasurementSchema("s3", TSDataType.INT64,
TSEncoding.RLE));
+ schemas.add(new MeasurementSchema(SENSOR_1, TSDataType.INT64,
TSEncoding.RLE));
+ schemas.add(new MeasurementSchema(SENSOR_2, TSDataType.INT64,
TSEncoding.RLE));
+ schemas.add(new MeasurementSchema(SENSOR_3, TSDataType.INT64,
TSEncoding.RLE));
// register timeseries
- tsFileWriter.registerTimeseries(new Path(deviceId), schemas);
+ tsFileWriter.registerTimeseries(new Path(DEVICE_1), schemas);
List<IMeasurementSchema> writeMeasurementScheams = new ArrayList<>();
// example1
writeMeasurementScheams.add(schemas.get(0));
writeMeasurementScheams.add(schemas.get(1));
writeMeasurementScheams.add(schemas.get(2));
- write(tsFileWriter, deviceId, writeMeasurementScheams, 10000, 0, 0);
+ write(tsFileWriter, DEVICE_1, writeMeasurementScheams, 10000, 0, 0);
}
} catch (Throwable e) {
e.printStackTrace();
diff --git
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
index ebc2f1c..c454e0c 100644
---
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
+++
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
@@ -37,6 +37,11 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
/** An example of writing data with Tablet to TsFile */
public class TsFileWriteWithTablet {
@@ -49,21 +54,22 @@ public class TsFileWriteWithTablet {
if (f.exists() && !f.delete()) {
throw new RuntimeException("can not delete " + f.getAbsolutePath());
}
+
try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
List<MeasurementSchema> measurementSchemas = new ArrayList<>();
- measurementSchemas.add(new MeasurementSchema("s1", TSDataType.TEXT,
TSEncoding.PLAIN));
- measurementSchemas.add(new MeasurementSchema("s2", TSDataType.TEXT,
TSEncoding.PLAIN));
- measurementSchemas.add(new MeasurementSchema("s3", TSDataType.TEXT,
TSEncoding.PLAIN));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_1,
TSDataType.TEXT, TSEncoding.PLAIN));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_2,
TSDataType.TEXT, TSEncoding.PLAIN));
+ measurementSchemas.add(new MeasurementSchema(SENSOR_3,
TSDataType.TEXT, TSEncoding.PLAIN));
// register nonAligned timeseries
- tsFileWriter.registerTimeseries(new Path("root.sg.d1"),
measurementSchemas);
+ tsFileWriter.registerTimeseries(new Path(DEVICE_1),
measurementSchemas);
List<MeasurementSchema> writeMeasurementScheams = new ArrayList<>();
// example 1
writeMeasurementScheams.add(measurementSchemas.get(0));
writeMeasurementScheams.add(measurementSchemas.get(1));
writeMeasurementScheams.add(measurementSchemas.get(2));
- writeWithTablet(tsFileWriter, "root.sg.d1", writeMeasurementScheams,
10000, 0, 0);
+ writeWithTablet(tsFileWriter, DEVICE_1, writeMeasurementScheams,
10000, 0, 0);
}
} catch (Exception e) {
logger.error("meet error in TsFileWrite with tablet", e);
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 b3b25c5..88834f1 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
@@ -48,6 +48,7 @@ import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
import org.apache.iotdb.tsfile.read.common.BatchData;
import org.apache.iotdb.tsfile.read.common.Chunk;
import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.controller.CachedChunkLoaderImpl;
import org.apache.iotdb.tsfile.read.controller.MetadataQuerierByFileImpl;
import org.apache.iotdb.tsfile.read.reader.TsFileInput;
import org.apache.iotdb.tsfile.read.reader.page.PageReader;
@@ -1072,6 +1073,23 @@ public class TsFileSequenceReader implements
AutoCloseable {
}
/**
+ * read memory chunk.
+ *
+ * @param chunkCacheKey given key of chunk LRUCache
+ * @return chunk
+ */
+ public Chunk readMemChunk(CachedChunkLoaderImpl.ChunkCacheKey chunkCacheKey)
throws IOException {
+ int chunkHeadSize =
ChunkHeader.getSerializedSize(chunkCacheKey.getMeasurementUid());
+ ChunkHeader header =
readChunkHeader(chunkCacheKey.getOffsetOfChunkHeader(), chunkHeadSize);
+ ByteBuffer buffer =
+ readChunk(
+ chunkCacheKey.getOffsetOfChunkHeader() +
header.getSerializedSize(),
+ header.getDataSize());
+ return new Chunk(
+ header, buffer, chunkCacheKey.getDeleteIntervalList(),
chunkCacheKey.getStatistics());
+ }
+
+ /**
* not thread safe.
*
* @param type given tsfile data type
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
index 4668d4d..c0f76b5 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
@@ -21,20 +21,25 @@ package org.apache.iotdb.tsfile.read.controller;
import org.apache.iotdb.tsfile.common.cache.LRUCache;
import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
import org.apache.iotdb.tsfile.read.common.Chunk;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
import org.apache.iotdb.tsfile.read.reader.IChunkReader;
import org.apache.iotdb.tsfile.read.reader.chunk.ChunkReader;
import java.io.IOException;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
/** Read one Chunk and cache it into a LRUCache, only used in tsfile module. */
public class CachedChunkLoaderImpl implements IChunkLoader {
private static final int DEFAULT_CHUNK_CACHE_SIZE = 1000;
private TsFileSequenceReader reader;
- private LRUCache<ChunkMetadata, Chunk> chunkCache;
+ private LRUCache<ChunkCacheKey, Chunk> chunkCache;
public CachedChunkLoaderImpl(TsFileSequenceReader fileSequenceReader) {
this(fileSequenceReader, DEFAULT_CHUNK_CACHE_SIZE);
@@ -51,19 +56,18 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
this.reader = fileSequenceReader;
chunkCache =
- new LRUCache<ChunkMetadata, Chunk>(cacheSize) {
+ new LRUCache<ChunkCacheKey, Chunk>(cacheSize) {
@Override
- public Chunk loadObjectByKey(ChunkMetadata metaData) throws
IOException {
- return reader.readMemChunk(metaData);
+ protected Chunk loadObjectByKey(ChunkCacheKey chunkCacheKey) throws
IOException {
+ return reader.readMemChunk(chunkCacheKey);
}
};
}
@Override
public Chunk loadChunk(ChunkMetadata chunkMetaData) throws IOException {
- chunkMetaData.setFilePath(reader.getFileName());
- Chunk chunk = chunkCache.get(chunkMetaData);
+ Chunk chunk = chunkCache.get(new ChunkCacheKey(chunkMetaData));
return new Chunk(
chunk.getHeader(),
chunk.getData().duplicate(),
@@ -79,8 +83,7 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
@Override
public IChunkReader getChunkReader(IChunkMetadata chunkMetaData, Filter
timeFilter)
throws IOException {
- chunkMetaData.setFilePath(reader.getFileName());
- Chunk chunk = chunkCache.get((ChunkMetadata) chunkMetaData);
+ Chunk chunk = chunkCache.get(new ChunkCacheKey((ChunkMetadata)
chunkMetaData));
return new ChunkReader(
new Chunk(
chunk.getHeader(),
@@ -89,4 +92,52 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
chunkMetaData.getStatistics()),
timeFilter);
}
+
+ public static class ChunkCacheKey {
+
+ private final Long offsetOfChunkHeader;
+ private final String measurementUid;
+ private final List<TimeRange> deleteIntervalList;
+ private final Statistics<? extends Serializable> statistics;
+
+ public ChunkCacheKey(ChunkMetadata chunkMetadata) {
+ offsetOfChunkHeader = chunkMetadata.getOffsetOfChunkHeader();
+ measurementUid = chunkMetadata.getMeasurementUid();
+ deleteIntervalList = chunkMetadata.getDeleteIntervalList();
+ statistics = chunkMetadata.getStatistics();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ChunkCacheKey that = (ChunkCacheKey) o;
+ return Objects.equals(offsetOfChunkHeader, that.offsetOfChunkHeader);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(offsetOfChunkHeader);
+ }
+
+ public Long getOffsetOfChunkHeader() {
+ return offsetOfChunkHeader;
+ }
+
+ public String getMeasurementUid() {
+ return measurementUid;
+ }
+
+ public List<TimeRange> getDeleteIntervalList() {
+ return deleteIntervalList;
+ }
+
+ public Statistics<? extends Serializable> getStatistics() {
+ return statistics;
+ }
+ }
}