Skip to content

Commit 023078f

Browse files
committed
HBASE-23304: RPCs needed for client meta information lookup (#904)
* HBASE-23304: RPCs needed for client meta information lookup This patch implements the RPCs needed for the meta information lookup during connection init. New tests added to cover the RPC code paths. HBASE-23305 builds on this to implement the client side logic. Fixed a bunch of checkstyle nits around the places the patch touches. Signed-off-by: Andrew Purtell <apurtell@apache.org>
1 parent 8126566 commit 023078f

4 files changed

Lines changed: 275 additions & 23 deletions

File tree

hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,9 @@ private static IOException makeIOExceptionOfException(Throwable e) {
376376
* @see #toServerName(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ServerName)
377377
*/
378378
public static HBaseProtos.ServerName toServerName(final ServerName serverName) {
379-
if (serverName == null) return null;
379+
if (serverName == null) {
380+
return null;
381+
}
380382
HBaseProtos.ServerName.Builder builder =
381383
HBaseProtos.ServerName.newBuilder();
382384
builder.setHostName(serverName.getHostname());

hbase-protocol-shaded/src/main/protobuf/Master.proto

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,3 +1200,47 @@ service HbckService {
12001200
rpc FixMeta(FixMetaRequest)
12011201
returns(FixMetaResponse);
12021202
}
1203+
1204+
/** Request and response to get the clusterID for this cluster */
1205+
message GetClusterIdRequest {
1206+
}
1207+
message GetClusterIdResponse {
1208+
/** Not set if cluster ID could not be determined. */
1209+
optional string cluster_id = 1;
1210+
}
1211+
1212+
/** Request and response to get the currently active master name for this cluster */
1213+
message GetActiveMasterRequest {
1214+
}
1215+
message GetActiveMasterResponse {
1216+
/** Not set if an active master could not be determined. */
1217+
optional ServerName server_name = 1;
1218+
}
1219+
1220+
/** Request and response to get the current list of meta region locations */
1221+
message GetMetaRegionLocationsRequest {
1222+
}
1223+
message GetMetaRegionLocationsResponse {
1224+
/** Not set if meta region locations could not be determined. */
1225+
repeated RegionLocation meta_locations = 1;
1226+
}
1227+
1228+
/**
1229+
* Implements all the RPCs needed by clients to look up cluster meta information needed for connection establishment.
1230+
*/
1231+
service ClientMetaService {
1232+
/**
1233+
* Get Cluster ID for this cluster.
1234+
*/
1235+
rpc GetClusterId(GetClusterIdRequest) returns(GetClusterIdResponse);
1236+
1237+
/**
1238+
* Get active master server name for this cluster.
1239+
*/
1240+
rpc GetActiveMaster(GetActiveMasterRequest) returns(GetActiveMasterResponse);
1241+
1242+
/**
1243+
* Get current meta replicas' region locations.
1244+
*/
1245+
rpc GetMetaRegionLocations(GetMetaRegionLocationsRequest) returns(GetMetaRegionLocationsResponse);
1246+
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package org.apache.hadoop.hbase.master;
1919

2020
import static org.apache.hadoop.hbase.master.MasterWalManager.META_FILTER;
21-
2221
import java.io.FileNotFoundException;
2322
import java.io.IOException;
2423
import java.net.BindException;
@@ -30,6 +29,7 @@
3029
import java.util.List;
3130
import java.util.Map;
3231
import java.util.Map.Entry;
32+
import java.util.Optional;
3333
import java.util.Set;
3434
import java.util.stream.Collectors;
3535

@@ -38,6 +38,7 @@
3838
import org.apache.hadoop.hbase.ClusterMetricsBuilder;
3939
import org.apache.hadoop.hbase.DoNotRetryIOException;
4040
import org.apache.hadoop.hbase.HConstants;
41+
import org.apache.hadoop.hbase.HRegionLocation;
4142
import org.apache.hadoop.hbase.MetaTableAccessor;
4243
import org.apache.hadoop.hbase.NamespaceDescriptor;
4344
import org.apache.hadoop.hbase.Server;
@@ -119,12 +120,9 @@
119120
import org.apache.zookeeper.KeeperException;
120121
import org.slf4j.Logger;
121122
import org.slf4j.LoggerFactory;
122-
123123
import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;
124124
import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
125125
import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;
126-
127-
128126
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
129127
import org.apache.hadoop.hbase.shaded.protobuf.ResponseConverter;
130128
import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos;
@@ -165,6 +163,7 @@
165163
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BalanceResponse;
166164
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersRequest;
167165
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersResponse;
166+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClientMetaService;
168167
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceRequest;
169168
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceResponse;
170169
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateTableRequest;
@@ -189,12 +188,18 @@
189188
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureResponse;
190189
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FixMetaRequest;
191190
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FixMetaResponse;
191+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetActiveMasterRequest;
192+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetActiveMasterResponse;
193+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdRequest;
194+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdResponse;
192195
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest;
193196
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusResponse;
194197
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsRequest;
195198
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsResponse;
196199
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetLocksRequest;
197200
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetLocksResponse;
201+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsRequest;
202+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsResponse;
198203
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorRequest;
199204
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorResponse;
200205
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProcedureResultRequest;
@@ -357,9 +362,10 @@
357362
*/
358363
@InterfaceAudience.Private
359364
@SuppressWarnings("deprecation")
360-
public class MasterRpcServices extends RSRpcServices
361-
implements MasterService.BlockingInterface, RegionServerStatusService.BlockingInterface,
362-
LockService.BlockingInterface, HbckService.BlockingInterface {
365+
public class MasterRpcServices extends RSRpcServices implements
366+
MasterService.BlockingInterface, RegionServerStatusService.BlockingInterface,
367+
LockService.BlockingInterface, HbckService.BlockingInterface,
368+
ClientMetaService.BlockingInterface {
363369
private static final Logger LOG = LoggerFactory.getLogger(MasterRpcServices.class.getName());
364370
private static final Logger AUDITLOG =
365371
LoggerFactory.getLogger("SecurityLogger."+MasterRpcServices.class.getName());
@@ -368,7 +374,7 @@ public class MasterRpcServices extends RSRpcServices
368374

369375
/**
370376
* @return Subset of configuration to pass initializing regionservers: e.g.
371-
* the filesystem to use and root directory to use.
377+
* the filesystem to use and root directory to use.
372378
*/
373379
private RegionServerStartupResponse.Builder createConfigurationSubset() {
374380
RegionServerStartupResponse.Builder resp = addConfig(
@@ -494,15 +500,17 @@ boolean synchronousBalanceSwitch(final boolean b) throws IOException {
494500
protected List<BlockingServiceAndInterface> getServices() {
495501
List<BlockingServiceAndInterface> bssi = new ArrayList<>(5);
496502
bssi.add(new BlockingServiceAndInterface(
497-
MasterService.newReflectiveBlockingService(this),
498-
MasterService.BlockingInterface.class));
503+
MasterService.newReflectiveBlockingService(this),
504+
MasterService.BlockingInterface.class));
499505
bssi.add(new BlockingServiceAndInterface(
500-
RegionServerStatusService.newReflectiveBlockingService(this),
501-
RegionServerStatusService.BlockingInterface.class));
506+
RegionServerStatusService.newReflectiveBlockingService(this),
507+
RegionServerStatusService.BlockingInterface.class));
502508
bssi.add(new BlockingServiceAndInterface(LockService.newReflectiveBlockingService(this),
503509
LockService.BlockingInterface.class));
504510
bssi.add(new BlockingServiceAndInterface(HbckService.newReflectiveBlockingService(this),
505511
HbckService.BlockingInterface.class));
512+
bssi.add(new BlockingServiceAndInterface(ClientMetaService.newReflectiveBlockingService(this),
513+
ClientMetaService.BlockingInterface.class));
506514
bssi.addAll(super.getServices());
507515
return bssi;
508516
}
@@ -629,7 +637,9 @@ public AssignRegionResponse assignRegion(RpcController controller,
629637

630638
final byte[] regionName = req.getRegion().getValue().toByteArray();
631639
final RegionInfo regionInfo = master.getAssignmentManager().getRegionInfo(regionName);
632-
if (regionInfo == null) throw new UnknownRegionException(Bytes.toStringBinary(regionName));
640+
if (regionInfo == null) {
641+
throw new UnknownRegionException(Bytes.toStringBinary(regionName));
642+
}
633643

634644
final AssignRegionResponse arr = AssignRegionResponse.newBuilder().build();
635645
if (master.cpHost != null) {
@@ -674,7 +684,7 @@ public CreateNamespaceResponse createNamespace(RpcController controller,
674684

675685
@Override
676686
public CreateTableResponse createTable(RpcController controller, CreateTableRequest req)
677-
throws ServiceException {
687+
throws ServiceException {
678688
TableDescriptor tableDescriptor = ProtobufUtil.toTableDescriptor(req.getTableSchema());
679689
byte [][] splitKeys = ProtobufUtil.getSplitKeysArray(req);
680690
try {
@@ -1071,7 +1081,7 @@ public GetSchemaAlterStatusResponse getSchemaAlterStatus(
10711081
* Get list of TableDescriptors for requested tables.
10721082
* @param c Unused (set to null).
10731083
* @param req GetTableDescriptorsRequest that contains:
1074-
* - tableNames: requested tables, or if empty, all are requested
1084+
* - tableNames: requested tables, or if empty, all are requested.
10751085
* @return GetTableDescriptorsResponse
10761086
* @throws ServiceException
10771087
*/
@@ -1215,9 +1225,9 @@ public IsProcedureDoneResponse isProcedureDone(RpcController controller,
12151225
/**
12161226
* Checks if the specified snapshot is done.
12171227
* @return true if the snapshot is in file system ready to use,
1218-
* false if the snapshot is in the process of completing
1228+
* false if the snapshot is in the process of completing
12191229
* @throws ServiceException wrapping UnknownSnapshotException if invalid snapshot, or
1220-
* a wrapped HBaseSnapshotException with progress failure reason.
1230+
* a wrapped HBaseSnapshotException with progress failure reason.
12211231
*/
12221232
@Override
12231233
public IsSnapshotDoneResponse isSnapshotDone(RpcController controller,
@@ -1459,7 +1469,9 @@ public OfflineRegionResponse offlineRegion(RpcController controller,
14591469

14601470
final byte[] regionName = request.getRegion().getValue().toByteArray();
14611471
final RegionInfo hri = master.getAssignmentManager().getRegionInfo(regionName);
1462-
if (hri == null) throw new UnknownRegionException(Bytes.toStringBinary(regionName));
1472+
if (hri == null) {
1473+
throw new UnknownRegionException(Bytes.toStringBinary(regionName));
1474+
}
14631475

14641476
if (master.cpHost != null) {
14651477
master.cpHost.preRegionOffline(hri);
@@ -2274,8 +2286,8 @@ public RegionSpaceUseReportResponse reportRegionSpaceUse(RpcController controlle
22742286
report.getRegionSize(), now);
22752287
}
22762288
} else {
2277-
LOG.debug(
2278-
"Received region space usage report but HMaster is not ready to process it, skipping");
2289+
LOG.debug("Received region space usage report but HMaster is not ready to process it, "
2290+
+ "skipping");
22792291
}
22802292
return RegionSpaceUseReportResponse.newBuilder().build();
22812293
} catch (Exception e) {
@@ -2311,8 +2323,8 @@ public GetSpaceQuotaRegionSizesResponse getSpaceQuotaRegionSizes(
23112323
}
23122324
return builder.build();
23132325
} else {
2314-
LOG.debug(
2315-
"Received space quota region size report but HMaster is not ready to process it, skipping");
2326+
LOG.debug("Received space quota region size report but HMaster is not ready to process it,"
2327+
+ "skipping");
23162328
}
23172329
return builder.build();
23182330
} catch (Exception e) {
@@ -2856,4 +2868,34 @@ private boolean shouldSubmitSCP(ServerName serverName) {
28562868
return true;
28572869
}
28582870

2871+
@Override
2872+
public GetClusterIdResponse getClusterId(RpcController rpcController, GetClusterIdRequest request)
2873+
throws ServiceException {
2874+
GetClusterIdResponse.Builder resp = GetClusterIdResponse.newBuilder();
2875+
String clusterId = master.getClusterId();
2876+
if (clusterId != null) {
2877+
resp.setClusterId(clusterId);
2878+
}
2879+
return resp.build();
2880+
}
2881+
2882+
@Override
2883+
public GetActiveMasterResponse getActiveMaster(RpcController rpcController,
2884+
GetActiveMasterRequest request) throws ServiceException {
2885+
GetActiveMasterResponse.Builder resp = GetActiveMasterResponse.newBuilder();
2886+
Optional<ServerName> serverName = master.getActiveMaster();
2887+
serverName.ifPresent(name -> resp.setServerName(ProtobufUtil.toServerName(name)));
2888+
return resp.build();
2889+
}
2890+
2891+
@Override
2892+
public GetMetaRegionLocationsResponse getMetaRegionLocations(RpcController rpcController,
2893+
GetMetaRegionLocationsRequest request) throws ServiceException {
2894+
GetMetaRegionLocationsResponse.Builder response = GetMetaRegionLocationsResponse.newBuilder();
2895+
Optional<List<HRegionLocation>> metaLocations =
2896+
master.getMetaRegionLocationCache().getMetaRegionLocations();
2897+
metaLocations.ifPresent(hRegionLocations -> hRegionLocations.forEach(
2898+
location -> response.addMetaLocations(ProtobufUtil.toRegionLocation(location))));
2899+
return response.build();
2900+
}
28592901
}

0 commit comments

Comments
 (0)