You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2022/10/17 01:43:53 UTC
[iotdb] branch rel/0.13 updated: [To rel/0.13] [IOTDB-4654] Fix concurrent bug caused by sharing same ChunkMetadata (#7605)
This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch rel/0.13
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/0.13 by this push:
new 1438e1bcdc [To rel/0.13] [IOTDB-4654] Fix concurrent bug caused by sharing same ChunkMetadata (#7605)
1438e1bcdc is described below
commit 1438e1bcdc1e11161fe95341fdac12a2af2b7eb8
Author: liuminghui233 <36...@users.noreply.github.com>
AuthorDate: Mon Oct 17 09:43:48 2022 +0800
[To rel/0.13] [IOTDB-4654] Fix concurrent bug caused by sharing same ChunkMetadata (#7605)
---
.../chunk/metadata/DiskAlignedChunkMetadataLoader.java | 2 +-
.../reader/chunk/metadata/DiskChunkMetadataLoader.java | 2 +-
.../java/org/apache/iotdb/db/utils/QueryUtils.java | 16 +++++-----------
.../file/metadata/AlignedTimeSeriesMetadata.java | 15 +++++++++++++++
.../iotdb/tsfile/file/metadata/ChunkMetadata.java | 18 ++++++++++++++++++
.../iotdb/tsfile/file/metadata/TimeseriesMetadata.java | 7 +++++++
6 files changed, 47 insertions(+), 13 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java
index 05ce7b14b8..6967ba1eca 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java
@@ -58,7 +58,7 @@ public class DiskAlignedChunkMetadataLoader implements IChunkMetadataLoader {
@Override
public List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeSeriesMetadata) {
List<AlignedChunkMetadata> alignedChunkMetadataList =
- ((AlignedTimeSeriesMetadata) timeSeriesMetadata).getChunkMetadataList();
+ ((AlignedTimeSeriesMetadata) timeSeriesMetadata).getCopiedChunkMetadataList();
// get all sub sensors' modifications
List<List<Modification>> pathModifications =
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java
index abc2574854..f6d168f321 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java
@@ -57,7 +57,7 @@ public class DiskChunkMetadataLoader implements IChunkMetadataLoader {
public List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeSeriesMetadata) {
List<IChunkMetadata> chunkMetadataList =
- ((TimeseriesMetadata) timeSeriesMetadata).getChunkMetadataList();
+ ((TimeseriesMetadata) timeSeriesMetadata).getCopiedChunkMetadataList();
List<Modification> pathModifications =
context.getPathModifications(resource.getModFile(), seriesPath);
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
index 20985dd8d7..b3cc2db540 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
@@ -80,9 +80,7 @@ public class QueryUtils {
if (range.contains(metaData.getStartTime(), metaData.getEndTime())) {
return true;
} else {
- if (!metaData.isModified()
- && range.overlaps(
- new TimeRange(metaData.getStartTime(), metaData.getEndTime()))) {
+ if (range.overlaps(new TimeRange(metaData.getStartTime(), metaData.getEndTime()))) {
metaData.setModified(true);
}
}
@@ -138,11 +136,9 @@ public class QueryUtils {
currentRemoved = true;
break;
} else {
- if (!valueChunkMetadata.isModified()
- && range.overlaps(
- new TimeRange(
- valueChunkMetadata.getStartTime(),
- valueChunkMetadata.getEndTime()))) {
+ if (range.overlaps(
+ new TimeRange(
+ valueChunkMetadata.getStartTime(), valueChunkMetadata.getEndTime()))) {
valueChunkMetadata.setModified(true);
modified = true;
}
@@ -155,9 +151,7 @@ public class QueryUtils {
removed = false;
}
}
- if (!alignedChunkMetadata.isModified()) {
- alignedChunkMetadata.setModified(modified);
- }
+ alignedChunkMetadata.setModified(modified);
return removed;
});
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
index 1aa5046d70..bb64844c9b 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
@@ -103,6 +103,16 @@ public class AlignedTimeSeriesMetadata implements ITimeSeriesMetadata {
return chunkMetadataLoader.loadChunkMetadataList(this);
}
+ public List<AlignedChunkMetadata> getCopiedChunkMetadataList() {
+ List<IChunkMetadata> timeChunkMetadata = timeseriesMetadata.getCopiedChunkMetadataList();
+ List<List<IChunkMetadata>> valueChunkMetadataList = new ArrayList<>();
+ for (TimeseriesMetadata metadata : valueTimeseriesMetadataList) {
+ valueChunkMetadataList.add(metadata == null ? null : metadata.getCopiedChunkMetadataList());
+ }
+
+ return getAlignedChunkMetadata(timeChunkMetadata, valueChunkMetadataList);
+ }
+
public List<AlignedChunkMetadata> getChunkMetadataList() {
List<IChunkMetadata> timeChunkMetadata = timeseriesMetadata.getChunkMetadataList();
List<List<IChunkMetadata>> valueChunkMetadataList = new ArrayList<>();
@@ -110,6 +120,11 @@ public class AlignedTimeSeriesMetadata implements ITimeSeriesMetadata {
valueChunkMetadataList.add(metadata == null ? null : metadata.getChunkMetadataList());
}
+ return getAlignedChunkMetadata(timeChunkMetadata, valueChunkMetadataList);
+ }
+
+ private List<AlignedChunkMetadata> getAlignedChunkMetadata(
+ List<IChunkMetadata> timeChunkMetadata, List<List<IChunkMetadata>> valueChunkMetadataList) {
List<AlignedChunkMetadata> res = new ArrayList<>();
for (int i = 0; i < timeChunkMetadata.size(); i++) {
List<IChunkMetadata> chunkMetadataList = new ArrayList<>();
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
index 9ee1f7f566..c26b8fbea9 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
@@ -103,6 +103,24 @@ public class ChunkMetadata implements IChunkMetadata {
this.statistics = statistics;
}
+ // won't clone deleteIntervalList & modified
+ public ChunkMetadata(ChunkMetadata other) {
+ this.measurementUid = other.measurementUid;
+ this.offsetOfChunkHeader = other.offsetOfChunkHeader;
+ this.tsDataType = other.tsDataType;
+ this.version = other.version;
+ this.chunkLoader = other.chunkLoader;
+ this.statistics = other.statistics;
+ this.isFromOldTsFile = other.isFromOldTsFile;
+ this.ramSize = other.ramSize;
+ this.isSeq = other.isSeq;
+ this.isClosed = other.isClosed;
+ this.filePath = other.filePath;
+ this.mask = other.mask;
+ this.tsFilePrefixPath = other.tsFilePrefixPath;
+ this.compactionVersion = other.compactionVersion;
+ }
+
@Override
public String toString() {
return String.format(
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
index db7072c074..113f4b8160 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
@@ -33,6 +33,7 @@ import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import java.util.stream.Collectors;
public class TimeseriesMetadata implements ITimeSeriesMetadata {
@@ -245,6 +246,12 @@ public class TimeseriesMetadata implements ITimeSeriesMetadata {
return chunkMetadataList;
}
+ public List<IChunkMetadata> getCopiedChunkMetadataList() {
+ return chunkMetadataList.stream()
+ .map(chunkMetadata -> new ChunkMetadata((ChunkMetadata) chunkMetadata))
+ .collect(Collectors.toList());
+ }
+
@Override
public boolean isModified() {
return modified;