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 2021/10/15 00:23:30 UTC

[bookkeeper] branch master updated: Heap memory leak problem when ledger replication failed (#2794)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4dc4260  Heap memory leak problem when ledger replication failed (#2794)
4dc4260 is described below

commit 4dc426000d35a93ee0681c0c0124d4b1d3c53ad8
Author: gaozhangmin <ga...@qq.com>
AuthorDate: Fri Oct 15 08:23:22 2021 +0800

    Heap memory leak problem when ledger replication failed (#2794)
    
    ### Motivation
    
    production environment, memory leak always happened, and there were ledger cannot be replicated successfully.
    
    
    
    This cause by when `openLedgerNoRecovery` with `BKNotEnoughBookiesException`,  the LedgerHandler won't  closed properly, caused memory leak
    
    https://github.com/apache/bookkeeper/blob/c7236adc3cb659e65ae5ce53b7156569d7f50ebd/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java#L364-L424
    
    ### Changes
    
    close LedgerHandler when openComplete with exception
---
 .../java/org/apache/bookkeeper/client/LedgerOpenOp.java  | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java
index 2193b3e..e74fcb6 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java
@@ -129,6 +129,19 @@ class LedgerOpenOp {
         initiate();
     }
 
+    private void closeLedgerHandle() {
+        try {
+            if (lh != null) {
+                lh.close();
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            LOG.info("InterruptedException while closing ledger {}", ledgerId, e);
+        } catch (BKException e) {
+            LOG.warn("BKException while closing ledger {} ", ledgerId, e);
+        }
+    }
+
     private void openWithMetadata(Versioned<LedgerMetadata> versionedMetadata) {
         LedgerMetadata metadata = versionedMetadata.getValue();
 
@@ -196,8 +209,10 @@ class LedgerOpenOp {
                     if (rc == BKException.Code.OK) {
                         openComplete(BKException.Code.OK, lh);
                     } else if (rc == BKException.Code.UnauthorizedAccessException) {
+                        closeLedgerHandle();
                         openComplete(BKException.Code.UnauthorizedAccessException, null);
                     } else {
+                        closeLedgerHandle();
                         openComplete(bk.getReturnRc(BKException.Code.LedgerRecoveryException), null);
                     }
                 }
@@ -212,6 +227,7 @@ class LedgerOpenOp {
                 public void readLastConfirmedComplete(int rc,
                         long lastConfirmed, Object ctx) {
                     if (rc != BKException.Code.OK) {
+                        closeLedgerHandle();
                         openComplete(bk.getReturnRc(BKException.Code.ReadException), null);
                     } else {
                         lh.lastAddConfirmed = lh.lastAddPushed = lastConfirmed;