You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2024/01/24 01:25:32 UTC

(iotdb) branch master updated: Fix deadlock when delete timeseries after loading data.

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 20726036498 Fix deadlock when delete timeseries after loading data.
20726036498 is described below

commit 20726036498d85c81f45f39e043cc9e827330115
Author: Colin Li <10...@users.noreply.github.com>
AuthorDate: Wed Jan 24 09:25:26 2024 +0800

    Fix deadlock when delete timeseries after loading data.
---
 .../test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java    |  9 +++++++++
 .../apache/iotdb/db/queryengine/common/MPPQueryContext.java    | 10 +++++-----
 .../java/org/apache/iotdb/db/queryengine/plan/Coordinator.java |  5 +++--
 .../queryengine/plan/analyze/schema/ClusterSchemaFetcher.java  |  6 +++---
 4 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java
index 9e018c46249..b1eb54950d3 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java
@@ -220,6 +220,15 @@ public class IOTDBLoadTsFileIT {
         }
       }
     }
+
+    // try delete after loading. Expect no deadlock
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(
+          String.format(
+              "delete timeseries %s.%s",
+              SchemaConfig.DEVICE_0, SchemaConfig.MEASUREMENT_00.getMeasurementId()));
+    }
   }
 
   @Test
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 16f0dcd8b51..bcefa358c8c 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
@@ -59,7 +59,7 @@ public class MPPQueryContext {
 
   private Filter globalTimeFilter;
 
-  private boolean acquiredLock;
+  private int acquiredLockNum;
 
   public MPPQueryContext(QueryId queryId) {
     this.queryId = queryId;
@@ -157,12 +157,12 @@ public class MPPQueryContext {
     return sql;
   }
 
-  public boolean getAcquiredLock() {
-    return acquiredLock;
+  public int getAcquiredLockNum() {
+    return acquiredLockNum;
   }
 
-  public void setAcquiredLock(boolean acuqired) {
-    acquiredLock = acuqired;
+  public void addAcquiredLockNum() {
+    acquiredLockNum++;
   }
 
   public void generateGlobalTimeFilter(Analysis analysis) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
index abd0c356910..2f808350717 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
@@ -162,8 +162,9 @@ public class Coordinator {
       execution.start();
       return execution.getStatus();
     } finally {
-      if (queryContext != null && queryContext.getAcquiredLock()) {
-        DataNodeSchemaCache.getInstance().releaseInsertLock();
+      int lockNums = queryContext.getAcquiredLockNum();
+      if (queryContext != null && lockNums > 0) {
+        for (int i = 0; i < lockNums; i++) DataNodeSchemaCache.getInstance().releaseInsertLock();
       }
     }
   }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java
index 538bda1c69b..4e544bb241d 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java
@@ -166,7 +166,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     // The schema cache R/W and fetch operation must be locked together thus the cache clean
     // operation executed by delete timeseries will be effective.
     schemaCache.takeInsertLock();
-    context.setAcquiredLock(true);
+    context.addAcquiredLockNum();
     schemaCache.takeReadLock();
     try {
       Pair<Template, PartialPath> templateSetInfo =
@@ -204,7 +204,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     // The schema cache R/W and fetch operation must be locked together thus the cache clean
     // operation executed by delete timeseries will be effective.
     schemaCache.takeInsertLock();
-    context.setAcquiredLock(true);
+    context.addAcquiredLockNum();
     schemaCache.takeReadLock();
     try {
 
@@ -248,7 +248,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     // The schema cache R/W and fetch operation must be locked together thus the cache clean
     // operation executed by delete timeseries will be effective.
     schemaCache.takeInsertLock();
-    context.setAcquiredLock(true);
+    context.addAcquiredLockNum();
     schemaCache.takeReadLock();
     try {
       ClusterSchemaTree schemaTree = new ClusterSchemaTree();