This is an automated email from the ASF dual-hosted git repository.
jackietien 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 cd3e8af7e47 Make each execution acquire a schema read lock only once
cd3e8af7e47 is described below
commit cd3e8af7e471b46491035061f5b41485fece020d
Author: Caideyipi <[email protected]>
AuthorDate: Thu Sep 26 16:45:34 2024 +0800
Make each execution acquire a schema read lock only once
---
.../iotdb/db/queryengine/common/MPPQueryContext.java | 18 +++++++-----------
.../plan/analyze/lock/DataNodeSchemaLockManager.java | 17 +++++++----------
2 files changed, 14 insertions(+), 21 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
index 4ef11066229..7bc66103e66 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
@@ -33,11 +33,11 @@ import
org.apache.iotdb.db.queryengine.statistics.QueryPlanStatistics;
import org.apache.tsfile.read.filter.basic.Filter;
import java.time.ZoneId;
-import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
-import java.util.Map;
import java.util.Optional;
+import java.util.Set;
/**
* This class is used to record the context of a query including QueryId,
query statement, session
@@ -72,7 +72,7 @@ public class MPPQueryContext {
private Filter globalTimeFilter;
- private Map<SchemaLockType, Integer> acquiredLockNumMap = new HashMap<>();
+ private final Set<SchemaLockType> acquiredLocks = new HashSet<>();
private boolean isExplainAnalyze = false;
@@ -203,16 +203,12 @@ public class MPPQueryContext {
return sql;
}
- public Map<SchemaLockType, Integer> getAcquiredLockNumMap() {
- return acquiredLockNumMap;
+ public Set<SchemaLockType> getAcquiredLocks() {
+ return acquiredLocks;
}
- public void addAcquiredLockNum(SchemaLockType lockType) {
- if (acquiredLockNumMap.containsKey(lockType)) {
- acquiredLockNumMap.put(lockType, acquiredLockNumMap.get(lockType) + 1);
- } else {
- acquiredLockNumMap.put(lockType, 1);
- }
+ public boolean addAcquiredLock(final SchemaLockType lockType) {
+ return acquiredLocks.add(lockType);
}
// used for tree model
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/lock/DataNodeSchemaLockManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/lock/DataNodeSchemaLockManager.java
index 598124ce0de..11478cf1f77 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/lock/DataNodeSchemaLockManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/lock/DataNodeSchemaLockManager.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.queryengine.plan.analyze.lock;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
-import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class DataNodeSchemaLockManager {
@@ -45,18 +44,16 @@ public class DataNodeSchemaLockManager {
}
public void takeReadLock(final MPPQueryContext context, final SchemaLockType
lockType) {
- locks[lockType.ordinal()].readLock().lock();
- context.addAcquiredLockNum(lockType);
+ if (context.addAcquiredLock(lockType)) {
+ locks[lockType.ordinal()].readLock().lock();
+ }
}
public void releaseReadLock(final MPPQueryContext queryContext) {
- if (queryContext != null &&
!queryContext.getAcquiredLockNumMap().isEmpty()) {
- final Map<SchemaLockType, Integer> lockMap =
queryContext.getAcquiredLockNumMap();
- for (final Map.Entry<SchemaLockType, Integer> entry :
lockMap.entrySet()) {
- for (int i = 0; i < entry.getValue(); i++) {
- locks[entry.getKey().ordinal()].readLock().unlock();
- }
- }
+ if (queryContext != null && !queryContext.getAcquiredLocks().isEmpty()) {
+ queryContext
+ .getAcquiredLocks()
+ .forEach(lockType -> locks[lockType.ordinal()].readLock().unlock());
}
}