Skip to content

Commit 48a8030

Browse files
bharathvndimiduk
authored andcommitted
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 5cda7a8 commit 48a8030

File tree

4 files changed

+275
-22
lines changed

4 files changed

+275
-22
lines changed

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 & 21 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,13 +29,15 @@
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
import org.apache.hadoop.conf.Configuration;
3636
import org.apache.hadoop.fs.Path;
3737
import org.apache.hadoop.hbase.ClusterMetricsBuilder;
3838
import org.apache.hadoop.hbase.DoNotRetryIOException;
3939
import org.apache.hadoop.hbase.HConstants;
40+
import org.apache.hadoop.hbase.HRegionLocation;
4041
import org.apache.hadoop.hbase.MetaTableAccessor;
4142
import org.apache.hadoop.hbase.NamespaceDescriptor;
4243
import org.apache.hadoop.hbase.Server;
@@ -116,11 +117,9 @@
116117
import org.apache.zookeeper.KeeperException;
117118
import org.slf4j.Logger;
118119
import org.slf4j.LoggerFactory;
119-
120120
import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;
121121
import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
122122
import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;
123-
124123
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
125124
import org.apache.hadoop.hbase.shaded.protobuf.ResponseConverter;
126125
import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos;
@@ -161,6 +160,7 @@
161160
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BalanceResponse;
162161
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersRequest;
163162
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersResponse;
163+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClientMetaService;
164164
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceRequest;
165165
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceResponse;
166166
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateTableRequest;
@@ -185,12 +185,18 @@
185185
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureResponse;
186186
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FixMetaRequest;
187187
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FixMetaResponse;
188+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetActiveMasterRequest;
189+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetActiveMasterResponse;
190+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdRequest;
191+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdResponse;
188192
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest;
189193
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusResponse;
190194
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsRequest;
191195
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsResponse;
192196
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetLocksRequest;
193197
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetLocksResponse;
198+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsRequest;
199+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsResponse;
194200
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorRequest;
195201
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorResponse;
196202
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProcedureResultRequest;
@@ -351,9 +357,10 @@
351357
*/
352358
@InterfaceAudience.Private
353359
@SuppressWarnings("deprecation")
354-
public class MasterRpcServices extends RSRpcServices
355-
implements MasterService.BlockingInterface, RegionServerStatusService.BlockingInterface,
356-
LockService.BlockingInterface, HbckService.BlockingInterface {
360+
public class MasterRpcServices extends RSRpcServices implements
361+
MasterService.BlockingInterface, RegionServerStatusService.BlockingInterface,
362+
LockService.BlockingInterface, HbckService.BlockingInterface,
363+
ClientMetaService.BlockingInterface {
357364
private static final Logger LOG = LoggerFactory.getLogger(MasterRpcServices.class.getName());
358365
private static final Logger AUDITLOG =
359366
LoggerFactory.getLogger("SecurityLogger."+MasterRpcServices.class.getName());
@@ -362,7 +369,7 @@ public class MasterRpcServices extends RSRpcServices
362369

363370
/**
364371
* @return Subset of configuration to pass initializing regionservers: e.g.
365-
* the filesystem to use and root directory to use.
372+
* the filesystem to use and root directory to use.
366373
*/
367374
private RegionServerStartupResponse.Builder createConfigurationSubset() {
368375
RegionServerStartupResponse.Builder resp = addConfig(
@@ -488,15 +495,17 @@ boolean synchronousBalanceSwitch(final boolean b) throws IOException {
488495
protected List<BlockingServiceAndInterface> getServices() {
489496
List<BlockingServiceAndInterface> bssi = new ArrayList<>(5);
490497
bssi.add(new BlockingServiceAndInterface(
491-
MasterService.newReflectiveBlockingService(this),
492-
MasterService.BlockingInterface.class));
498+
MasterService.newReflectiveBlockingService(this),
499+
MasterService.BlockingInterface.class));
493500
bssi.add(new BlockingServiceAndInterface(
494-
RegionServerStatusService.newReflectiveBlockingService(this),
495-
RegionServerStatusService.BlockingInterface.class));
501+
RegionServerStatusService.newReflectiveBlockingService(this),
502+
RegionServerStatusService.BlockingInterface.class));
496503
bssi.add(new BlockingServiceAndInterface(LockService.newReflectiveBlockingService(this),
497504
LockService.BlockingInterface.class));
498505
bssi.add(new BlockingServiceAndInterface(HbckService.newReflectiveBlockingService(this),
499506
HbckService.BlockingInterface.class));
507+
bssi.add(new BlockingServiceAndInterface(ClientMetaService.newReflectiveBlockingService(this),
508+
ClientMetaService.BlockingInterface.class));
500509
bssi.addAll(super.getServices());
501510
return bssi;
502511
}
@@ -623,7 +632,9 @@ public AssignRegionResponse assignRegion(RpcController controller,
623632

624633
final byte[] regionName = req.getRegion().getValue().toByteArray();
625634
final RegionInfo regionInfo = master.getAssignmentManager().getRegionInfo(regionName);
626-
if (regionInfo == null) throw new UnknownRegionException(Bytes.toStringBinary(regionName));
635+
if (regionInfo == null) {
636+
throw new UnknownRegionException(Bytes.toStringBinary(regionName));
637+
}
627638

628639
final AssignRegionResponse arr = AssignRegionResponse.newBuilder().build();
629640
if (master.cpHost != null) {
@@ -668,7 +679,7 @@ public CreateNamespaceResponse createNamespace(RpcController controller,
668679

669680
@Override
670681
public CreateTableResponse createTable(RpcController controller, CreateTableRequest req)
671-
throws ServiceException {
682+
throws ServiceException {
672683
TableDescriptor tableDescriptor = ProtobufUtil.toTableDescriptor(req.getTableSchema());
673684
byte [][] splitKeys = ProtobufUtil.getSplitKeysArray(req);
674685
try {
@@ -1065,7 +1076,7 @@ public GetSchemaAlterStatusResponse getSchemaAlterStatus(
10651076
* Get list of TableDescriptors for requested tables.
10661077
* @param c Unused (set to null).
10671078
* @param req GetTableDescriptorsRequest that contains:
1068-
* - tableNames: requested tables, or if empty, all are requested
1079+
* - tableNames: requested tables, or if empty, all are requested.
10691080
* @return GetTableDescriptorsResponse
10701081
* @throws ServiceException
10711082
*/
@@ -1209,9 +1220,9 @@ public IsProcedureDoneResponse isProcedureDone(RpcController controller,
12091220
/**
12101221
* Checks if the specified snapshot is done.
12111222
* @return true if the snapshot is in file system ready to use,
1212-
* false if the snapshot is in the process of completing
1223+
* false if the snapshot is in the process of completing
12131224
* @throws ServiceException wrapping UnknownSnapshotException if invalid snapshot, or
1214-
* a wrapped HBaseSnapshotException with progress failure reason.
1225+
* a wrapped HBaseSnapshotException with progress failure reason.
12151226
*/
12161227
@Override
12171228
public IsSnapshotDoneResponse isSnapshotDone(RpcController controller,
@@ -1453,7 +1464,9 @@ public OfflineRegionResponse offlineRegion(RpcController controller,
14531464

14541465
final byte[] regionName = request.getRegion().getValue().toByteArray();
14551466
final RegionInfo hri = master.getAssignmentManager().getRegionInfo(regionName);
1456-
if (hri == null) throw new UnknownRegionException(Bytes.toStringBinary(regionName));
1467+
if (hri == null) {
1468+
throw new UnknownRegionException(Bytes.toStringBinary(regionName));
1469+
}
14571470

14581471
if (master.cpHost != null) {
14591472
master.cpHost.preRegionOffline(hri);
@@ -2314,8 +2327,8 @@ public RegionSpaceUseReportResponse reportRegionSpaceUse(RpcController controlle
23142327
report.getRegionSize(), now);
23152328
}
23162329
} else {
2317-
LOG.debug(
2318-
"Received region space usage report but HMaster is not ready to process it, skipping");
2330+
LOG.debug("Received region space usage report but HMaster is not ready to process it, "
2331+
+ "skipping");
23192332
}
23202333
return RegionSpaceUseReportResponse.newBuilder().build();
23212334
} catch (Exception e) {
@@ -2351,8 +2364,8 @@ public GetSpaceQuotaRegionSizesResponse getSpaceQuotaRegionSizes(
23512364
}
23522365
return builder.build();
23532366
} else {
2354-
LOG.debug(
2355-
"Received space quota region size report but HMaster is not ready to process it, skipping");
2367+
LOG.debug("Received space quota region size report but HMaster is not ready to process it,"
2368+
+ "skipping");
23562369
}
23572370
return builder.build();
23582371
} catch (Exception e) {
@@ -2896,4 +2909,34 @@ private boolean shouldSubmitSCP(ServerName serverName) {
28962909
return true;
28972910
}
28982911

2912+
@Override
2913+
public GetClusterIdResponse getClusterId(RpcController rpcController, GetClusterIdRequest request)
2914+
throws ServiceException {
2915+
GetClusterIdResponse.Builder resp = GetClusterIdResponse.newBuilder();
2916+
String clusterId = master.getClusterId();
2917+
if (clusterId != null) {
2918+
resp.setClusterId(clusterId);
2919+
}
2920+
return resp.build();
2921+
}
2922+
2923+
@Override
2924+
public GetActiveMasterResponse getActiveMaster(RpcController rpcController,
2925+
GetActiveMasterRequest request) throws ServiceException {
2926+
GetActiveMasterResponse.Builder resp = GetActiveMasterResponse.newBuilder();
2927+
Optional<ServerName> serverName = master.getActiveMaster();
2928+
serverName.ifPresent(name -> resp.setServerName(ProtobufUtil.toServerName(name)));
2929+
return resp.build();
2930+
}
2931+
2932+
@Override
2933+
public GetMetaRegionLocationsResponse getMetaRegionLocations(RpcController rpcController,
2934+
GetMetaRegionLocationsRequest request) throws ServiceException {
2935+
GetMetaRegionLocationsResponse.Builder response = GetMetaRegionLocationsResponse.newBuilder();
2936+
Optional<List<HRegionLocation>> metaLocations =
2937+
master.getMetaRegionLocationCache().getMetaRegionLocations();
2938+
metaLocations.ifPresent(hRegionLocations -> hRegionLocations.forEach(
2939+
location -> response.addMetaLocations(ProtobufUtil.toRegionLocation(location))));
2940+
return response.build();
2941+
}
28992942
}

0 commit comments

Comments
 (0)