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/09/08 14:36:32 UTC
[hbase] branch branch-2 updated: HBASE-22963 Netty ByteBuf leak in
rpc client implementation (#577)
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new 1568e05 HBASE-22963 Netty ByteBuf leak in rpc client implementation (#577)
1568e05 is described below
commit 1568e05507d9eb4606f9a68ff6dadbf99f1642b4
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Sun Sep 8 21:54:09 2019 +0800
HBASE-22963 Netty ByteBuf leak in rpc client implementation (#577)
Signed-off-by: Michael Stack <st...@apache.org>
---
.../apache/hadoop/hbase/ipc/AbstractRpcClient.java | 1 +
.../hbase/client/TestConnectionImplementation.java | 34 +++++++++++++++++++---
pom.xml | 2 ++
3 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AbstractRpcClient.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AbstractRpcClient.java
index 8fc5b0c..629efe6 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AbstractRpcClient.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AbstractRpcClient.java
@@ -463,6 +463,7 @@ public abstract class AbstractRpcClient<T extends RpcConnection> implements RpcC
+ connection.remoteId);
connections.removeValue(remoteId, connection);
connection.shutdown();
+ connection.cleanupConnection();
}
}
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java
index c8cbe74..98344fe 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementation.java
@@ -67,6 +67,7 @@ import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
import org.apache.hadoop.hbase.util.JVMClusterUtil;
import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;
import org.apache.hadoop.hbase.util.Threads;
+import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
@@ -80,6 +81,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
+import org.apache.hbase.thirdparty.io.netty.util.ResourceLeakDetector;
+import org.apache.hbase.thirdparty.io.netty.util.ResourceLeakDetector.Level;
/**
* This class is for testing HBaseConnectionManager features
@@ -111,6 +114,7 @@ public class TestConnectionImplementation {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
+ ResourceLeakDetector.setLevel(Level.PARANOID);
TEST_UTIL.getConfiguration().setBoolean(HConstants.STATUS_PUBLISHED, true);
// Up the handlers; this test needs more than usual.
TEST_UTIL.getConfiguration().setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 10);
@@ -125,6 +129,11 @@ public class TestConnectionImplementation {
TEST_UTIL.shutdownMiniCluster();
}
+ @After
+ public void tearDown() throws IOException {
+ TEST_UTIL.getAdmin().balancerSwitch(true, true);
+ }
+
@Test
public void testClusterConnection() throws IOException {
ThreadPoolExecutor otherPool = new ThreadPoolExecutor(1, 1,
@@ -283,7 +292,7 @@ public class TestConnectionImplementation {
TableName tableName = TableName.valueOf("HCM-testConnectionClose" + allowsInterrupt);
TEST_UTIL.createTable(tableName, FAM_NAM).close();
- boolean previousBalance = TEST_UTIL.getAdmin().setBalancerRunning(false, true);
+ TEST_UTIL.getAdmin().balancerSwitch(false, true);
Configuration c2 = new Configuration(TEST_UTIL.getConfiguration());
// We want to work on a separate connection.
@@ -348,9 +357,9 @@ public class TestConnectionImplementation {
RpcClient rpcClient = conn.getRpcClient();
LOG.info("Going to cancel connections. connection=" + conn.toString() + ", sn=" + sn);
- for (int i = 0; i < 5000; i++) {
+ for (int i = 0; i < 500; i++) {
rpcClient.cancelConnections(sn);
- Thread.sleep(5);
+ Thread.sleep(50);
}
step.compareAndSet(1, 2);
@@ -365,7 +374,6 @@ public class TestConnectionImplementation {
table.close();
connection.close();
Assert.assertTrue("Unexpected exception is " + failed.get(), failed.get() == null);
- TEST_UTIL.getAdmin().setBalancerRunning(previousBalance, true);
}
/**
@@ -1089,4 +1097,22 @@ public class TestConnectionImplementation {
assertNotNull(ex);
}
}
+
+ // There is no assertion, but you need to confirm that there is no resource leak output from netty
+ @Test
+ public void testCancelConnectionMemoryLeak() throws IOException, InterruptedException {
+ TableName tableName = TableName.valueOf(name.getMethodName());
+ TEST_UTIL.createTable(tableName, FAM_NAM).close();
+ TEST_UTIL.getAdmin().balancerSwitch(false, true);
+ try (Connection connection = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration());
+ Table table = connection.getTable(tableName)) {
+ table.get(new Get(Bytes.toBytes("1")));
+ ServerName sn = TEST_UTIL.getRSForFirstRegionInTable(tableName).getServerName();
+ RpcClient rpcClient = ((ConnectionImplementation) connection).getRpcClient();
+ rpcClient.cancelConnections(sn);
+ Thread.sleep(1000);
+ System.gc();
+ Thread.sleep(1000);
+ }
+ }
}
diff --git a/pom.xml b/pom.xml
index 7b0d2ba..f453a59 100755
--- a/pom.xml
+++ b/pom.xml
@@ -1401,10 +1401,12 @@
<hbase-surefire.argLine>-enableassertions -Dhbase.build.id=${build.id} -Xmx${surefire.Xmx}
-Djava.security.egd=file:/dev/./urandom -Djava.net.preferIPv4Stack=true
-Djava.awt.headless=true -Djdk.net.URLClassPath.disableClassPathURLCheck=true
+ -Dorg.apache.hbase.thirdparty.io.netty.leakDetection.level=paranoid
</hbase-surefire.argLine>
<hbase-surefire.cygwin-argLine>-enableassertions -Xmx${surefire.cygwinXmx}
-Djava.security.egd=file:/dev/./urandom -Djava.net.preferIPv4Stack=true
"-Djava.library.path=${hadoop.library.path};${java.library.path}"
+ -Dorg.apache.hbase.thirdparty.io.netty.leakDetection.level=paranoid
</hbase-surefire.cygwin-argLine>
<!-- Surefire argLine defaults to Linux, cygwin argLine is used in the os.windows profile -->
<argLine>${hbase-surefire.argLine}</argLine>