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 81d17d0 HBASE-25457 Possible race in AsyncConnectionImpl between
getChoreServ… (#2839)
81d17d0 is described below
commit 81d17d063ca4d8ef03fdb7c99d138024b82dc442
Author: Duo Zhang <[email protected]>
AuthorDate: Mon Jan 4 23:30:32 2021 +0800
HBASE-25457 Possible race in AsyncConnectionImpl between getChoreServ…
(#2839)
Signed-off-by: Viraj Jasani <[email protected]>
---
.../hadoop/hbase/client/AsyncConnectionImpl.java | 26 +++++++++++++---------
1 file changed, 16 insertions(+), 10 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 214b016..2653361 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.client.NonceGenerator.CLIENT_NONCES_ENABLE
import static org.apache.hadoop.hbase.util.FutureUtils.addListener;
import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
@@ -50,19 +48,21 @@ import org.apache.hadoop.hbase.ipc.RpcClient;
import org.apache.hadoop.hbase.ipc.RpcClientFactory;
import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
import org.apache.hadoop.hbase.security.User;
-import
org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
-import
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;
-import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService;
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.hbase.thirdparty.io.netty.util.HashedWheelTimer;
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;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService;
+
/**
* The implementation of AsyncConnection.
*/
@@ -179,6 +179,9 @@ class AsyncConnectionImpl implements AsyncConnection {
* @return ChoreService
*/
synchronized ChoreService getChoreService() {
+ if (isClosed()) {
+ throw new IllegalStateException("connection is already closed");
+ }
if (choreService == null) {
choreService = new ChoreService("AsyncConn Chore Service");
}
@@ -205,8 +208,11 @@ class AsyncConnectionImpl implements AsyncConnection {
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);
closed = true;