This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new d676199 [IOTDB-707] Optimize TsFileResource memory usage (#1269)
d676199 is described below
commit d676199b3388442db931f16bd604b393910d1e29
Author: Haonan <[email protected]>
AuthorDate: Fri May 29 14:21:15 2020 +0800
[IOTDB-707] Optimize TsFileResource memory usage (#1269)
* Optimize TsFileResource memory usage
---
.../org/apache/iotdb/db/engine/StorageEngine.java | 6 +-
.../merge/selector/MaxFileMergeFileSelector.java | 11 +-
.../db/engine/merge/task/MergeMultiChunkTask.java | 6 +-
.../engine/storagegroup/StorageGroupProcessor.java | 65 ++++---
.../db/engine/storagegroup/TsFileResource.java | 213 ++++++++++++++++-----
.../iotdb/db/query/executor/LastQueryExecutor.java | 2 +-
.../db/query/executor/fill/LastPointReader.java | 12 +-
.../iotdb/db/query/reader/series/SeriesReader.java | 6 +-
.../db/sync/receiver/load/FileLoaderManager.java | 2 +-
.../apache/iotdb/db/tools/IoTDBDataDirViewer.java | 10 +-
.../iotdb/db/tools/TsFileResourcePrinter.java | 10 +-
.../iotdb/db/writelog/recover/LogReplayer.java | 8 +-
.../engine/storagegroup/TsFileProcessorTest.java | 5 +-
.../db/sync/receiver/load/FileLoaderTest.java | 8 +-
.../recover/SyncReceiverLogAnalyzerTest.java | 4 +-
.../iotdb/db/writelog/recover/LogReplayerTest.java | 8 +-
.../recover/RecoverResourceFromReaderTest.java | 8 +-
.../db/writelog/recover/SeqTsFileRecoverTest.java | 16 +-
.../writelog/recover/UnseqTsFileRecoverTest.java | 8 +-
19 files changed, 267 insertions(+), 141 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index 9dff8b3..ca6fc86 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -463,11 +463,11 @@ public class StorageEngine implements IService {
public void loadNewTsFile(TsFileResource newTsFileResource)
throws LoadFileException, StorageEngineException, MetadataException {
- Map<String, Long> startTimeMap = newTsFileResource.getStartTimeMap();
- if (startTimeMap == null || startTimeMap.isEmpty()) {
+ Map<String, Integer> deviceMap = newTsFileResource.getDeviceToIndexMap();
+ if (deviceMap == null || deviceMap.isEmpty()) {
throw new StorageEngineException("Can not get the corresponding storage
group.");
}
- String device = startTimeMap.keySet().iterator().next();
+ String device = deviceMap.keySet().iterator().next();
String storageGroupName =
MManager.getInstance().getStorageGroupName(device);
getProcessor(storageGroupName).loadNewTsFile(newTsFileResource);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/merge/selector/MaxFileMergeFileSelector.java
b/server/src/main/java/org/apache/iotdb/db/engine/merge/selector/MaxFileMergeFileSelector.java
index 1a26c89..3b6580f 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/merge/selector/MaxFileMergeFileSelector.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/merge/selector/MaxFileMergeFileSelector.java
@@ -213,18 +213,19 @@ public class MaxFileMergeFileSelector implements
IMergeFileSelector {
private void selectOverlappedSeqFiles(TsFileResource unseqFile) {
int tmpSelectedNum = 0;
- for (Entry<String, Long> deviceStartTimeEntry :
unseqFile.getStartTimeMap().entrySet()) {
+ for (Entry<String, Integer> deviceStartTimeEntry :
unseqFile.getDeviceToIndexMap().entrySet()) {
String deviceId = deviceStartTimeEntry.getKey();
- Long unseqStartTime = deviceStartTimeEntry.getValue();
- Long unseqEndTime = unseqFile.getEndTimeMap().get(deviceId);
+ int deviceIndex = deviceStartTimeEntry.getValue();
+ long unseqStartTime = unseqFile.getStartTime(deviceIndex);
+ long unseqEndTime = unseqFile.getEndTime(deviceIndex);
boolean noMoreOverlap = false;
for (int i = 0; i < resource.getSeqFiles().size() && !noMoreOverlap;
i++) {
TsFileResource seqFile = resource.getSeqFiles().get(i);
- if (seqSelected[i] || !seqFile.getEndTimeMap().containsKey(deviceId)) {
+ if (seqSelected[i] ||
!seqFile.getDeviceToIndexMap().containsKey(deviceId)) {
continue;
}
- long seqEndTime = seqFile.getEndTimeMap().get(deviceId);
+ long seqEndTime = seqFile.getEndTime(deviceId);
if (unseqEndTime <= seqEndTime) {
// the unseqFile overlaps current seqFile
tmpSelectedSeqFiles.add(i);
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/merge/task/MergeMultiChunkTask.java
b/server/src/main/java/org/apache/iotdb/db/engine/merge/task/MergeMultiChunkTask.java
index 5d483c7..67caf2c 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/merge/task/MergeMultiChunkTask.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/merge/task/MergeMultiChunkTask.java
@@ -152,9 +152,9 @@ class MergeMultiChunkTask {
throws IOException {
TsFileResource currTsFile = resource.getSeqFiles().get(seqFileIdx);
String deviceId = currMergingPaths.get(0).getDevice();
- Long currDeviceMinTime = currTsFile.getStartTimeMap().get(deviceId);
+ long currDeviceMinTime = currTsFile.getStartTime(deviceId);
//COMMENTS: is this correct? how about if there are other devices (in the
currMergingPaths) that have unseq data?
- if (currDeviceMinTime == null) {
+ if (currDeviceMinTime == Long.MAX_VALUE) {
return;
}
@@ -198,7 +198,7 @@ class MergeMultiChunkTask {
mergeFileWriter.writeVersion(0L);
mergeFileWriter.endChunkGroup();
mergeLogger.logFilePosition(mergeFileWriter.getFile());
- currTsFile.getStartTimeMap().put(deviceId, currDeviceMinTime);
+ currTsFile.putStartTime(deviceId, currDeviceMinTime);
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 700f44c..66662fa 100755
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -318,12 +318,19 @@ public class StorageGroupProcessor {
for (TsFileResource resource : sequenceFileTreeSet) {
long timePartitionId = resource.getTimePartition();
+ Map<String, Long> endTimeMap = new HashMap<>();
+ for (Entry<String, Integer> entry :
resource.getDeviceToIndexMap().entrySet()) {
+ String deviceId = entry.getKey();
+ int index = entry.getValue();
+ long endTime = resource.getEndTime(index);
+ endTimeMap.put(deviceId, endTime);
+ }
latestTimeForEachDevice.computeIfAbsent(timePartitionId, l -> new
HashMap<>())
- .putAll(resource.getEndTimeMap());
+ .putAll(endTimeMap);
partitionLatestFlushedTimeForEachDevice
.computeIfAbsent(timePartitionId, id -> new HashMap<>())
- .putAll(resource.getEndTimeMap());
- globalLatestFlushedTimeForEachDevice.putAll(resource.getEndTimeMap());
+ .putAll(endTimeMap);
+ globalLatestFlushedTimeForEachDevice.putAll(endTimeMap);
}
}
@@ -344,16 +351,17 @@ public class StorageGroupProcessor {
VersionController versionController = new
SimpleFileVersionController(storageGroupSysDir.getPath());
long currentVersion = versionController.currVersion();
for (TsFileResource resource : upgradeSeqFileList) {
- for (Entry<String, Long> entry : resource.getEndTimeMap().entrySet()) {
+ for (Entry<String, Integer> entry :
resource.getDeviceToIndexMap().entrySet()) {
String deviceId = entry.getKey();
- long endTime = entry.getValue();
+ int index = entry.getValue();
+ long endTime = resource.getEndTime(index);
long endTimePartitionId = StorageEngine.getTimePartition(endTime);
latestTimeForEachDevice.computeIfAbsent(endTimePartitionId, l -> new
HashMap<>())
.put(deviceId, endTime);
- globalLatestFlushedTimeForEachDevice.putAll(resource.getEndTimeMap());
+ globalLatestFlushedTimeForEachDevice.put(deviceId, endTime);
// set all the covered partition's LatestFlushedTime to Long.MAX_VALUE
- long partitionId =
StorageEngine.getTimePartition(resource.startTimeMap.get(deviceId));
+ long partitionId =
StorageEngine.getTimePartition(resource.getStartTime(index));
while (partitionId <= endTimePartitionId) {
partitionLatestFlushedTimeForEachDevice.computeIfAbsent(partitionId,
l -> new HashMap<>())
.put(deviceId, Long.MAX_VALUE);
@@ -530,7 +538,7 @@ public class StorageGroupProcessor {
workSequenceTsFileProcessors
.put(timePartitionId, tsFileProcessor);
tsFileResource.setProcessor(tsFileProcessor);
- tsFileResource.endTimeMap.clear();
+ tsFileResource.clearEndTimes();
tsFileResource.removeResourceFile();
tsFileProcessor.setTimeRangeId(timePartitionId);
writer.makeMetadataVisible();
@@ -1235,8 +1243,9 @@ public class StorageGroupProcessor {
.query(deviceId, measurementId, schema.getType(),
schema.getEncodingType(),
schema.getProps(), context);
- tsfileResourcesForQuery.add(new
TsFileResource(tsFileResource.getFile(),
- tsFileResource.getStartTimeMap(),
tsFileResource.getEndTimeMap(), pair.left,
+ tsfileResourcesForQuery.add(new
TsFileResource(tsFileResource.getFile(),
+ tsFileResource.getDeviceToIndexMap(),
+ tsFileResource.getStartTimes(), tsFileResource.getEndTimes(),
pair.left,
pair.right));
}
} catch (IOException e) {
@@ -1269,13 +1278,13 @@ public class StorageGroupProcessor {
return false;
}
if (dataTTL != Long.MAX_VALUE) {
- Long deviceEndTime = tsFileResource.getEndTimeMap().get(deviceId);
- return deviceEndTime == null || checkTTL(deviceEndTime);
+ long deviceEndTime = tsFileResource.getEndTime(deviceId);
+ return deviceEndTime == Long.MIN_VALUE || checkTTL(deviceEndTime);
}
if (timeFilter != null) {
- long startTime = tsFileResource.getStartTimeMap().get(deviceId);
- long endTime = tsFileResource.getEndTimeMap().getOrDefault(deviceId,
Long.MAX_VALUE);
+ long startTime = tsFileResource.getStartTime(deviceId);
+ long endTime = tsFileResource.getOrDefaultEndTime(deviceId,
Long.MAX_VALUE);
return timeFilter.satisfyStartEndTime(startTime, endTime);
}
return true;
@@ -1368,7 +1377,7 @@ public class StorageGroupProcessor {
String deviceId = deletion.getDevice();
for (TsFileResource tsFileResource : tsFileResourceList) {
if (!tsFileResource.containsDevice(deviceId) ||
- deletion.getTimestamp() <
tsFileResource.getStartTimeMap().get(deviceId)) {
+ deletion.getTimestamp() < tsFileResource.getStartTime(deviceId)) {
continue;
}
@@ -1398,7 +1407,7 @@ public class StorageGroupProcessor {
*/
private void updateEndTimeMap(TsFileProcessor tsFileProcessor) {
TsFileResource resource = tsFileProcessor.getTsFileResource();
- for (Entry<String, Long> startTime :
resource.getStartTimeMap().entrySet()) {
+ for (Entry<String, Integer> startTime :
resource.getDeviceToIndexMap().entrySet()) {
String deviceId = startTime.getKey();
resource.forceUpdateEndTime(deviceId,
latestTimeForEachDevice.get(tsFileProcessor.getTimeRangeId()).get(deviceId));
@@ -1494,8 +1503,9 @@ public class StorageGroupProcessor {
List<TsFileResource> upgradedResources =
tsFileResource.getUpgradedResources();
for (TsFileResource resource : upgradedResources) {
long partitionId = resource.getTimePartition();
- resource.getEndTimeMap().forEach((device, time) ->
- updateNewlyFlushedPartitionLatestFlushedTimeForEachDevice(partitionId,
device, time)
+ resource.getDeviceToIndexMap().forEach((device, index) ->
+ updateNewlyFlushedPartitionLatestFlushedTimeForEachDevice(partitionId,
device,
+ resource.getEndTime(index))
);
}
insertLock.writeLock().lock();
@@ -1818,7 +1828,7 @@ public class StorageGroupProcessor {
return POS_ALREADY_EXIST;
}
long localPartitionId =
Long.parseLong(localFile.getFile().getParentFile().getName());
- if (i == sequenceList.size() - 1 && localFile.getEndTimeMap().isEmpty()
+ if (i == sequenceList.size() - 1 && localFile.areEndTimesEmpty()
|| newFilePartitionId > localPartitionId) {
// skip files that are in the previous partition and the last empty
file, as the all data
// in those files must be older than the new file
@@ -1852,14 +1862,14 @@ public class StorageGroupProcessor {
*/
private int compareTsFileDevices(TsFileResource fileA, TsFileResource fileB)
{
boolean hasPre = false, hasSubsequence = false;
- for (String device : fileA.getStartTimeMap().keySet()) {
- if (!fileB.getStartTimeMap().containsKey(device)) {
+ for (String device : fileA.getDeviceToIndexMap().keySet()) {
+ if (!fileB.getDeviceToIndexMap().containsKey(device)) {
continue;
}
- long startTimeA = fileA.getStartTimeMap().get(device);
- long endTimeA = fileA.getEndTimeMap().get(device);
- long startTimeB = fileB.getStartTimeMap().get(device);
- long endTimeB = fileB.getEndTimeMap().get(device);
+ long startTimeA = fileA.getStartTime(device);
+ long endTimeA = fileA.getEndTime(device);
+ long startTimeB = fileB.getStartTime(device);
+ long endTimeB = fileB.getEndTime(device);
if (startTimeA > endTimeB) {
// A's data of the device is later than to the B's data
hasPre = true;
@@ -1987,9 +1997,10 @@ public class StorageGroupProcessor {
* @UsedBy sync module, load external tsfile module.
*/
private void updateLatestTimeMap(TsFileResource newTsFileResource) {
- for (Entry<String, Long> entry :
newTsFileResource.getEndTimeMap().entrySet()) {
+ for (Entry<String, Integer> entry :
newTsFileResource.getDeviceToIndexMap().entrySet()) {
String device = entry.getKey();
- long endTime = newTsFileResource.getEndTimeMap().get(device);
+ int index = entry.getValue();
+ long endTime = newTsFileResource.getEndTime(index);
long timePartitionId = StorageEngine.getTimePartition(endTime);
if (!latestTimeForEachDevice.computeIfAbsent(timePartitionId, id -> new
HashMap<>())
.containsKey(device)
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 d51f68e..e3f7206 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
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -63,16 +64,23 @@ public class TsFileResource {
public static final String RESOURCE_SUFFIX = ".resource";
static final String TEMP_SUFFIX = ".temp";
private static final String CLOSING_SUFFIX = ".closing";
+ private static final int INIT_ARRAY_SIZE = 64;
/**
- * device -> start time
+ * start times array.
*/
- protected Map<String, Long> startTimeMap;
+ private long[] startTimes;
/**
- * device -> end time. It is null if it's an unsealed sequence tsfile
+ * end times array.
+ * The values in this array are Long.MIN_VALUE if it's an unsealed sequence
tsfile
*/
- protected Map<String, Long> endTimeMap;
+ private long[] endTimes;
+
+ /**
+ * device -> index of start times array and end times array
+ */
+ private Map<String, Integer> deviceToIndex;
public TsFileProcessor getProcessor() {
return processor;
@@ -136,8 +144,9 @@ public class TsFileResource {
public TsFileResource(TsFileResource other) throws IOException {
this.file = other.file;
- this.startTimeMap = other.startTimeMap;
- this.endTimeMap = other.endTimeMap;
+ this.deviceToIndex = other.deviceToIndex;
+ this.startTimes = other.startTimes;
+ this.endTimes = other.endTimes;
this.processor = other.processor;
this.modFile = other.modFile;
this.closed = other.closed;
@@ -156,8 +165,11 @@ public class TsFileResource {
*/
public TsFileResource(File file) {
this.file = file;
- this.startTimeMap = new ConcurrentHashMap<>();
- this.endTimeMap = new HashMap<>();
+ this.deviceToIndex = new ConcurrentHashMap<>();
+ this.startTimes = new long[INIT_ARRAY_SIZE];
+ this.endTimes = new long[INIT_ARRAY_SIZE];
+ initTimes(startTimes, Long.MAX_VALUE);
+ initTimes(endTimes, Long.MIN_VALUE);
}
/**
@@ -165,8 +177,11 @@ public class TsFileResource {
*/
public TsFileResource(File file, TsFileProcessor processor) {
this.file = file;
- this.startTimeMap = new ConcurrentHashMap<>();
- this.endTimeMap = new ConcurrentHashMap<>();
+ this.deviceToIndex = new ConcurrentHashMap<>();
+ this.startTimes = new long[INIT_ARRAY_SIZE];
+ this.endTimes = new long[INIT_ARRAY_SIZE];
+ initTimes(startTimes, Long.MAX_VALUE);
+ initTimes(endTimes, Long.MIN_VALUE);
this.processor = processor;
}
@@ -174,13 +189,15 @@ public class TsFileResource {
* unsealed TsFile
*/
public TsFileResource(File file,
- Map<String, Long> startTimeMap,
- Map<String, Long> endTimeMap,
+ Map<String, Integer> deviceToIndex,
+ long[] startTimes,
+ long[] endTimes,
List<ReadOnlyMemChunk> readOnlyMemChunk,
List<ChunkMetadata> chunkMetadataList) throws IOException {
this.file = file;
- this.startTimeMap = startTimeMap;
- this.endTimeMap = endTimeMap;
+ this.deviceToIndex = deviceToIndex;
+ this.startTimes = startTimes;
+ this.endTimes = endTimes;
this.chunkMetadataList = chunkMetadataList;
this.readOnlyMemChunk = readOnlyMemChunk;
generateTimeSeriesMetadata();
@@ -221,18 +238,22 @@ public class TsFileResource {
}
}
+ private void initTimes(long[] times, long defaultTime) {
+ Arrays.fill(times, defaultTime);
+ }
+
public void serialize() throws IOException {
try (OutputStream outputStream = fsFactory.getBufferedOutputStream(
file + RESOURCE_SUFFIX + TEMP_SUFFIX)) {
- ReadWriteIOUtils.write(this.startTimeMap.size(), outputStream);
- for (Entry<String, Long> entry : this.startTimeMap.entrySet()) {
+ ReadWriteIOUtils.write(this.deviceToIndex.size(), outputStream);
+ for (Entry<String, Integer> entry : this.deviceToIndex.entrySet()) {
ReadWriteIOUtils.write(entry.getKey(), outputStream);
- ReadWriteIOUtils.write(entry.getValue(), outputStream);
+ ReadWriteIOUtils.write(startTimes[entry.getValue()], outputStream);
}
- ReadWriteIOUtils.write(this.endTimeMap.size(), outputStream);
- for (Entry<String, Long> entry : this.endTimeMap.entrySet()) {
+ ReadWriteIOUtils.write(this.deviceToIndex.size(), outputStream);
+ for (Entry<String, Integer> entry : this.deviceToIndex.entrySet()) {
ReadWriteIOUtils.write(entry.getKey(), outputStream);
- ReadWriteIOUtils.write(entry.getValue(), outputStream);
+ ReadWriteIOUtils.write(endTimes[entry.getValue()], outputStream);
}
if (historicalVersions != null) {
@@ -252,21 +273,24 @@ public class TsFileResource {
try (InputStream inputStream = fsFactory.getBufferedInputStream(
file + RESOURCE_SUFFIX)) {
int size = ReadWriteIOUtils.readInt(inputStream);
- Map<String, Long> startTimes = new HashMap<>();
+ Map<String, Integer> deviceMap = new HashMap<>();
+ long[] startTimesArray = new long[size];
+ long[] endTimesArray = new long[size];
for (int i = 0; i < size; i++) {
String path = ReadWriteIOUtils.readString(inputStream);
long time = ReadWriteIOUtils.readLong(inputStream);
- startTimes.put(path, time);
+ deviceMap.put(path, i);
+ startTimesArray[i] = time;
}
size = ReadWriteIOUtils.readInt(inputStream);
- Map<String, Long> endTimes = new HashMap<>();
for (int i = 0; i < size; i++) {
- String path = ReadWriteIOUtils.readString(inputStream);
+ ReadWriteIOUtils.readString(inputStream); // String path
long time = ReadWriteIOUtils.readLong(inputStream);
- endTimes.put(path, time);
+ endTimesArray[i] = time;
}
- this.startTimeMap = startTimes;
- this.endTimeMap = endTimes;
+ this.startTimes = startTimesArray;
+ this.endTimes = endTimesArray;
+ this.deviceToIndex = deviceMap;
if (inputStream.available() > 0) {
int versionSize = ReadWriteIOUtils.readInt(inputStream);
@@ -283,16 +307,16 @@ public class TsFileResource {
}
public void updateStartTime(String device, long time) {
- long startTime = startTimeMap.getOrDefault(device, Long.MAX_VALUE);
+ long startTime = getStartTime(device);
if (time < startTime) {
- startTimeMap.put(device, time);
+ putStartTime(device, time);
}
}
public void updateEndTime(String device, long time) {
- long endTime = endTimeMap.getOrDefault(device, Long.MIN_VALUE);
+ long endTime = getEndTime(device);
if (time > endTime) {
- endTimeMap.put(device, time);
+ putEndTime(device, time);
}
}
@@ -301,7 +325,7 @@ public class TsFileResource {
}
void forceUpdateEndTime(String device, long time) {
- endTimeMap.put(device, time);
+ putEndTime(device, time);
}
public List<ChunkMetadata> getChunkMetadataList() {
@@ -324,7 +348,7 @@ public class TsFileResource {
}
boolean containsDevice(String deviceId) {
- return startTimeMap.containsKey(deviceId);
+ return deviceToIndex.containsKey(deviceId);
}
public File getFile() {
@@ -339,12 +363,106 @@ public class TsFileResource {
return file.length();
}
- public Map<String, Long> getStartTimeMap() {
- return startTimeMap;
+ public long getStartTime(String deviceId) {
+ if (!deviceToIndex.containsKey(deviceId)) {
+ return Long.MAX_VALUE;
+ }
+ return startTimes[deviceToIndex.get(deviceId)];
+ }
+
+ public long getStartTime(int index) {
+ return startTimes[index];
+ }
+
+ public long getEndTime(String deviceId) {
+ if (!deviceToIndex.containsKey(deviceId)) {
+ return Long.MIN_VALUE;
+ }
+ return endTimes[deviceToIndex.get(deviceId)];
+ }
+
+ public long getEndTime(int index) {
+ return endTimes[index];
+ }
+
+ public long getOrDefaultStartTime(String deviceId, long defaultTime) {
+ long startTime = getStartTime(deviceId);
+ return startTime != Long.MAX_VALUE ? startTime : defaultTime;
+ }
+
+ public long getOrDefaultEndTime(String deviceId, long defaultTime) {
+ long endTime = getEndTime(deviceId);
+ return endTime != Long.MIN_VALUE ? endTime : defaultTime;
+ }
+
+ public void putStartTime(String deviceId, long startTime) {
+ int index;
+ if (containsDevice(deviceId)) {
+ index = deviceToIndex.get(deviceId);
+ }
+ else {
+ index = deviceToIndex.size();
+ deviceToIndex.put(deviceId, index);
+ if (startTimes.length <= index) {
+ startTimes = enLargeArray(startTimes, Long.MAX_VALUE);
+ endTimes = enLargeArray(endTimes, Long.MIN_VALUE);
+ }
+ }
+ startTimes[index] = startTime;
+ }
+
+ public void putEndTime(String deviceId, long endTime) {
+ int index;
+ if (containsDevice(deviceId)) {
+ index = deviceToIndex.get(deviceId);
+ }
+ else {
+ index = deviceToIndex.size();
+ deviceToIndex.put(deviceId, index);
+ if (endTimes.length <= index) {
+ startTimes = enLargeArray(startTimes, Long.MAX_VALUE);
+ endTimes = enLargeArray(endTimes, Long.MIN_VALUE);
+ }
+ }
+ endTimes[index] = endTime;
+ }
+
+ private long[] enLargeArray(long[] array, long defaultValue) {
+ long[] tmp = new long[(int) (array.length * 1.5)];
+ initTimes(tmp, defaultValue);
+ System.arraycopy(array, 0, tmp, 0, array.length);
+ return tmp;
+ }
+
+ public Map<String, Integer> getDeviceToIndexMap() {
+ return deviceToIndex;
+ }
+
+ public long[] getStartTimes() {
+ return startTimes;
+ }
+
+ public long[] getEndTimes() {
+ return endTimes;
+ }
+
+ public void clearEndTimes() {
+ endTimes = new long[endTimes.length];
+ initTimes(endTimes, Long.MIN_VALUE);
+ }
+
+ public boolean areEndTimesEmpty() {
+ for (long endTime : endTimes) {
+ if (endTime != -1) {
+ return false;
+ }
+ }
+ return true;
}
- public Map<String, Long> getEndTimeMap() {
- return endTimeMap;
+ private void trimStartEndTimes() {
+ startTimes = Arrays.copyOfRange(startTimes, 0, deviceToIndex.size());
+ endTimes = Arrays.copyOfRange(endTimes, 0, deviceToIndex.size());
}
public boolean isClosed() {
@@ -359,6 +477,7 @@ public class TsFileResource {
}
processor = null;
chunkMetadataList = null;
+ trimStartEndTimes();
}
TsFileProcessor getUnsealedFileProcessor() {
@@ -446,7 +565,7 @@ public class TsFileResource {
if (timeLowerBound == Long.MAX_VALUE) {
return true;
}
- for (long endTime : endTimeMap.values()) {
+ for (long endTime : endTimes) {
// the file cannot be deleted if any device still lives
if (endTime >= timeLowerBound) {
return true;
@@ -455,12 +574,12 @@ public class TsFileResource {
return false;
}
- protected void setStartTimeMap(Map<String, Long> startTimeMap) {
- this.startTimeMap = startTimeMap;
+ protected void setStartTimes(long[] startTimes) {
+ this.startTimes = startTimes;
}
- protected void setEndTimeMap(Map<String, Long> endTimeMap) {
- this.endTimeMap = endTimeMap;
+ protected void setEndTimes(long[] endTimes) {
+ this.endTimes= endTimes;
}
/**
@@ -531,12 +650,12 @@ public class TsFileResource {
}
/**
- * make sure Either the startTimeMap is not empty
+ * make sure Either the deviceToIndex is not empty
* Or the path contains a partition folder
*/
public long getTimePartition() {
- if (startTimeMap != null && !startTimeMap.isEmpty()) {
- return
StorageEngine.getTimePartition(startTimeMap.values().iterator().next());
+ if (deviceToIndex != null && !deviceToIndex.isEmpty()) {
+ return
StorageEngine.getTimePartition(startTimes[deviceToIndex.values().iterator().next()]);
}
String[] splits = FilePathUtils.splitTsFilePath(this);
return Long.parseLong(splits[splits.length - 2]);
@@ -550,7 +669,7 @@ public class TsFileResource {
*/
public long getTimePartitionWithCheck() throws PartitionViolationException {
long partitionId = -1;
- for (Long startTime : startTimeMap.values()) {
+ for (Long startTime : startTimes) {
long p = StorageEngine.getTimePartition(startTime);
if (partitionId == -1) {
partitionId = p;
@@ -560,7 +679,7 @@ public class TsFileResource {
}
}
}
- for (Long endTime : endTimeMap.values()) {
+ for (Long endTime : endTimes) {
long p = StorageEngine.getTimePartition(endTime);
if (partitionId == -1) {
partitionId = p;
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
index 28c6870..33ab8a4 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
@@ -159,7 +159,7 @@ public class LastQueryExecutor {
long version = 0;
for (TsFileResource resource : unseqFileResources) {
- if (resource.getEndTimeMap().get(seriesPath.getDevice()) <
resultPair.getTimestamp()) {
+ if (resource.getEndTime(seriesPath.getDevice()) <
resultPair.getTimestamp()) {
continue;
}
TimeseriesMetadata timeseriesMetadata =
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LastPointReader.java
b/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LastPointReader.java
index ac80a16..57c244b 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LastPointReader.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/executor/fill/LastPointReader.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.query.executor.fill;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import java.util.PriorityQueue;
import java.util.Set;
import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
@@ -125,7 +124,7 @@ public class LastPointReader {
sortUnSeqFileResourcesInDecendingOrder(dataSource.getUnseqResources());
while (!unseqFileResource.isEmpty()
- && (lBoundTime <=
unseqFileResource.peek().getEndTimeMap().get(seriesPath.getDevice()))) {
+ && (lBoundTime <=
unseqFileResource.peek().getEndTime(seriesPath.getDevice()))) {
TimeseriesMetadata timeseriesMetadata =
FileLoaderUtils.loadTimeSeriesMetadata(
unseqFileResource.poll(), seriesPath, context, timeFilter,
allSensors);
@@ -183,12 +182,9 @@ public class LastPointReader {
PriorityQueue<TsFileResource> unseqTsFilesSet =
new PriorityQueue<>(
(o1, o2) -> {
- Map<String, Long> startTimeMap = o1.getEndTimeMap();
- Long minTimeOfO1 = startTimeMap.get(seriesPath.getDevice());
- Map<String, Long> startTimeMap2 = o2.getEndTimeMap();
- Long minTimeOfO2 = startTimeMap2.get(seriesPath.getDevice());
-
- return Long.compare(minTimeOfO2, minTimeOfO1);
+ Long maxTimeOfO1 = o1.getEndTime(seriesPath.getDevice());
+ Long maxTimeOfO2 = o2.getEndTime(seriesPath.getDevice());
+ return Long.compare(maxTimeOfO2, maxTimeOfO1);
});
unseqTsFilesSet.addAll(tsFileResources);
return unseqTsFilesSet;
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index 0e04e23..816be29 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -573,7 +573,7 @@ class SeriesReader {
return tsFileResources.stream()
.sorted(
Comparator.comparingLong(
- tsFileResource ->
tsFileResource.getStartTimeMap().get(seriesPath.getDevice())))
+ tsFileResource ->
tsFileResource.getStartTime(seriesPath.getDevice())))
.collect(Collectors.toCollection(LinkedList::new));
}
@@ -660,7 +660,7 @@ class SeriesReader {
private void unpackAllOverlappedTsFilesToTimeSeriesMetadata(long endTime)
throws IOException {
while (!unseqFileResource.isEmpty()
- && endTime >=
unseqFileResource.get(0).getStartTimeMap().get(seriesPath.getDevice())) {
+ && endTime >=
unseqFileResource.get(0).getStartTime(seriesPath.getDevice())) {
TimeseriesMetadata timeseriesMetadata =
FileLoaderUtils.loadTimeSeriesMetadata(
unseqFileResource.remove(0), seriesPath, context,
getAnyFilter(), allSensors);
@@ -670,7 +670,7 @@ class SeriesReader {
}
}
while (!seqFileResource.isEmpty()
- && endTime >=
seqFileResource.get(0).getStartTimeMap().get(seriesPath.getDevice())) {
+ && endTime >=
seqFileResource.get(0).getStartTime(seriesPath.getDevice())) {
TimeseriesMetadata timeseriesMetadata =
FileLoaderUtils.loadTimeSeriesMetadata(
seqFileResource.remove(0), seriesPath, context, getAnyFilter(),
allSensors);
diff --git
a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderManager.java
b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderManager.java
index 289d477..4eb911d 100644
---
a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderManager.java
@@ -95,7 +95,7 @@ public class FileLoaderManager {
throws SyncDeviceOwnerConflictException, IOException {
String curOwner =
tsFileResource.getFile().getParentFile().getParentFile().getParentFile()
.getName();
- Set<String> deviceSet = tsFileResource.getStartTimeMap().keySet();
+ Set<String> deviceSet = tsFileResource.getDeviceToIndexMap().keySet();
checkDeviceConflict(curOwner, deviceSet);
updateDeviceOwner(curOwner, deviceSet);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/tools/IoTDBDataDirViewer.java
b/server/src/main/java/org/apache/iotdb/db/tools/IoTDBDataDirViewer.java
index 68c2857..85ad43b 100644
--- a/server/src/main/java/org/apache/iotdb/db/tools/IoTDBDataDirViewer.java
+++ b/server/src/main/java/org/apache/iotdb/db/tools/IoTDBDataDirViewer.java
@@ -136,14 +136,14 @@ public class IoTDBDataDirViewer {
TsFileResource resource = new
TsFileResource(SystemFileFactory.INSTANCE.getFile(filename));
resource.deserialize();
// sort device strings
- SortedSet<String> keys = new
TreeSet<>(resource.getStartTimeMap().keySet());
+ SortedSet<String> keys = new
TreeSet<>(resource.getDeviceToIndexMap().keySet());
for (String device : keys) {
printlnBoth(pw,
String.format("| | | | |--device %s, start time %d (%s), end
time %d (%s)", device,
- resource.getStartTimeMap().get(device), DatetimeUtils
-
.convertMillsecondToZonedDateTime(resource.getStartTimeMap().get(device)),
- resource.getEndTimeMap().get(device), DatetimeUtils
-
.convertMillsecondToZonedDateTime(resource.getEndTimeMap().get(device))));
+ resource.getStartTime(device), DatetimeUtils
+
.convertMillsecondToZonedDateTime(resource.getStartTime(device)),
+ resource.getEndTime(device), DatetimeUtils
+
.convertMillsecondToZonedDateTime(resource.getEndTime(device))));
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/tools/TsFileResourcePrinter.java
b/server/src/main/java/org/apache/iotdb/db/tools/TsFileResourcePrinter.java
index 03e97d1..ffd2bc4 100644
--- a/server/src/main/java/org/apache/iotdb/db/tools/TsFileResourcePrinter.java
+++ b/server/src/main/java/org/apache/iotdb/db/tools/TsFileResourcePrinter.java
@@ -58,16 +58,16 @@ public class TsFileResourcePrinter {
System.out.println("historicalVersions: " +
resource.getHistoricalVersions());
- for (String device : resource.getStartTimeMap().keySet()) {
+ for (String device : resource.getDeviceToIndexMap().keySet()) {
System.out.println(String.format(
"device %s, "
+ "start time %d (%s), "
+ "end time %d (%s)",
device,
- resource.getStartTimeMap().get(device),
-
DatetimeUtils.convertMillsecondToZonedDateTime(resource.getStartTimeMap().get(device)),
- resource.getEndTimeMap().get(device),
-
DatetimeUtils.convertMillsecondToZonedDateTime(resource.getEndTimeMap().get(device))));
+ resource.getStartTime(device),
+
DatetimeUtils.convertMillsecondToZonedDateTime(resource.getStartTime(device)),
+ resource.getEndTime(device),
+
DatetimeUtils.convertMillsecondToZonedDateTime(resource.getEndTime(device))));
}
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
index b5574a4..9ad8fbf 100644
--- a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
@@ -127,8 +127,8 @@ public class LogReplayer {
throws WriteProcessException, QueryProcessException {
if (currentTsFileResource != null) {
// the last chunk group may contain the same data with the logs, ignore
such logs in seq file
- Long lastEndTime =
currentTsFileResource.getEndTimeMap().get(insertTabletPlan.getDeviceId());
- if (lastEndTime != null && lastEndTime >= insertTabletPlan.getMinTime()
&&
+ long lastEndTime =
currentTsFileResource.getEndTime(insertTabletPlan.getDeviceId());
+ if (lastEndTime != Long.MIN_VALUE && lastEndTime >=
insertTabletPlan.getMinTime() &&
!acceptDuplication) {
return;
}
@@ -155,8 +155,8 @@ public class LogReplayer {
private void replayInsert(InsertPlan insertPlan) {
if (currentTsFileResource != null) {
// the last chunk group may contain the same data with the logs, ignore
such logs in seq file
- Long lastEndTime =
currentTsFileResource.getEndTimeMap().get(insertPlan.getDeviceId());
- if (lastEndTime != null && lastEndTime >= insertPlan.getTime() &&
+ long lastEndTime =
currentTsFileResource.getEndTime(insertPlan.getDeviceId());
+ if (lastEndTime != Long.MIN_VALUE && lastEndTime >= insertPlan.getTime()
&&
!acceptDuplication) {
return;
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java
index 4398041..9b356bd 100644
---
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java
@@ -282,9 +282,8 @@ public class TsFileProcessorTest {
private void closeTsFileProcessor(TsFileProcessor unsealedTsFileProcessor)
throws TsFileProcessorException {
TsFileResource resource = unsealedTsFileProcessor.getTsFileResource();
synchronized (resource) {
- for (Entry<String, Long> startTime :
resource.getStartTimeMap().entrySet()) {
- String deviceId = startTime.getKey();
- resource.getEndTimeMap().put(deviceId,
resource.getStartTimeMap().get(deviceId));
+ for (Entry<String, Integer> entry :
resource.getDeviceToIndexMap().entrySet()) {
+ resource.putEndTime(entry.getKey(),
resource.getStartTime(entry.getValue()));
}
try {
resource.close();
diff --git
a/server/src/test/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderTest.java
b/server/src/test/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderTest.java
index 4324193..a30e18c 100644
---
a/server/src/test/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/sync/receiver/load/FileLoaderTest.java
@@ -114,8 +114,8 @@ public class FileLoaderTest {
LOGGER.error("Can not create new file {}", syncFile.getPath());
}
TsFileResource tsFileResource = new TsFileResource(syncFile);
- tsFileResource.getStartTimeMap().put(String.valueOf(i), (long) j * 10);
- tsFileResource.getEndTimeMap().put(String.valueOf(i), (long) j * 10 +
5);
+ tsFileResource.putStartTime(String.valueOf(i), (long) j * 10);
+ tsFileResource.putEndTime(String.valueOf(i), (long) j * 10 + 5);
tsFileResource.serialize();
}
}
@@ -209,8 +209,8 @@ public class FileLoaderTest {
LOGGER.error("Can not create new file {}", syncFile.getPath());
}
TsFileResource tsFileResource = new TsFileResource(syncFile);
- tsFileResource.getStartTimeMap().put(String.valueOf(i), (long) j * 10);
- tsFileResource.getEndTimeMap().put(String.valueOf(i), (long) j * 10 +
5);
+ tsFileResource.putStartTime(String.valueOf(i), (long) j * 10);
+ tsFileResource.putEndTime(String.valueOf(i), (long) j * 10 + 5);
tsFileResource.serialize();
}
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzerTest.java
b/server/src/test/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzerTest.java
index 3ce1019..1ea2f3a 100644
---
a/server/src/test/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzerTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzerTest.java
@@ -125,8 +125,8 @@ public class SyncReceiverLogAnalyzerTest {
LOGGER.error("Can not create new file {}", syncFile.getPath());
}
TsFileResource tsFileResource = new TsFileResource(syncFile);
- tsFileResource.getStartTimeMap().put(String.valueOf(i), (long) j * 10);
- tsFileResource.getEndTimeMap().put(String.valueOf(i), (long) j * 10 +
5);
+ tsFileResource.putStartTime(String.valueOf(i), (long) j * 10);
+ tsFileResource.putEndTime(String.valueOf(i), (long) j * 10 + 5);
tsFileResource.serialize();
}
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
index 37e263b..ab52edb 100644
---
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
@@ -138,11 +138,11 @@ public class LogReplayerTest {
assertEquals(1, mods.length);
assertEquals(new Deletion(new Path("root.sg.device0", "sensor0"), 5,
200), mods[0]);
- assertEquals(2, (long)
tsFileResource.getStartTimeMap().get("root.sg.device0"));
- assertEquals(100, (long)
tsFileResource.getEndTimeMap().get("root.sg.device0"));
+ assertEquals(2, (long) tsFileResource.getStartTime("root.sg.device0"));
+ assertEquals(100, (long) tsFileResource.getEndTime("root.sg.device0"));
for (int i = 1; i < 5; i++) {
- assertEquals(i, (long)
tsFileResource.getStartTimeMap().get("root.sg.device" + i));
- assertEquals(i, (long)
tsFileResource.getEndTimeMap().get("root.sg.device" + i));
+ assertEquals(i, (long) tsFileResource.getStartTime("root.sg.device" +
i));
+ assertEquals(i, (long) tsFileResource.getEndTime("root.sg.device" +
i));
}
} finally {
modFile.close();
diff --git
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java
index 3c1435b..00e3e4c 100644
---
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java
@@ -186,11 +186,11 @@ public class RecoverResourceFromReaderTest {
ActiveTimeSeriesCounter.getInstance()
.init(resource.getFile().getParentFile().getParentFile().getName());
performer.recover();
- assertEquals(1, (long) resource.getStartTimeMap().get("root.sg.device99"));
- assertEquals(300, (long) resource.getEndTimeMap().get("root.sg.device99"));
+ assertEquals(1, (long) resource.getStartTime("root.sg.device99"));
+ assertEquals(300, (long) resource.getEndTime("root.sg.device99"));
for (int i = 0; i < 10; i++) {
- assertEquals(0, (long) resource.getStartTimeMap().get("root.sg.device" +
i));
- assertEquals(9, (long) resource.getEndTimeMap().get("root.sg.device" +
i));
+ assertEquals(0, (long) resource.getStartTime("root.sg.device" + i));
+ assertEquals(9, (long) resource.getEndTime("root.sg.device" + i));
}
}
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
index ac5ae05..c3b3b06 100644
---
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
@@ -175,11 +175,11 @@ public class SeqTsFileRecoverTest {
RestorableTsFileIOWriter writer = performer.recover();
assertFalse(writer.canWrite());
- assertEquals(2, (long) resource.getStartTimeMap().get("root.sg.device99"));
- assertEquals(100, (long) resource.getEndTimeMap().get("root.sg.device99"));
+ assertEquals(2, (long) resource.getStartTime("root.sg.device99"));
+ assertEquals(100, (long) resource.getEndTime("root.sg.device99"));
for (int i = 0; i < 10; i++) {
- assertEquals(0, (long) resource.getStartTimeMap().get("root.sg.device" +
i));
- assertEquals(19, (long) resource.getEndTimeMap().get("root.sg.device" +
i));
+ assertEquals(0, (long) resource.getStartTime("root.sg.device" + i));
+ assertEquals(19, (long) resource.getEndTime("root.sg.device" + i));
}
ReadOnlyTsFile readOnlyTsFile = new ReadOnlyTsFile(new
TsFileSequenceReader(tsF.getPath()));
@@ -229,11 +229,11 @@ public class SeqTsFileRecoverTest {
assertTrue(writer.canWrite());
writer.endFile();
- assertEquals(2, (long) resource.getStartTimeMap().get("root.sg.device99"));
- assertEquals(100, (long) resource.getEndTimeMap().get("root.sg.device99"));
+ assertEquals(2, (long) resource.getStartTime("root.sg.device99"));
+ assertEquals(100, (long) resource.getEndTime("root.sg.device99"));
for (int i = 0; i < 10; i++) {
- assertEquals(0, (long) resource.getStartTimeMap().get("root.sg.device" +
i));
- assertEquals(19, (long) resource.getEndTimeMap().get("root.sg.device" +
i));
+ assertEquals(0, (long) resource.getStartTime("root.sg.device" + i));
+ assertEquals(19, (long) resource.getEndTime("root.sg.device" + i));
}
ReadOnlyTsFile readOnlyTsFile = new ReadOnlyTsFile(new
TsFileSequenceReader(tsF.getPath()));
diff --git
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
index 016fb60..8b9c697 100644
---
a/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
@@ -183,11 +183,11 @@ public class UnseqTsFileRecoverTest {
.init(resource.getFile().getParentFile().getParentFile().getName());
performer.recover();
- assertEquals(1, (long) resource.getStartTimeMap().get("root.sg.device99"));
- assertEquals(300, (long) resource.getEndTimeMap().get("root.sg.device99"));
+ assertEquals(1, (long) resource.getStartTime("root.sg.device99"));
+ assertEquals(300, (long) resource.getEndTime("root.sg.device99"));
for (int i = 0; i < 10; i++) {
- assertEquals(0, (long) resource.getStartTimeMap().get("root.sg.device" +
i));
- assertEquals(9, (long) resource.getEndTimeMap().get("root.sg.device" +
i));
+ assertEquals(0, (long) resource.getStartTime("root.sg.device" + i));
+ assertEquals(9, (long) resource.getEndTime("root.sg.device" + i));
}
TsFileSequenceReader fileReader = new TsFileSequenceReader(tsF.getPath(),
true);