Skip to content

Commit 1a3f960

Browse files
authored
Replace the key in FileReaderManager to TsFileID
1 parent e102e33 commit 1a3f960

29 files changed

Lines changed: 116 additions & 85 deletions

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/buffer/BloomFilterCache.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,12 @@ public BloomFilter apply(BloomFilterCacheKey bloomFilterCacheKey) {
199199
try {
200200
cacheMiss = true;
201201
TsFileSequenceReader reader =
202-
FileReaderManager.getInstance().get(bloomFilterCacheKey.filePath, true, ioSizeRecorder);
202+
FileReaderManager.getInstance()
203+
.get(
204+
bloomFilterCacheKey.filePath,
205+
bloomFilterCacheKey.tsFileID,
206+
true,
207+
ioSizeRecorder);
203208
return reader.readBloomFilter(ioSizeRecorder);
204209
} catch (IOException e) {
205210
throw new IoTDBIORuntimeException(e);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/buffer/ChunkCache.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,8 @@ public Chunk apply(ChunkCacheKey key) {
289289
try {
290290
cacheMiss = true;
291291
TsFileSequenceReader reader =
292-
FileReaderManager.getInstance().get(key.getFilePath(), key.closed, ioSizeRecorder);
292+
FileReaderManager.getInstance()
293+
.get(key.getFilePath(), key.tsFileID, key.closed, ioSizeRecorder);
293294
Chunk chunk = reader.readMemChunk(key.offsetOfChunkHeader, ioSizeRecorder);
294295
// to save memory footprint, we don't save measurementId in ChunkHeader of Chunk
295296
chunk.getHeader().setMeasurementID(null);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/buffer/TimeSeriesMetadataCache.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ public TimeseriesMetadata get(
127127

128128
// bloom filter part
129129
TsFileSequenceReader reader =
130-
FileReaderManager.getInstance().get(filePath, true, bloomFilterIoSizeRecorder);
130+
FileReaderManager.getInstance()
131+
.get(filePath, key.tsFileID, true, bloomFilterIoSizeRecorder);
131132
BloomFilter bloomFilter = reader.readBloomFilter(bloomFilterIoSizeRecorder);
132133
queryContext.getQueryStatistics().getLoadBloomFilterFromDiskCount().incrementAndGet();
133134
if (bloomFilter != null
@@ -192,7 +193,7 @@ public TimeseriesMetadata get(
192193
loadBloomFilterTime = System.nanoTime() - loadBloomFilterStartTime;
193194
TsFileSequenceReader reader =
194195
FileReaderManager.getInstance()
195-
.get(filePath, true, timeSeriesMetadataIoSizeRecorder);
196+
.get(filePath, key.tsFileID, true, timeSeriesMetadataIoSizeRecorder);
196197
List<TimeseriesMetadata> timeSeriesMetadataList =
197198
reader.readTimeseriesMetadata(
198199
key.device,

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2868,7 +2868,7 @@ private void settleTsFileCallBack(
28682868
if (!oldTsFileResource.getTsFile().exists()) {
28692869
tsFileManager.remove(oldTsFileResource, oldTsFileResource.isSeq());
28702870
}
2871-
FileReaderManager.getInstance().closeFileAndRemoveReader(oldTsFileResource.getTsFilePath());
2871+
FileReaderManager.getInstance().closeFileAndRemoveReader(oldTsFileResource.getTsFileID());
28722872
oldTsFileResource.setSettleTsFileCallBack(null);
28732873
SettleService.getINSTANCE().getFilesToBeSettledCount().addAndGet(-1);
28742874
} catch (IOException e) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ public MultiTsFileDeviceIterator(
119119
this.tsFileResourcesSortedByDesc, TsFileResource::compareFileCreationOrderByDesc);
120120
for (TsFileResource tsFileResource : tsFileResourcesSortedByDesc) {
121121
TsFileSequenceReader reader =
122-
FileReaderManager.getInstance().get(tsFileResource.getTsFilePath(), true);
122+
FileReaderManager.getInstance()
123+
.get(tsFileResource.getTsFilePath(), tsFileResource.getTsFileID(), true);
123124
readerMap.put(tsFileResource, reader);
124125
deviceIteratorMap.put(tsFileResource, reader.getAllDevicesIteratorWithIsAligned());
125126
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ public void write(TsBlock tsBlock, int subTaskId) throws IOException {
7373

7474
@Override
7575
protected TsFileSequenceReader getFileReader(TsFileResource resource) throws IOException {
76-
return FileReaderManager.getInstance().get(resource.getTsFilePath(), true);
76+
return FileReaderManager.getInstance()
77+
.get(resource.getTsFilePath(), resource.getTsFileID(), true);
7778
}
7879

7980
@Override

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,6 +1670,7 @@ private void processAlignedChunkMetaDataFromFlushedMemTable(
16701670
deviceID,
16711671
measurement,
16721672
filePath,
1673+
tsFileResource.getTsFileID(),
16731674
false,
16741675
valueChunkMetaData.getOffsetOfChunkHeader(),
16751676
valueChunkMetaData.getStatistics(),
@@ -1694,6 +1695,7 @@ private void processChunkMetaDataFromFlushedMemTable(
16941695
deviceID,
16951696
measurement,
16961697
filePath,
1698+
tsFileResource.getTsFileID(),
16971699
false,
16981700
chunkMetadata.getOffsetOfChunkHeader(),
16991701
chunkMetadata.getStatistics()));

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.iotdb.db.storageengine.dataregion.read.control;
2121

2222
import org.apache.iotdb.commons.utils.TestOnly;
23+
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileID;
2324
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
2425

2526
import org.apache.tsfile.common.conf.TSFileConfig;
@@ -58,25 +59,25 @@ public class FileReaderManager {
5859
* the key of closedFileReaderMap is the file path and the value of closedFileReaderMap is the
5960
* corresponding reader.
6061
*/
61-
private Map<String, TsFileSequenceReader> closedFileReaderMap;
62+
private Map<TsFileID, TsFileSequenceReader> closedFileReaderMap;
6263

6364
/**
6465
* the key of unclosedFileReaderMap is the file path and the value of unclosedFileReaderMap is the
6566
* corresponding reader.
6667
*/
67-
private Map<String, TsFileSequenceReader> unclosedFileReaderMap;
68+
private Map<TsFileID, TsFileSequenceReader> unclosedFileReaderMap;
6869

6970
/**
7071
* the key of closedFileReaderMap is the file path and the value of closedFileReaderMap is the
7172
* file's reference count.
7273
*/
73-
private Map<String, AtomicInteger> closedReferenceMap;
74+
private Map<TsFileID, AtomicInteger> closedReferenceMap;
7475

7576
/**
7677
* the key of unclosedFileReaderMap is the file path and the value of unclosedFileReaderMap is the
7778
* file's reference count.
7879
*/
79-
private Map<String, AtomicInteger> unclosedReferenceMap;
80+
private Map<TsFileID, AtomicInteger> unclosedReferenceMap;
8081

8182
private FileReaderManager() {
8283
closedFileReaderMap = new ConcurrentHashMap<>();
@@ -89,14 +90,14 @@ public static FileReaderManager getInstance() {
8990
return FileReaderManagerHelper.INSTANCE;
9091
}
9192

92-
public synchronized void closeFileAndRemoveReader(String filePath) throws IOException {
93-
closedReferenceMap.remove(filePath);
94-
TsFileSequenceReader reader = closedFileReaderMap.remove(filePath);
93+
public synchronized void closeFileAndRemoveReader(TsFileID tsFileID) throws IOException {
94+
closedReferenceMap.remove(tsFileID);
95+
TsFileSequenceReader reader = closedFileReaderMap.remove(tsFileID);
9596
if (reader != null) {
9697
reader.close();
9798
}
98-
unclosedReferenceMap.remove(filePath);
99-
reader = unclosedFileReaderMap.remove(filePath);
99+
unclosedReferenceMap.remove(tsFileID);
100+
reader = unclosedFileReaderMap.remove(tsFileID);
100101
if (reader != null) {
101102
reader.close();
102103
}
@@ -107,35 +108,38 @@ public synchronized void closeFileAndRemoveReader(String filePath) throws IOExce
107108
* exists, just get it from closedFileReaderMap or unclosedFileReaderMap depending on isClosing .
108109
* Otherwise a new reader will be created and cached.
109110
*
110-
* @param filePath the path of the file, of which the reader is desired.
111+
* @param filePath the path of the tsfile
112+
* @param tsFileID the id of the tsfile, of which the reader is desired.
111113
* @param isClosed whether the corresponding file still receives insertions or not.
112114
* @return the reader of the file specified by filePath.
113115
* @throws IOException when reader cannot be created.
114116
*/
115117
@SuppressWarnings("squid:S2095")
116-
public synchronized TsFileSequenceReader get(String filePath, boolean isClosed)
118+
public synchronized TsFileSequenceReader get(String filePath, TsFileID tsFileID, boolean isClosed)
117119
throws IOException {
118-
return get(filePath, isClosed, null);
120+
return get(filePath, tsFileID, isClosed, null);
119121
}
120122

121123
/**
122124
* Get the reader of the file(tsfile or unseq tsfile) indicated by filePath. If the reader already
123125
* exists, just get it from closedFileReaderMap or unclosedFileReaderMap depending on isClosing .
124126
* Otherwise a new reader will be created and cached.
125127
*
126-
* @param filePath the path of the file, of which the reader is desired.
128+
* @param filePath the path of the tsfile
129+
* @param tsFileID the id of the tsfile, of which the reader is desired.
127130
* @param isClosed whether the corresponding file still receives insertions or not.
128131
* @param ioSizeRecorder can be null
129132
* @return the reader of the file specified by filePath.
130133
* @throws IOException when reader cannot be created.
131134
*/
132135
@SuppressWarnings("squid:S2095")
133136
public synchronized TsFileSequenceReader get(
134-
String filePath, boolean isClosed, LongConsumer ioSizeRecorder) throws IOException {
137+
String filePath, TsFileID tsFileID, boolean isClosed, LongConsumer ioSizeRecorder)
138+
throws IOException {
135139

136-
Map<String, TsFileSequenceReader> readerMap =
140+
Map<TsFileID, TsFileSequenceReader> readerMap =
137141
!isClosed ? unclosedFileReaderMap : closedFileReaderMap;
138-
if (!readerMap.containsKey(filePath)) {
142+
if (!readerMap.containsKey(tsFileID)) {
139143
int currentOpenedReaderCount = readerMap.size();
140144
if (currentOpenedReaderCount >= MAX_CACHED_FILE_SIZE
141145
&& (currentOpenedReaderCount % PRINT_INTERVAL == 0)) {
@@ -156,11 +160,11 @@ public synchronized TsFileSequenceReader get(
156160
"The version of TsFile %s is not correct: %s", filePath, versionNumber));
157161
}
158162
}
159-
readerMap.put(filePath, tsFileReader);
163+
readerMap.put(tsFileID, tsFileReader);
160164
return tsFileReader;
161165
}
162166

163-
return readerMap.get(filePath);
167+
return readerMap.get(tsFileID);
164168
}
165169

166170
/**
@@ -172,11 +176,11 @@ public void increaseFileReaderReference(TsFileResource tsFile, boolean isClosed)
172176
synchronized (this) {
173177
if (!isClosed) {
174178
unclosedReferenceMap
175-
.computeIfAbsent(tsFile.getTsFilePath(), k -> new AtomicInteger())
179+
.computeIfAbsent(tsFile.getTsFileID(), k -> new AtomicInteger())
176180
.getAndIncrement();
177181
} else {
178182
closedReferenceMap
179-
.computeIfAbsent(tsFile.getTsFilePath(), k -> new AtomicInteger())
183+
.computeIfAbsent(tsFile.getTsFileID(), k -> new AtomicInteger())
180184
.getAndIncrement();
181185
}
182186
}
@@ -188,38 +192,39 @@ public void increaseFileReaderReference(TsFileResource tsFile, boolean isClosed)
188192
*/
189193
public void decreaseFileReaderReference(TsFileResource tsFile, boolean isClosed) {
190194
synchronized (this) {
191-
if (!isClosed && unclosedReferenceMap.containsKey(tsFile.getTsFilePath())) {
192-
if (unclosedReferenceMap.get(tsFile.getTsFilePath()).decrementAndGet() == 0) {
193-
closeUnUsedReaderAndRemoveRef(tsFile.getTsFilePath(), false);
195+
if (!isClosed && unclosedReferenceMap.containsKey(tsFile.getTsFileID())) {
196+
if (unclosedReferenceMap.get(tsFile.getTsFileID()).decrementAndGet() == 0) {
197+
closeUnUsedReaderAndRemoveRef(tsFile.getTsFilePath(), tsFile.getTsFileID(), false);
194198
}
195-
} else if (closedReferenceMap.containsKey(tsFile.getTsFilePath())
196-
&& (closedReferenceMap.get(tsFile.getTsFilePath()).decrementAndGet() == 0)) {
197-
closeUnUsedReaderAndRemoveRef(tsFile.getTsFilePath(), true);
199+
} else if (closedReferenceMap.containsKey(tsFile.getTsFileID())
200+
&& (closedReferenceMap.get(tsFile.getTsFileID()).decrementAndGet() == 0)) {
201+
closeUnUsedReaderAndRemoveRef(tsFile.getTsFilePath(), tsFile.getTsFileID(), true);
198202
}
199203
}
200204
tsFile.readUnlock();
201205
}
202206

203-
private void closeUnUsedReaderAndRemoveRef(String tsFilePath, boolean isClosed) {
204-
Map<String, TsFileSequenceReader> readerMap =
207+
private void closeUnUsedReaderAndRemoveRef(
208+
String tsFilePath, TsFileID tsFileID, boolean isClosed) {
209+
Map<TsFileID, TsFileSequenceReader> readerMap =
205210
isClosed ? closedFileReaderMap : unclosedFileReaderMap;
206-
Map<String, AtomicInteger> refMap = isClosed ? closedReferenceMap : unclosedReferenceMap;
211+
Map<TsFileID, AtomicInteger> refMap = isClosed ? closedReferenceMap : unclosedReferenceMap;
207212
synchronized (this) {
208213
// check ref num again
209-
if (refMap.get(tsFilePath).get() != 0) {
214+
if (refMap.get(tsFileID).get() != 0) {
210215
return;
211216
}
212217

213-
TsFileSequenceReader reader = readerMap.get(tsFilePath);
218+
TsFileSequenceReader reader = readerMap.get(tsFileID);
214219
if (reader != null) {
215220
try {
216221
reader.close();
217222
} catch (IOException e) {
218223
logger.error("Can not close TsFileSequenceReader {} !", reader.getFileName(), e);
219224
}
220225
}
221-
readerMap.remove(tsFilePath);
222-
refMap.remove(tsFilePath);
226+
readerMap.remove(tsFileID);
227+
refMap.remove(tsFileID);
223228
if (resourceLogger.isDebugEnabled()) {
224229
resourceLogger.debug("{} TsFileReader is closed because of no reference.", tsFilePath);
225230
}
@@ -233,10 +238,10 @@ private void closeUnUsedReaderAndRemoveRef(String tsFilePath, boolean isClosed)
233238
* @throws IOException if failed to close file handlers, IOException will be thrown
234239
*/
235240
public synchronized void closeAndRemoveAllOpenedReaders() throws IOException {
236-
Iterator<Map.Entry<String, TsFileSequenceReader>> iterator =
241+
Iterator<Map.Entry<TsFileID, TsFileSequenceReader>> iterator =
237242
closedFileReaderMap.entrySet().iterator();
238243
while (iterator.hasNext()) {
239-
Map.Entry<String, TsFileSequenceReader> entry = iterator.next();
244+
Map.Entry<TsFileID, TsFileSequenceReader> entry = iterator.next();
240245
entry.getValue().close();
241246
if (resourceLogger.isDebugEnabled()) {
242247
resourceLogger.debug("{} closedTsFileReader is closed.", entry.getKey());
@@ -246,7 +251,7 @@ public synchronized void closeAndRemoveAllOpenedReaders() throws IOException {
246251
}
247252
iterator = unclosedFileReaderMap.entrySet().iterator();
248253
while (iterator.hasNext()) {
249-
Map.Entry<String, TsFileSequenceReader> entry = iterator.next();
254+
Map.Entry<TsFileID, TsFileSequenceReader> entry = iterator.next();
250255
entry.getValue().close();
251256
if (resourceLogger.isDebugEnabled()) {
252257
resourceLogger.debug("{} unclosedTsFileReader is closed.", entry.getKey());
@@ -258,17 +263,17 @@ public synchronized void closeAndRemoveAllOpenedReaders() throws IOException {
258263

259264
/** This method is only for unit tests. */
260265
public synchronized boolean contains(TsFileResource tsFile, boolean isClosed) {
261-
return (isClosed && closedFileReaderMap.containsKey(tsFile.getTsFilePath()))
262-
|| (!isClosed && unclosedFileReaderMap.containsKey(tsFile.getTsFilePath()));
266+
return (isClosed && closedFileReaderMap.containsKey(tsFile.getTsFileID()))
267+
|| (!isClosed && unclosedFileReaderMap.containsKey(tsFile.getTsFileID()));
263268
}
264269

265270
@TestOnly
266-
public Map<String, TsFileSequenceReader> getClosedFileReaderMap() {
271+
public Map<TsFileID, TsFileSequenceReader> getClosedFileReaderMap() {
267272
return closedFileReaderMap;
268273
}
269274

270275
@TestOnly
271-
public Map<String, TsFileSequenceReader> getUnclosedFileReaderMap() {
276+
public Map<TsFileID, TsFileSequenceReader> getUnclosedFileReaderMap() {
272277
return unclosedFileReaderMap;
273278
}
274279

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/ClosedFileScanHandleImpl.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.iotdb.db.storageengine.dataregion.read.filescan.model.AbstractDeviceChunkMetaData;
3131
import org.apache.iotdb.db.storageengine.dataregion.read.filescan.model.AlignedDeviceChunkMetaData;
3232
import org.apache.iotdb.db.storageengine.dataregion.read.filescan.model.DeviceChunkMetaData;
33+
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileID;
3334
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
3435
import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.DeviceTimeIndex;
3536
import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
@@ -117,7 +118,8 @@ public boolean isTimeSeriesTimeDeleted(IDeviceID deviceID, String timeSeriesName
117118
@Override
118119
public Iterator<AbstractDeviceChunkMetaData> getAllDeviceChunkMetaData() throws IOException {
119120

120-
TsFileSequenceReader tsFileReader = FileReaderManager.getInstance().get(getFilePath(), true);
121+
TsFileSequenceReader tsFileReader =
122+
FileReaderManager.getInstance().get(getFilePath(), tsFileResource.getTsFileID(), true);
121123
TsFileDeviceIterator deviceIterator = tsFileReader.getAllDevicesIteratorWithIsAligned();
122124

123125
List<AbstractDeviceChunkMetaData> deviceChunkMetaDataList = new LinkedList<>();
@@ -170,10 +172,12 @@ public Iterator<IChunkHandle> getChunkHandles(
170172
List<Statistics<? extends Serializable>> statisticsList,
171173
List<Integer> orderedIndexList) {
172174
String filePath = tsFileResource.getTsFilePath();
175+
TsFileID tsFileID = tsFileResource.getTsFileID();
173176
List<IChunkHandle> chunkHandleList = new ArrayList<>();
174177
for (int i : orderedIndexList) {
175178
AbstractChunkOffset chunkOffset = chunkInfoList.get(i);
176-
chunkHandleList.add(chunkOffset.generateChunkHandle(filePath, statisticsList.get(i)));
179+
chunkHandleList.add(
180+
chunkOffset.generateChunkHandle(filePath, tsFileID, statisticsList.get(i)));
177181
}
178182
return chunkHandleList.iterator();
179183
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/DiskAlignedChunkHandleImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.iotdb.db.storageengine.dataregion.read.filescan.impl;
2121

22+
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileID;
2223
import org.apache.iotdb.db.storageengine.dataregion.utils.SharedTimeDataBuffer;
2324

2425
import org.apache.tsfile.file.metadata.IDeviceID;
@@ -41,11 +42,12 @@ public DiskAlignedChunkHandleImpl(
4142
IDeviceID deviceID,
4243
String measurement,
4344
String filePath,
45+
TsFileID tsFileID,
4446
boolean isTsFileClosed,
4547
long offset,
4648
Statistics<? extends Serializable> chunkStatistic,
4749
SharedTimeDataBuffer sharedTimeDataBuffer) {
48-
super(deviceID, measurement, filePath, isTsFileClosed, offset, chunkStatistic);
50+
super(deviceID, measurement, filePath, tsFileID, isTsFileClosed, offset, chunkStatistic);
4951
this.sharedTimeDataBuffer = sharedTimeDataBuffer;
5052
}
5153

0 commit comments

Comments
 (0)