You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by yo...@apache.org on 2023/06/19 07:42:34 UTC

[bookkeeper] 10/31: [Bug] SingleDirectoryDbLedgerStorage#flushMutex does not release lock on all exception paths (#3909)

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

yong pushed a commit to branch branch-4.16
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git

commit 4b688521c3c32f51179242db08149b19ea0f3012
Author: StevenLuMT <ls...@126.com>
AuthorDate: Fri Apr 7 18:33:19 2023 +0800

    [Bug] SingleDirectoryDbLedgerStorage#flushMutex does not release lock on all exception paths (#3909)
    
    Co-authored-by: lushiji <lu...@didiglobal.com>
    (cherry picked from commit f1657eaf4cbe7257a729ab784ddf2b002e989300)
---
 .../ldb/SingleDirectoryDbLedgerStorage.java        | 27 +++++++++++-----------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java
index 9f089d9864..dd673f319a 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java
@@ -843,21 +843,22 @@ public class SingleDirectoryDbLedgerStorage implements CompactableLedgerStorage
             // Leave IOExecption as it is
             throw e;
         } finally {
-            cleanupExecutor.execute(() -> {
-                // There can only be one single cleanup task running because the cleanupExecutor
-                // is single-threaded
-                try {
-                    if (log.isDebugEnabled()) {
-                        log.debug("Removing deleted ledgers from db indexes");
+            try {
+                cleanupExecutor.execute(() -> {
+                    // There can only be one single cleanup task running because the cleanupExecutor
+                    // is single-threaded
+                    try {
+                        if (log.isDebugEnabled()) {
+                            log.debug("Removing deleted ledgers from db indexes");
+                        }
+
+                        entryLocationIndex.removeOffsetFromDeletedLedgers();
+                        ledgerIndex.removeDeletedLedgers();
+                    } catch (Throwable t) {
+                        log.warn("Failed to cleanup db indexes", t);
                     }
+                });
 
-                    entryLocationIndex.removeOffsetFromDeletedLedgers();
-                    ledgerIndex.removeDeletedLedgers();
-                } catch (Throwable t) {
-                    log.warn("Failed to cleanup db indexes", t);
-                }
-            });
-            try {
                 isFlushOngoing.set(false);
             } finally {
                 flushMutex.unlock();