From ec1d33de39e3689542ac8348ac845f64c3af33e9 Mon Sep 17 00:00:00 2001 From: Duo Zhang Date: Mon, 4 Jan 2021 14:37:40 +0800 Subject: [PATCH 1/2] HBASE-25457 Possible race in AsyncConnectionImpl between getChoreService and close --- .../hadoop/hbase/client/AsyncConnectionImpl.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java index 1dbb7e6d211a..579e73217f1f 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java @@ -28,8 +28,6 @@ import static org.apache.hadoop.hbase.util.FutureUtils.addListener; import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -56,11 +54,11 @@ import org.apache.hadoop.hbase.util.ConcurrentMapUtils; import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.security.UserGroupInformation; -import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService; @@ -187,6 +185,9 @@ private void spawnRenewalChore(final UserGroupInformation user) { * @return ChoreService */ synchronized ChoreService getChoreService() { + if (closed.get()) { + throw new IllegalStateException("connection is already closed"); + } if (choreService == null) { choreService = new ChoreService("AsyncConn Chore Service"); } @@ -216,8 +217,11 @@ public void close() { e -> LOG.warn("failed to close clusterStatusListener", e)); IOUtils.closeQuietly(rpcClient, e -> LOG.warn("failed to close rpcClient", e)); IOUtils.closeQuietly(registry, e -> LOG.warn("failed to close registry", e)); - if (choreService != null) { - choreService.shutdown(); + synchronized (this) { + if (choreService != null) { + choreService.shutdown(); + choreService = null; + } } metrics.ifPresent(MetricsConnection::shutdown); ConnectionOverAsyncConnection c = this.conn; From 423af72835c38d31e43c7aa4ec6613dcf89f4e48 Mon Sep 17 00:00:00 2001 From: Duo Zhang Date: Mon, 4 Jan 2021 22:12:51 +0800 Subject: [PATCH 2/2] use isClosed --- .../org/apache/hadoop/hbase/client/AsyncConnectionImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java index 579e73217f1f..8a1ac5aac76d 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java @@ -185,7 +185,7 @@ private void spawnRenewalChore(final UserGroupInformation user) { * @return ChoreService */ synchronized ChoreService getChoreService() { - if (closed.get()) { + if (isClosed()) { throw new IllegalStateException("connection is already closed"); } if (choreService == null) {