diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/MasterNotRunningException.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/MasterNotRunningException.java index 1ff17ac12cc..35cdecba9bb 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/MasterNotRunningException.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/MasterNotRunningException.java @@ -18,15 +18,13 @@ */ package org.apache.hadoop.hbase; -import java.io.IOException; - import org.apache.yetus.audience.InterfaceAudience; /** * Thrown if the master is not running */ @InterfaceAudience.Public -public class MasterNotRunningException extends IOException { +public class MasterNotRunningException extends HBaseIOException { private static final long serialVersionUID = (1L << 23) - 1L; /** default constructor */ public MasterNotRunningException() { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java index 7294559d757..3e055b0eb34 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClusterConnection.java @@ -21,7 +21,6 @@ package org.apache.hadoop.hbase.client; import java.io.IOException; import java.util.List; - import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.MasterNotRunningException; @@ -29,12 +28,12 @@ import org.apache.hadoop.hbase.RegionLocations; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.ZooKeeperConnectionException; -import org.apache.yetus.audience.InterfaceAudience; import org.apache.hadoop.hbase.client.backoff.ClientBackoffPolicy; import org.apache.hadoop.hbase.ipc.RpcControllerFactory; +import org.apache.yetus.audience.InterfaceAudience; + 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.MasterService; /** Internal methods on Connection that should not be used by user code. */ @InterfaceAudience.Private @@ -224,7 +223,7 @@ public interface ClusterConnection extends Connection { /** * Returns a {@link MasterKeepAliveConnection} to the active master */ - MasterService.BlockingInterface getMaster() throws IOException; + MasterKeepAliveConnection getMaster() throws IOException; /** * Get the admin service for master. @@ -258,9 +257,8 @@ public interface ClusterConnection extends Connection { * @return Location of row. * @throws IOException if a remote or network exception occurs */ - HRegionLocation getRegionLocation(TableName tableName, byte [] row, - boolean reload) - throws IOException; + HRegionLocation getRegionLocation(TableName tableName, byte[] row, boolean reload) + throws IOException; /** * Clear any caches that pertain to server name sn. @@ -268,24 +266,6 @@ public interface ClusterConnection extends Connection { */ void clearCaches(final ServerName sn); - /** - * This function allows HBaseAdmin and potentially others to get a shared MasterService - * connection. - * @return The shared instance. Never returns null. - * @throws MasterNotRunningException if master is not running - * @deprecated Since 0.96.0 - */ - @Deprecated - MasterKeepAliveConnection getKeepAliveMasterService() - throws MasterNotRunningException; - - /** - * @param serverName of server to check - * @return true if the server is known as dead, false otherwise. - * @deprecated internal method, do not use thru ClusterConnection */ - @Deprecated - boolean isDeadServer(ServerName serverName); - /** * @return Nonce generator for this ClusterConnection; may be null if disabled in configuration. */ diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java index a5a01881681..6408044c391 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java @@ -538,6 +538,12 @@ class ConnectionImplementation implements ClusterConnection, Closeable { return this.conf; } + private void checkClosed() throws DoNotRetryIOException { + if (this.closed) { + throw new DoNotRetryIOException(toString() + " closed"); + } + } + /** * @return true if the master is running, throws an exception otherwise * @throws org.apache.hadoop.hbase.MasterNotRunningException - if the master is not running @@ -545,21 +551,24 @@ class ConnectionImplementation implements ClusterConnection, Closeable { */ @Deprecated @Override - public boolean isMasterRunning() - throws MasterNotRunningException, ZooKeeperConnectionException { + public boolean isMasterRunning() throws MasterNotRunningException, ZooKeeperConnectionException { // When getting the master connection, we check it's running, // so if there is no exception, it means we've been able to get a // connection on a running master - MasterKeepAliveConnection m = getKeepAliveMasterService(); + MasterKeepAliveConnection m; + try { + m = getKeepAliveMasterService(); + } catch (IOException e) { + throw new MasterNotRunningException(e); + } m.close(); return true; } @Override - public HRegionLocation getRegionLocation(final TableName tableName, - final byte [] row, boolean reload) - throws IOException { - return reload? relocateRegion(tableName, row): locateRegion(tableName, row); + public HRegionLocation getRegionLocation(final TableName tableName, final byte[] row, + boolean reload) throws IOException { + return reload ? relocateRegion(tableName, row) : locateRegion(tableName, row); } @@ -576,9 +585,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { @Override public boolean isTableAvailable(final TableName tableName, @Nullable final byte[][] splitKeys) throws IOException { - if (this.closed) { - throw new IOException(toString() + " closed"); - } + checkClosed(); try { if (!isTableEnabled(tableName)) { LOG.debug("Table " + tableName + " not enabled"); @@ -641,8 +648,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { return locations == null ? null : locations.getRegionLocation(); } - @Override - public boolean isDeadServer(ServerName sn) { + private boolean isDeadServer(ServerName sn) { if (clusterStatusListener == null) { return false; } else { @@ -679,19 +685,19 @@ class ConnectionImplementation implements ClusterConnection, Closeable { } @Override - public HRegionLocation locateRegion( - final TableName tableName, final byte[] row) throws IOException{ + public HRegionLocation locateRegion(final TableName tableName, final byte[] row) + throws IOException { RegionLocations locations = locateRegion(tableName, row, true, true); return locations == null ? null : locations.getRegionLocation(); } @Override - public HRegionLocation relocateRegion(final TableName tableName, - final byte [] row) throws IOException{ - RegionLocations locations = relocateRegion(tableName, row, - RegionReplicaUtil.DEFAULT_REPLICA_ID); - return locations == null ? null : - locations.getRegionLocation(RegionReplicaUtil.DEFAULT_REPLICA_ID); + public HRegionLocation relocateRegion(final TableName tableName, final byte[] row) + throws IOException { + RegionLocations locations = + relocateRegion(tableName, row, RegionReplicaUtil.DEFAULT_REPLICA_ID); + return locations == null ? null + : locations.getRegionLocation(RegionReplicaUtil.DEFAULT_REPLICA_ID); } @Override @@ -708,22 +714,17 @@ class ConnectionImplementation implements ClusterConnection, Closeable { } @Override - public RegionLocations locateRegion(final TableName tableName, - final byte [] row, boolean useCache, boolean retry) - throws IOException { + public RegionLocations locateRegion(final TableName tableName, final byte[] row, boolean useCache, + boolean retry) throws IOException { return locateRegion(tableName, row, useCache, retry, RegionReplicaUtil.DEFAULT_REPLICA_ID); } @Override - public RegionLocations locateRegion(final TableName tableName, - final byte [] row, boolean useCache, boolean retry, int replicaId) - throws IOException { - if (this.closed) { - throw new DoNotRetryIOException(toString() + " closed"); - } - if (tableName== null || tableName.getName().length == 0) { - throw new IllegalArgumentException( - "table name cannot be null or zero length"); + public RegionLocations locateRegion(final TableName tableName, final byte[] row, boolean useCache, + boolean retry, int replicaId) throws IOException { + checkClosed(); + if (tableName == null || tableName.getName().length == 0) { + throw new IllegalArgumentException("table name cannot be null or zero length"); } if (tableName.equals(TableName.META_TABLE_NAME)) { return locateMeta(tableName, useCache, replicaId); @@ -1170,6 +1171,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { @Override public AdminProtos.AdminService.BlockingInterface getAdmin(ServerName serverName) throws IOException { + checkClosed(); if (isDeadServer(serverName)) { throw new RegionServerStoppedException(serverName + " is dead."); } @@ -1184,6 +1186,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { @Override public BlockingInterface getClient(ServerName serverName) throws IOException { + checkClosed(); if (isDeadServer(serverName)) { throw new RegionServerStoppedException(serverName + " is dead."); } @@ -1199,7 +1202,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { final MasterServiceState masterServiceState = new MasterServiceState(this); @Override - public MasterProtos.MasterService.BlockingInterface getMaster() throws MasterNotRunningException { + public MasterKeepAliveConnection getMaster() throws IOException { return getKeepAliveMasterService(); } @@ -1207,20 +1210,11 @@ class ConnectionImplementation implements ClusterConnection, Closeable { mss.userCount++; } - @Override - public MasterKeepAliveConnection getKeepAliveMasterService() - throws MasterNotRunningException { + private MasterKeepAliveConnection getKeepAliveMasterService() throws IOException { synchronized (masterLock) { if (!isKeepAliveMasterConnectedAndRunning(this.masterServiceState)) { MasterServiceStubMaker stubMaker = new MasterServiceStubMaker(); - try { - this.masterServiceState.stub = stubMaker.makeStub(); - } catch (MasterNotRunningException ex) { - throw ex; - } catch (IOException e) { - // rethrow as MasterNotRunningException so that we can keep the method sig - throw new MasterNotRunningException(e); - } + this.masterServiceState.stub = stubMaker.makeStub(); } resetMasterServiceState(this.masterServiceState); } @@ -1955,9 +1949,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { @Override public TableState getTableState(TableName tableName) throws IOException { - if (this.closed) { - throw new IOException(toString() + " closed"); - } + checkClosed(); TableState tableState = MetaTableAccessor.getTableState(this, tableName); if (tableState == null) { throw new TableNotFoundException(tableName); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java index c9e994f9aa2..63ef865ed42 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java @@ -31,12 +31,10 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; - import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellComparator; import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.MasterNotRunningException; import org.apache.hadoop.hbase.PrivateCellUtil; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; @@ -51,9 +49,11 @@ import org.apache.hadoop.net.DNS; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting; import org.apache.hbase.thirdparty.com.google.common.base.Preconditions; import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException; + import org.apache.hadoop.hbase.shaded.protobuf.ResponseConverter; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService; @@ -155,11 +155,11 @@ public final class ConnectionUtils { } @Override - public MasterKeepAliveConnection getKeepAliveMasterService() throws MasterNotRunningException { + public MasterKeepAliveConnection getMaster() throws IOException { if (this.localHostClient instanceof MasterService.BlockingInterface) { return new ShortCircuitMasterConnection((MasterService.BlockingInterface)this.localHostClient); } - return super.getKeepAliveMasterService(); + return super.getMaster(); } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java index a4289e939a7..1a119790834 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java @@ -162,10 +162,7 @@ public class HTable implements Table { final RpcRetryingCallerFactory rpcCallerFactory, final RpcControllerFactory rpcControllerFactory, final ExecutorService pool) { - if (connection == null || connection.isClosed()) { - throw new IllegalArgumentException("Connection is null or closed."); - } - this.connection = connection; + this.connection = Preconditions.checkNotNull(connection, "connection is null"); this.configuration = connection.getConfiguration(); this.connConfiguration = connection.getConnectionConfiguration(); if (pool == null) { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java index f56ebd54f76..7ae97314c48 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java @@ -20,15 +20,14 @@ package org.apache.hadoop.hbase.client; import java.io.Closeable; import java.io.IOException; - -import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.ipc.HBaseRpcController; import org.apache.hadoop.hbase.ipc.RpcControllerFactory; -import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.util.Bytes; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; + /** * A RetryingCallable for Master RPC operations. * Implement the #rpcCall method. It will be retried on error. See its javadoc and the javadoc of @@ -55,7 +54,7 @@ abstract class MasterCallable implements RetryingCallable, Closeable { @Override public void prepare(boolean reload) throws IOException { - this.master = this.connection.getKeepAliveMasterService(); + this.master = this.connection.getMaster(); } @Override @@ -139,7 +138,7 @@ abstract class MasterCallable implements RetryingCallable, Closeable { } private static boolean isMetaRegion(final byte[] regionName) { - return Bytes.equals(regionName, HRegionInfo.FIRST_META_REGIONINFO.getRegionName()) - || Bytes.equals(regionName, HRegionInfo.FIRST_META_REGIONINFO.getEncodedNameAsBytes()); + return Bytes.equals(regionName, RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName()) || + Bytes.equals(regionName, RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedNameAsBytes()); } } diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.java index 387e9dd6c15..dba1a369522 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.java @@ -92,7 +92,7 @@ public class TestSnapshotFromAdmin { // mock the master admin to our mock MasterKeepAliveConnection mockMaster = Mockito.mock(MasterKeepAliveConnection.class); Mockito.when(mockConnection.getConfiguration()).thenReturn(conf); - Mockito.when(mockConnection.getKeepAliveMasterService()).thenReturn(mockMaster); + Mockito.when(mockConnection.getMaster()).thenReturn(mockMaster); // we need a real retrying caller RpcRetryingCallerFactory callerFactory = new RpcRetryingCallerFactory(conf); RpcControllerFactory controllerFactory = Mockito.mock(RpcControllerFactory.class); @@ -163,7 +163,7 @@ public class TestSnapshotFromAdmin { // mock the master connection MasterKeepAliveConnection master = Mockito.mock(MasterKeepAliveConnection.class); - Mockito.when(mockConnection.getKeepAliveMasterService()).thenReturn(master); + Mockito.when(mockConnection.getMaster()).thenReturn(master); SnapshotResponse response = SnapshotResponse.newBuilder().setExpectedTimeout(0).build(); Mockito.when( master.snapshot((RpcController) Mockito.any(), Mockito.any())) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java index bab0fe9ab22..a1026a943ab 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java @@ -102,7 +102,7 @@ public class TestHBaseAdminNoCluster { Mockito.when(masterAdmin.createTable((RpcController)Mockito.any(), (CreateTableRequest)Mockito.any())). thenThrow(new ServiceException("Test fail").initCause(new PleaseHoldException("test"))); - Mockito.when(connection.getKeepAliveMasterService()).thenReturn(masterAdmin); + Mockito.when(connection.getMaster()).thenReturn(masterAdmin); Admin admin = new HBaseAdmin(connection); try { HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName())); @@ -304,7 +304,7 @@ public class TestHBaseAdminNoCluster { throw new MasterNotRunningException(); // all methods will throw an exception } }); - Mockito.when(connection.getKeepAliveMasterService()).thenReturn(masterAdmin); + Mockito.when(connection.getMaster()).thenReturn(masterAdmin); RpcControllerFactory rpcControllerFactory = Mockito.mock(RpcControllerFactory.class); Mockito.when(connection.getRpcControllerFactory()).thenReturn(rpcControllerFactory); Mockito.when(rpcControllerFactory.newController()).thenReturn(