You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/08/23 12:41:42 UTC

[iotdb] branch master updated: [IOTDB-4210] Fix deadlock during WALNode recover if there's another one already running (#7091)

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 c90be56685 [IOTDB-4210] Fix deadlock during WALNode recover if there's another one already running (#7091)
c90be56685 is described below

commit c90be56685b5d21518d856b1d2ed821489c4c7e9
Author: BaiJian <er...@hotmail.com>
AuthorDate: Tue Aug 23 20:41:33 2022 +0800

    [IOTDB-4210] Fix deadlock during WALNode recover if there's another one already running (#7091)
---
 .../java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java  | 8 ++++++--
 .../apache/iotdb/db/metadata/schemaregion/SchemaRegionUtils.java  | 7 +++----
 .../java/org/apache/iotdb/db/wal/recover/WALRecoverManager.java   | 1 +
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
index 6169901c29..7a8a891104 100755
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
@@ -475,7 +475,9 @@ public class DataRegion {
             value.remove(value.size() - 1);
             WALRecoverListener recoverListener =
                 recoverUnsealedTsFile(tsFileResource, DataRegionRecoveryContext, true);
-            recoverListeners.add(recoverListener);
+            if (recoverListener != null) {
+              recoverListeners.add(recoverListener);
+            }
           }
         }
       }
@@ -489,7 +491,9 @@ public class DataRegion {
             value.remove(value.size() - 1);
             WALRecoverListener recoverListener =
                 recoverUnsealedTsFile(tsFileResource, DataRegionRecoveryContext, false);
-            recoverListeners.add(recoverListener);
+            if (recoverListener != null) {
+              recoverListeners.add(recoverListener);
+            }
           }
         }
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionUtils.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionUtils.java
index 7b43d86c20..f9049481eb 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionUtils.java
@@ -45,12 +45,11 @@ public class SchemaRegionUtils {
     }
     for (File file : sgFiles) {
       if (file.delete()) {
-        logger.info("delete schema region folder {}", schemaRegionDir.getAbsolutePath());
+        logger.info("delete schema region file {}", file.getAbsolutePath());
       } else {
-        logger.info("delete schema region folder {} failed.", schemaRegionDir.getAbsolutePath());
+        logger.info("delete schema region file {} failed.", file.getAbsolutePath());
         throw new MetadataException(
-            String.format(
-                "Failed to delete schema region folder %s", schemaRegionDir.getAbsolutePath()));
+            String.format("Failed to delete schema region file %s", file.getAbsolutePath()));
       }
     }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/wal/recover/WALRecoverManager.java b/server/src/main/java/org/apache/iotdb/db/wal/recover/WALRecoverManager.java
index 27e54202ca..7ff0a186d8 100644
--- a/server/src/main/java/org/apache/iotdb/db/wal/recover/WALRecoverManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/wal/recover/WALRecoverManager.java
@@ -175,6 +175,7 @@ public class WALRecoverManager {
   public WALRecoverListener addRecoverPerformer(UnsealedTsFileRecoverPerformer recoverPerformer) {
     if (hasStarted) {
       logger.error("Cannot recover tsfile from wal because wal recovery has already started");
+      return null;
     } else {
       try {
         String canonicalPath = recoverPerformer.getTsFileResource().getTsFile().getCanonicalPath();