You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2019/10/16 12:57:32 UTC
[hbase] branch branch-2.1 updated: HBASE-22370 ByteBuf LEAK ERROR
(#720)
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new ec9799e HBASE-22370 ByteBuf LEAK ERROR (#720)
ec9799e is described below
commit ec9799ed1f467eab460c09aae97c37eba249add6
Author: binlijin <bi...@gmail.com>
AuthorDate: Wed Oct 16 20:41:27 2019 +0800
HBASE-22370 ByteBuf LEAK ERROR (#720)
Signed-off-by: Duo Zhang <zh...@apache.org>
---
.../io/asyncfs/FanOutOneBlockAsyncDFSOutput.java | 4 ++++
.../org/apache/hadoop/hbase/ipc/CallRunner.java | 1 +
.../apache/hadoop/hbase/ipc/TestCallRunner.java | 26 ++++++++++++++++++++++
3 files changed, 31 insertions(+)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java
index 1645d68..7a429c2 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java
@@ -549,6 +549,10 @@ public class FanOutOneBlockAsyncDFSOutput implements AsyncFSOutput {
*/
@Override
public void recoverAndClose(CancelableProgressable reporter) throws IOException {
+ if (buf != null) {
+ buf.release();
+ buf = null;
+ }
datanodeList.forEach(ch -> ch.close());
datanodeList.forEach(ch -> ch.closeFuture().awaitUninterruptibly());
endFileLease(client, fileId);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/CallRunner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/CallRunner.java
index 0ad3613..48ee664 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/CallRunner.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/CallRunner.java
@@ -88,6 +88,7 @@ public class CallRunner {
* Cleanup after ourselves... let go of references.
*/
private void cleanup() {
+ this.call.cleanup();
this.call = null;
this.rpcServer = null;
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java
index e614c2b..75997af 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java
@@ -45,4 +45,30 @@ public class TestCallRunner {
cr.setStatus(new MonitoredRPCHandlerImpl());
cr.run();
}
+
+ @Test
+ public void testCallCleanup() {
+ RpcServerInterface mockRpcServer = Mockito.mock(RpcServerInterface.class);
+ Mockito.when(mockRpcServer.isStarted()).thenReturn(true);
+ ServerCall mockCall = Mockito.mock(ServerCall.class);
+ Mockito.when(mockCall.disconnectSince()).thenReturn(1L);
+
+ CallRunner cr = new CallRunner(mockRpcServer, mockCall);
+ cr.setStatus(new MonitoredRPCHandlerImpl());
+ cr.run();
+ Mockito.verify(mockCall, Mockito.times(1)).cleanup();
+ }
+
+ @Test
+ public void testCallRunnerDrop() {
+ RpcServerInterface mockRpcServer = Mockito.mock(RpcServerInterface.class);
+ Mockito.when(mockRpcServer.isStarted()).thenReturn(true);
+ ServerCall mockCall = Mockito.mock(ServerCall.class);
+ Mockito.when(mockCall.disconnectSince()).thenReturn(1L);
+
+ CallRunner cr = new CallRunner(mockRpcServer, mockCall);
+ cr.setStatus(new MonitoredRPCHandlerImpl());
+ cr.drop();
+ Mockito.verify(mockCall, Mockito.times(1)).cleanup();
+ }
}