This is an automated email from the ASF dual-hosted git repository.

caogaofei 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 3782215a21d Fix redundant lock taking during create multi timeseries
3782215a21d is described below

commit 3782215a21d736ee042c0e41d9171ae7ec1d39ab
Author: Marcos_Zyk <[email protected]>
AuthorDate: Wed May 8 20:41:51 2024 +0800

    Fix redundant lock taking during create multi timeseries
---
 .../queryengine/plan/analyze/AnalyzeVisitor.java   | 38 +++++++++++++++-------
 1 file changed, 26 insertions(+), 12 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index b23a5d44f9c..ec84b871532 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -2300,7 +2300,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     analysis.setStatement(createTimeSeriesStatement);
 
     checkIsTemplateCompatible(
-        createTimeSeriesStatement.getPath(), 
createTimeSeriesStatement.getAlias(), context);
+        createTimeSeriesStatement.getPath(), 
createTimeSeriesStatement.getAlias(), context, true);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendFullPath(createTimeSeriesStatement.getPath());
@@ -2312,9 +2312,11 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private void checkIsTemplateCompatible(
-      PartialPath timeseriesPath, String alias, MPPQueryContext context) {
-    
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
-    context.addAcquiredLockNum(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+      PartialPath timeseriesPath, String alias, MPPQueryContext context, 
boolean takeLock) {
+    if (takeLock) {
+      
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+      context.addAcquiredLockNum(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+    }
     Pair<Template, PartialPath> templateInfo =
         schemaFetcher.checkTemplateSetAndPreSetInfo(timeseriesPath, alias);
     if (templateInfo != null) {
@@ -2328,9 +2330,12 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       PartialPath devicePath,
       List<String> measurements,
       List<String> aliasList,
-      MPPQueryContext context) {
-    
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
-    context.addAcquiredLockNum(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+      MPPQueryContext context,
+      boolean takeLock) {
+    if (takeLock) {
+      
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+      context.addAcquiredLockNum(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+    }
     for (int i = 0; i < measurements.size(); i++) {
       Pair<Template, PartialPath> templateInfo =
           schemaFetcher.checkTemplateSetAndPreSetInfo(
@@ -2399,7 +2404,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         createAlignedTimeSeriesStatement.getDevicePath(),
         createAlignedTimeSeriesStatement.getMeasurements(),
         createAlignedTimeSeriesStatement.getAliasList(),
-        context);
+        context,
+        true);
 
     PathPatternTree pathPatternTree = new PathPatternTree();
     for (String measurement : 
createAlignedTimeSeriesStatement.getMeasurements()) {
@@ -2426,7 +2432,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         internalCreateTimeSeriesStatement.getDevicePath(),
         internalCreateTimeSeriesStatement.getMeasurements(),
         null,
-        context);
+        context,
+        true);
 
     PathPatternTree pathPatternTree = new PathPatternTree();
     for (String measurement : 
internalCreateTimeSeriesStatement.getMeasurements()) {
@@ -2452,10 +2459,12 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     analysis.setStatement(internalCreateMultiTimeSeriesStatement);
 
     PathPatternTree pathPatternTree = new PathPatternTree();
+    
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+    context.addAcquiredLockNum(SchemaLockType.TIMESERIES_VS_TEMPLATE);
     for (Map.Entry<PartialPath, Pair<Boolean, MeasurementGroup>> entry :
         internalCreateMultiTimeSeriesStatement.getDeviceMap().entrySet()) {
       checkIsTemplateCompatible(
-          entry.getKey(), entry.getValue().right.getMeasurements(), null, 
context);
+          entry.getKey(), entry.getValue().right.getMeasurements(), null, 
context, false);
       
pathPatternTree.appendFullPath(entry.getKey().concatNode(ONE_LEVEL_PATH_WILDCARD));
     }
 
@@ -2478,9 +2487,12 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
     List<PartialPath> timeseriesPathList = 
createMultiTimeSeriesStatement.getPaths();
     List<String> aliasList = createMultiTimeSeriesStatement.getAliasList();
+
+    
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+    context.addAcquiredLockNum(SchemaLockType.TIMESERIES_VS_TEMPLATE);
     for (int i = 0; i < timeseriesPathList.size(); i++) {
       checkIsTemplateCompatible(
-          timeseriesPathList.get(i), aliasList == null ? null : 
aliasList.get(i), context);
+          timeseriesPathList.get(i), aliasList == null ? null : 
aliasList.get(i), context, false);
     }
 
     PathPatternTree patternTree = new PathPatternTree();
@@ -3588,8 +3600,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     }
     // Make sure all paths are not under any templates
     try {
+      
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
+      context.addAcquiredLockNum(SchemaLockType.TIMESERIES_VS_TEMPLATE);
       for (PartialPath path : createLogicalViewStatement.getTargetPathList()) {
-        checkIsTemplateCompatible(path, null, context);
+        checkIsTemplateCompatible(path, null, context, false);
       }
     } catch (Exception e) {
       analysis.setFinishQueryAfterAnalyze(true);

Reply via email to