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;