Skip to content

Commit 1438e1b

Browse files
[To rel/0.13] [IOTDB-4654] Fix concurrent bug caused by sharing same ChunkMetadata (#7605)
1 parent b3b96bd commit 1438e1b

File tree

6 files changed

+47
-13
lines changed

6 files changed

+47
-13
lines changed

server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public DiskAlignedChunkMetadataLoader(
5858
@Override
5959
public List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeSeriesMetadata) {
6060
List<AlignedChunkMetadata> alignedChunkMetadataList =
61-
((AlignedTimeSeriesMetadata) timeSeriesMetadata).getChunkMetadataList();
61+
((AlignedTimeSeriesMetadata) timeSeriesMetadata).getCopiedChunkMetadataList();
6262

6363
// get all sub sensors' modifications
6464
List<List<Modification>> pathModifications =

server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public DiskChunkMetadataLoader(
5757
public List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeSeriesMetadata) {
5858

5959
List<IChunkMetadata> chunkMetadataList =
60-
((TimeseriesMetadata) timeSeriesMetadata).getChunkMetadataList();
60+
((TimeseriesMetadata) timeSeriesMetadata).getCopiedChunkMetadataList();
6161

6262
List<Modification> pathModifications =
6363
context.getPathModifications(resource.getModFile(), seriesPath);

server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,7 @@ public static void modifyChunkMetaData(
8080
if (range.contains(metaData.getStartTime(), metaData.getEndTime())) {
8181
return true;
8282
} else {
83-
if (!metaData.isModified()
84-
&& range.overlaps(
85-
new TimeRange(metaData.getStartTime(), metaData.getEndTime()))) {
83+
if (range.overlaps(new TimeRange(metaData.getStartTime(), metaData.getEndTime()))) {
8684
metaData.setModified(true);
8785
}
8886
}
@@ -138,11 +136,9 @@ public static void modifyAlignedChunkMetaData(
138136
currentRemoved = true;
139137
break;
140138
} else {
141-
if (!valueChunkMetadata.isModified()
142-
&& range.overlaps(
143-
new TimeRange(
144-
valueChunkMetadata.getStartTime(),
145-
valueChunkMetadata.getEndTime()))) {
139+
if (range.overlaps(
140+
new TimeRange(
141+
valueChunkMetadata.getStartTime(), valueChunkMetadata.getEndTime()))) {
146142
valueChunkMetadata.setModified(true);
147143
modified = true;
148144
}
@@ -155,9 +151,7 @@ public static void modifyAlignedChunkMetaData(
155151
removed = false;
156152
}
157153
}
158-
if (!alignedChunkMetadata.isModified()) {
159-
alignedChunkMetadata.setModified(modified);
160-
}
154+
alignedChunkMetadata.setModified(modified);
161155
return removed;
162156
});
163157
}

tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,28 @@ public List<IChunkMetadata> loadChunkMetadataList() throws IOException {
103103
return chunkMetadataLoader.loadChunkMetadataList(this);
104104
}
105105

106+
public List<AlignedChunkMetadata> getCopiedChunkMetadataList() {
107+
List<IChunkMetadata> timeChunkMetadata = timeseriesMetadata.getCopiedChunkMetadataList();
108+
List<List<IChunkMetadata>> valueChunkMetadataList = new ArrayList<>();
109+
for (TimeseriesMetadata metadata : valueTimeseriesMetadataList) {
110+
valueChunkMetadataList.add(metadata == null ? null : metadata.getCopiedChunkMetadataList());
111+
}
112+
113+
return getAlignedChunkMetadata(timeChunkMetadata, valueChunkMetadataList);
114+
}
115+
106116
public List<AlignedChunkMetadata> getChunkMetadataList() {
107117
List<IChunkMetadata> timeChunkMetadata = timeseriesMetadata.getChunkMetadataList();
108118
List<List<IChunkMetadata>> valueChunkMetadataList = new ArrayList<>();
109119
for (TimeseriesMetadata metadata : valueTimeseriesMetadataList) {
110120
valueChunkMetadataList.add(metadata == null ? null : metadata.getChunkMetadataList());
111121
}
112122

123+
return getAlignedChunkMetadata(timeChunkMetadata, valueChunkMetadataList);
124+
}
125+
126+
private List<AlignedChunkMetadata> getAlignedChunkMetadata(
127+
List<IChunkMetadata> timeChunkMetadata, List<List<IChunkMetadata>> valueChunkMetadataList) {
113128
List<AlignedChunkMetadata> res = new ArrayList<>();
114129
for (int i = 0; i < timeChunkMetadata.size(); i++) {
115130
List<IChunkMetadata> chunkMetadataList = new ArrayList<>();

tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,24 @@ public ChunkMetadata(
103103
this.statistics = statistics;
104104
}
105105

106+
// won't clone deleteIntervalList & modified
107+
public ChunkMetadata(ChunkMetadata other) {
108+
this.measurementUid = other.measurementUid;
109+
this.offsetOfChunkHeader = other.offsetOfChunkHeader;
110+
this.tsDataType = other.tsDataType;
111+
this.version = other.version;
112+
this.chunkLoader = other.chunkLoader;
113+
this.statistics = other.statistics;
114+
this.isFromOldTsFile = other.isFromOldTsFile;
115+
this.ramSize = other.ramSize;
116+
this.isSeq = other.isSeq;
117+
this.isClosed = other.isClosed;
118+
this.filePath = other.filePath;
119+
this.mask = other.mask;
120+
this.tsFilePrefixPath = other.tsFilePrefixPath;
121+
this.compactionVersion = other.compactionVersion;
122+
}
123+
106124
@Override
107125
public String toString() {
108126
return String.format(

tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.ArrayList;
3434
import java.util.List;
3535
import java.util.Set;
36+
import java.util.stream.Collectors;
3637

3738
public class TimeseriesMetadata implements ITimeSeriesMetadata {
3839

@@ -245,6 +246,12 @@ public List<IChunkMetadata> getChunkMetadataList() {
245246
return chunkMetadataList;
246247
}
247248

249+
public List<IChunkMetadata> getCopiedChunkMetadataList() {
250+
return chunkMetadataList.stream()
251+
.map(chunkMetadata -> new ChunkMetadata((ChunkMetadata) chunkMetadata))
252+
.collect(Collectors.toList());
253+
}
254+
248255
@Override
249256
public boolean isModified() {
250257
return modified;

0 commit comments

Comments
 (0)