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:54 UTC

[bookkeeper] 30/31: Fix memory leak of direct memory. (#3983)

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 cec8551b1dbe98a8dceff4c3b80b4088a53314d9
Author: Yan Zhao <ho...@apache.org>
AuthorDate: Tue Jun 13 14:30:42 2023 +0800

    Fix memory leak of direct memory. (#3983)
    
    Descriptions of the changes in this PR:
    
    ### Motivation
    When open a non-exist file for DirectReader, it will throw an exception. The ByteBuf won't release.
    When close DirectWriter, if the close failed, the ByteBuf also won't release.
    
    (cherry picked from commit c8c593ee6d3e1f8970bc90b4b6785ff405c81cc4)
---
 .../bookie/storage/directentrylogger/DirectReader.java           | 3 +--
 .../bookie/storage/directentrylogger/DirectWriter.java           | 9 +++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectReader.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectReader.java
index 36d0b263f8..f5076f3484 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectReader.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectReader.java
@@ -56,8 +56,6 @@ class DirectReader implements LogReader {
         this.filename = filename;
         this.maxSaneEntrySize = maxSaneEntrySize;
         this.readBlockStats = readBlockStats;
-
-        nativeBuffer = new Buffer(nativeIO, bufferSize);
         closed = false;
 
         try {
@@ -71,6 +69,7 @@ class DirectReader implements LogReader {
                                   .kv("errno", ne.getErrno()).toString());
         }
         refreshMaxOffset();
+        nativeBuffer = new Buffer(nativeIO, bufferSize);
     }
 
     @Override
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectWriter.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectWriter.java
index 17466d1e40..be411982d3 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectWriter.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/directentrylogger/DirectWriter.java
@@ -233,10 +233,11 @@ class DirectWriter implements LogWriter {
             throw new IOException(exMsg(ne.getMessage())
                                   .kv("file", filename)
                                   .kv("errno", ne.getErrno()).toString());
-        }
-        synchronized (bufferLock) {
-            bufferPool.release(nativeBuffer);
-            nativeBuffer = null;
+        } finally {
+            synchronized (bufferLock) {
+                bufferPool.release(nativeBuffer);
+                nativeBuffer = null;
+            }
         }
     }