From dca270a2033ca778b93e31492b68af48b7d91a48 Mon Sep 17 00:00:00 2001 From: Yong Zhang Date: Tue, 7 Jun 2022 17:09:24 +0800 Subject: [PATCH] Fix the PendingAddOp is not recycled when LedgerHandler closed --- **Motivation** When adding an entry into a bookie, the entry data lifecycle is handled by the bookie client. The data buffer will be released after receiving a corresponding response from the bookie server. So the user doesn't care about the entry buffer releasing. But when the ledgerHandler is closed, the PendingAddOp is not recycled which leads to the data buffer never being released. We should release that after the callback executed. --- .../main/java/org/apache/bookkeeper/client/LedgerHandle.java | 2 ++ .../main/java/org/apache/bookkeeper/client/PendingAddOp.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java index 530b54c0f05..4d9090e5897 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java @@ -1326,6 +1326,7 @@ public void safeRun() { LOG.warn("Attempt to add to closed ledger: {}", ledgerId); op.cb.addCompleteWithLatency(BKException.Code.LedgerClosedException, LedgerHandle.this, INVALID_ENTRY_ID, 0, op.ctx); + op.recyclePendAddOpObject(); } @Override @@ -1337,6 +1338,7 @@ public String toString() { op.cb.addCompleteWithLatency(BookKeeper.getReturnRc(clientCtx.getBookieClient(), BKException.Code.InterruptedException), LedgerHandle.this, INVALID_ENTRY_ID, 0, op.ctx); + op.recyclePendAddOpObject(); } return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java index 729d9fe077c..223ce182f7a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java @@ -499,7 +499,7 @@ private void maybeRecycle() { } } - private void recyclePendAddOpObject() { + public void recyclePendAddOpObject() { entryId = LedgerHandle.INVALID_ENTRY_ID; currentLedgerLength = -1; if (payload != null) {