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());
     }
   }
 

Reply via email to