This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new bbdca54ed1d Storage Engine: fix wal delete thread exception because
multi thread safety question (#12020)
bbdca54ed1d is described below
commit bbdca54ed1d320144f6b663865bf179543629613
Author: Zhijia Cao <[email protected]>
AuthorDate: Fri Feb 2 18:12:11 2024 +0800
Storage Engine: fix wal delete thread exception because multi thread safety
question (#12020)
---
.../db/storageengine/dataregion/DataRegion.java | 27 ++++++++++++----------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index 632c99ea44a..b1398dba938 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -143,6 +143,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.Phaser;
@@ -258,7 +259,7 @@ public class DataRegion implements IDataRegionForQuery {
* different IoTDB instance will have identical data, providing convenience
for data comparison
* across different instances. partition number -> max version number
*/
- private Map<Long, Long> partitionMaxFileVersions = new HashMap<>();
+ private Map<Long, Long> partitionMaxFileVersions = new ConcurrentHashMap<>();
/** database info for mem control. */
private final DataRegionInfo dataRegionInfo = new DataRegionInfo(this);
/** whether it's ready from recovery. */
@@ -630,10 +631,10 @@ public class DataRegion implements IDataRegionForQuery {
}
private void updatePartitionFileVersion(long partitionNum, long fileVersion)
{
- long oldVersion = partitionMaxFileVersions.getOrDefault(partitionNum, 0L);
- if (fileVersion > oldVersion) {
- partitionMaxFileVersions.put(partitionNum, fileVersion);
- }
+ partitionMaxFileVersions.compute(
+ partitionNum,
+ (key, oldVersion) ->
+ (oldVersion == null || fileVersion > oldVersion) ? fileVersion :
oldVersion);
}
@SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity
warning
@@ -1386,9 +1387,9 @@ public class DataRegion implements IDataRegionForQuery {
private TsFileProcessor newTsFileProcessor(boolean sequence, long
timePartitionId)
throws IOException, DiskSpaceInsufficientException {
-
- long version = partitionMaxFileVersions.getOrDefault(timePartitionId, 0L)
+ 1;
- partitionMaxFileVersions.put(timePartitionId, version);
+ long version =
+ partitionMaxFileVersions.compute(
+ timePartitionId, (key, oldVersion) -> (oldVersion == null ? 1 :
oldVersion + 1));
String filePath =
TsFileNameGenerator.generateNewTsFilePathWithMkdir(
sequence,
@@ -1431,8 +1432,9 @@ public class DataRegion implements IDataRegionForQuery {
* @return file name
*/
private String getNewTsFileName(long timePartitionId) {
- long version = partitionMaxFileVersions.getOrDefault(timePartitionId, 0L)
+ 1;
- partitionMaxFileVersions.put(timePartitionId, version);
+ long version =
+ partitionMaxFileVersions.compute(
+ timePartitionId, (key, oldVersion) -> (oldVersion == null ? 1 :
oldVersion + 1));
return getNewTsFileName(System.currentTimeMillis(), version, 0, 0);
}
@@ -2706,8 +2708,9 @@ public class DataRegion implements IDataRegionForQuery {
}
private long getAndSetNewVersion(long timePartitionId, TsFileResource
tsFileResource) {
- long version = partitionMaxFileVersions.getOrDefault(timePartitionId, 0L)
+ 1;
- partitionMaxFileVersions.put(timePartitionId, version);
+ long version =
+ partitionMaxFileVersions.compute(
+ timePartitionId, (key, oldVersion) -> (oldVersion == null ? 1 :
oldVersion + 1));
tsFileResource.setVersion(version);
return version;
}