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;