HBASE-25457 Possible race in AsyncConnectionImpl between getChoreServ… (#2839)
Signed-off-by: Viraj Jasani <vjasani@apache.org>
This commit is contained in:
parent
ae77f81e7e
commit
81d17d063c
@ -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 static org.apache.hadoop.hbase.util.FutureUtils.addListener;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.InetSocketAddress;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -50,18 +48,20 @@ import org.apache.hadoop.hbase.ipc.RpcClient;
|
|||||||
import org.apache.hadoop.hbase.ipc.RpcClientFactory;
|
import org.apache.hadoop.hbase.ipc.RpcClientFactory;
|
||||||
import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
|
import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
|
||||||
import org.apache.hadoop.hbase.security.User;
|
import org.apache.hadoop.hbase.security.User;
|
||||||
|
import org.apache.hadoop.hbase.util.ConcurrentMapUtils;
|
||||||
|
import org.apache.hadoop.hbase.util.Threads;
|
||||||
|
import org.apache.hadoop.security.UserGroupInformation;
|
||||||
|
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.AdminProtos.AdminService;
|
||||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService;
|
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;
|
||||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService;
|
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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The implementation of AsyncConnection.
|
* The implementation of AsyncConnection.
|
||||||
@ -179,6 +179,9 @@ class AsyncConnectionImpl implements AsyncConnection {
|
|||||||
* @return ChoreService
|
* @return ChoreService
|
||||||
*/
|
*/
|
||||||
synchronized ChoreService getChoreService() {
|
synchronized ChoreService getChoreService() {
|
||||||
|
if (isClosed()) {
|
||||||
|
throw new IllegalStateException("connection is already closed");
|
||||||
|
}
|
||||||
if (choreService == null) {
|
if (choreService == null) {
|
||||||
choreService = new ChoreService("AsyncConn Chore Service");
|
choreService = new ChoreService("AsyncConn Chore Service");
|
||||||
}
|
}
|
||||||
@ -205,8 +208,11 @@ class AsyncConnectionImpl implements AsyncConnection {
|
|||||||
e -> LOG.warn("failed to close clusterStatusListener", e));
|
e -> LOG.warn("failed to close clusterStatusListener", e));
|
||||||
IOUtils.closeQuietly(rpcClient, e -> LOG.warn("failed to close rpcClient", e));
|
IOUtils.closeQuietly(rpcClient, e -> LOG.warn("failed to close rpcClient", e));
|
||||||
IOUtils.closeQuietly(registry, e -> LOG.warn("failed to close registry", e));
|
IOUtils.closeQuietly(registry, e -> LOG.warn("failed to close registry", e));
|
||||||
if (choreService != null) {
|
synchronized (this) {
|
||||||
choreService.shutdown();
|
if (choreService != null) {
|
||||||
|
choreService.shutdown();
|
||||||
|
choreService = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
metrics.ifPresent(MetricsConnection::shutdown);
|
metrics.ifPresent(MetricsConnection::shutdown);
|
||||||
closed = true;
|
closed = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user