Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id B94A4200D67 for ; Sun, 24 Dec 2017 16:19:17 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id B7E0E160C0B; Sun, 24 Dec 2017 15:19:17 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 5E0A9160C31 for ; Sun, 24 Dec 2017 16:19:15 +0100 (CET) Received: (qmail 64822 invoked by uid 500); 24 Dec 2017 15:19:12 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 64455 invoked by uid 99); 24 Dec 2017 15:19:11 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 24 Dec 2017 15:19:11 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 5EE1CF17E2; Sun, 24 Dec 2017 15:19:10 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: git-site-role@apache.org To: commits@hbase.apache.org Date: Sun, 24 Dec 2017 15:19:23 -0000 Message-Id: <3ef9d7930f4042f2960c0e529c3d961c@git.apache.org> In-Reply-To: <06d5b49ba42d48018b98732a6ed5614b@git.apache.org> References: <06d5b49ba42d48018b98732a6ed5614b@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [15/23] hbase-site git commit: Published site at . archived-at: Sun, 24 Dec 2017 15:19:17 -0000 http://git-wip-us.apache.org/repos/asf/hbase-site/blob/c33bd58a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html ---------------------------------------------------------------------- diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html index 23ac6f4..c0ea7b2 100644 --- a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html +++ b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html @@ -26,17 +26,17 @@ 018 019package org.apache.hadoop.hbase.rsgroup; 020 -021import java.io.IOException; -022import java.util.Collections; -023import java.util.HashSet; -024import java.util.List; -025import java.util.Optional; -026import java.util.Set; -027import java.util.stream.Collectors; -028 -029import com.google.protobuf.RpcCallback; -030import com.google.protobuf.RpcController; -031import com.google.protobuf.Service; +021import com.google.protobuf.RpcCallback; +022import com.google.protobuf.RpcController; +023import com.google.protobuf.Service; +024 +025import java.io.IOException; +026import java.util.Collections; +027import java.util.HashSet; +028import java.util.List; +029import java.util.Optional; +030import java.util.Set; +031import java.util.stream.Collectors; 032 033import org.apache.hadoop.hbase.CoprocessorEnvironment; 034import org.apache.hadoop.hbase.HConstants; @@ -82,328 +82,331 @@ 074import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupResponse; 075import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersRequest; 076import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersResponse; -077import org.apache.hadoop.hbase.shaded.com.google.common.collect.Sets; -078import org.apache.yetus.audience.InterfaceAudience; -079import org.slf4j.Logger; -080import org.slf4j.LoggerFactory; -081 -082// TODO: Encapsulate MasterObserver functions into separate subclass. -083@CoreCoprocessor -084@InterfaceAudience.Private -085public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver { -086 private static final Logger LOG = LoggerFactory.getLogger(RSGroupAdminEndpoint.class); -087 -088 private MasterServices master = null; -089 // Only instance of RSGroupInfoManager. RSGroup aware load balancers ask for this instance on -090 // their setup. -091 private RSGroupInfoManager groupInfoManager; -092 private RSGroupAdminServer groupAdminServer; -093 private final RSGroupAdminService groupAdminService = new RSGroupAdminServiceImpl(); -094 -095 @Override -096 public void start(CoprocessorEnvironment env) throws IOException { -097 if (!(env instanceof HasMasterServices)) { -098 throw new IOException("Does not implement HMasterServices"); -099 } -100 master = ((HasMasterServices)env).getMasterServices(); -101 groupInfoManager = RSGroupInfoManagerImpl.getInstance(master); -102 groupAdminServer = new RSGroupAdminServer(master, groupInfoManager); -103 Class<?> clazz = -104 master.getConfiguration().getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, null); -105 if (!RSGroupableBalancer.class.isAssignableFrom(clazz)) { -106 throw new IOException("Configured balancer does not support RegionServer groups."); -107 } -108 } -109 -110 @Override -111 public Iterable<Service> getServices() { -112 return Collections.singleton(groupAdminService); -113 } -114 -115 @Override -116 public Optional<MasterObserver> getMasterObserver() { -117 return Optional.of(this); -118 } -119 -120 RSGroupInfoManager getGroupInfoManager() { -121 return groupInfoManager; -122 } -123 -124 /** -125 * Implementation of RSGroupAdminService defined in RSGroupAdmin.proto. -126 * This class calls {@link RSGroupAdminServer} for actual work, converts result to protocol -127 * buffer response, handles exceptions if any occurred and then calls the {@code RpcCallback} with -128 * the response. -129 */ -130 private class RSGroupAdminServiceImpl extends RSGroupAdminProtos.RSGroupAdminService { -131 @Override -132 public void getRSGroupInfo(RpcController controller, -133 GetRSGroupInfoRequest request, RpcCallback<GetRSGroupInfoResponse> done) { -134 GetRSGroupInfoResponse.Builder builder = GetRSGroupInfoResponse.newBuilder(); -135 String groupName = request.getRSGroupName(); -136 LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, group=" -137 + groupName); -138 try { -139 RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName); -140 if (rsGroupInfo != null) { -141 builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(rsGroupInfo)); -142 } -143 } catch (IOException e) { -144 CoprocessorRpcUtils.setControllerException(controller, e); -145 } -146 done.run(builder.build()); -147 } -148 -149 @Override -150 public void getRSGroupInfoOfTable(RpcController controller, -151 GetRSGroupInfoOfTableRequest request, RpcCallback<GetRSGroupInfoOfTableResponse> done) { -152 GetRSGroupInfoOfTableResponse.Builder builder = GetRSGroupInfoOfTableResponse.newBuilder(); -153 try { -154 TableName tableName = ProtobufUtil.toTableName(request.getTableName()); -155 LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, table=" -156 + tableName); -157 RSGroupInfo RSGroupInfo = groupAdminServer.getRSGroupInfoOfTable(tableName); -158 if (RSGroupInfo != null) { -159 builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo)); -160 } -161 } catch (IOException e) { -162 CoprocessorRpcUtils.setControllerException(controller, e); -163 } -164 done.run(builder.build()); -165 } -166 -167 @Override -168 public void moveServers(RpcController controller, MoveServersRequest request, -169 RpcCallback<MoveServersResponse> done) { -170 MoveServersResponse.Builder builder = MoveServersResponse.newBuilder(); -171 try { -172 Set<Address> hostPorts = Sets.newHashSet(); -173 for (HBaseProtos.ServerName el : request.getServersList()) { -174 hostPorts.add(Address.fromParts(el.getHostName(), el.getPort())); -175 } -176 LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts +" to rsgroup " -177 + request.getTargetGroup()); -178 groupAdminServer.moveServers(hostPorts, request.getTargetGroup()); -179 } catch (IOException e) { -180 CoprocessorRpcUtils.setControllerException(controller, e); -181 } -182 done.run(builder.build()); -183 } -184 -185 @Override -186 public void moveTables(RpcController controller, MoveTablesRequest request, -187 RpcCallback<MoveTablesResponse> done) { -188 MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder(); -189 try { -190 Set<TableName> tables = new HashSet<>(request.getTableNameList().size()); -191 for (HBaseProtos.TableName tableName : request.getTableNameList()) { -192 tables.add(ProtobufUtil.toTableName(tableName)); -193 } -194 LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +" to rsgroup " -195 + request.getTargetGroup()); -196 groupAdminServer.moveTables(tables, request.getTargetGroup()); -197 } catch (IOException e) { -198 CoprocessorRpcUtils.setControllerException(controller, e); -199 } -200 done.run(builder.build()); -201 } -202 -203 @Override -204 public void addRSGroup(RpcController controller, AddRSGroupRequest request, -205 RpcCallback<AddRSGroupResponse> done) { -206 AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder(); -207 LOG.info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName()); -208 try { -209 groupAdminServer.addRSGroup(request.getRSGroupName()); -210 } catch (IOException e) { -211 CoprocessorRpcUtils.setControllerException(controller, e); -212 } -213 done.run(builder.build()); -214 } -215 -216 @Override -217 public void removeRSGroup(RpcController controller, -218 RemoveRSGroupRequest request, RpcCallback<RemoveRSGroupResponse> done) { -219 RemoveRSGroupResponse.Builder builder = -220 RemoveRSGroupResponse.newBuilder(); -221 LOG.info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName()); -222 try { -223 groupAdminServer.removeRSGroup(request.getRSGroupName()); -224 } catch (IOException e) { -225 CoprocessorRpcUtils.setControllerException(controller, e); -226 } -227 done.run(builder.build()); -228 } -229 -230 @Override -231 public void balanceRSGroup(RpcController controller, -232 BalanceRSGroupRequest request, RpcCallback<BalanceRSGroupResponse> done) { -233 BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder(); -234 LOG.info(master.getClientIdAuditPrefix() + " balance rsgroup, group=" + request.getRSGroupName()); -235 try { -236 builder.setBalanceRan(groupAdminServer.balanceRSGroup(request.getRSGroupName())); -237 } catch (IOException e) { -238 CoprocessorRpcUtils.setControllerException(controller, e); -239 builder.setBalanceRan(false); -240 } -241 done.run(builder.build()); -242 } -243 -244 @Override -245 public void listRSGroupInfos(RpcController controller, -246 ListRSGroupInfosRequest request, RpcCallback<ListRSGroupInfosResponse> done) { -247 ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder(); -248 LOG.info(master.getClientIdAuditPrefix() + " list rsgroup"); -249 try { -250 for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) { -251 builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo)); -252 } -253 } catch (IOException e) { -254 CoprocessorRpcUtils.setControllerException(controller, e); -255 } -256 done.run(builder.build()); -257 } -258 -259 @Override -260 public void getRSGroupInfoOfServer(RpcController controller, -261 GetRSGroupInfoOfServerRequest request, RpcCallback<GetRSGroupInfoOfServerResponse> done) { -262 GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder(); -263 try { -264 Address hp = Address.fromParts(request.getServer().getHostName(), -265 request.getServer().getPort()); -266 LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server=" + hp); -267 RSGroupInfo RSGroupInfo = groupAdminServer.getRSGroupOfServer(hp); -268 if (RSGroupInfo != null) { -269 builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo)); -270 } -271 } catch (IOException e) { -272 CoprocessorRpcUtils.setControllerException(controller, e); -273 } -274 done.run(builder.build()); -275 } -276 -277 @Override -278 public void moveServersAndTables(RpcController controller, -279 MoveServersAndTablesRequest request, RpcCallback<MoveServersAndTablesResponse> done) { -280 MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder(); -281 try { -282 Set<Address> hostPorts = Sets.newHashSet(); -283 for (HBaseProtos.ServerName el : request.getServersList()) { -284 hostPorts.add(Address.fromParts(el.getHostName(), el.getPort())); -285 } -286 Set<TableName> tables = new HashSet<>(request.getTableNameList().size()); -287 for (HBaseProtos.TableName tableName : request.getTableNameList()) { -288 tables.add(ProtobufUtil.toTableName(tableName)); -289 } -290 LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts -291 + " and tables " + tables + " to rsgroup" + request.getTargetGroup()); -292 groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup()); -293 } catch (IOException e) { -294 CoprocessorRpcUtils.setControllerException(controller, e); -295 } -296 done.run(builder.build()); -297 } -298 -299 @Override -300 public void removeServers(RpcController controller, -301 RemoveServersRequest request, -302 RpcCallback<RemoveServersResponse> done) { -303 RemoveServersResponse.Builder builder = -304 RemoveServersResponse.newBuilder(); -305 try { -306 Set<Address> servers = Sets.newHashSet(); -307 for (HBaseProtos.ServerName el : request.getServersList()) { -308 servers.add(Address.fromParts(el.getHostName(), el.getPort())); -309 } -310 LOG.info(master.getClientIdAuditPrefix() -311 + " remove decommissioned servers from rsgroup: " + servers); -312 groupAdminServer.removeServers(servers); -313 } catch (IOException e) { -314 CoprocessorRpcUtils.setControllerException(controller, e); -315 } -316 done.run(builder.build()); -317 } -318 } -319 -320 void assignTableToGroup(TableDescriptor desc) throws IOException { -321 String groupName = -322 master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString()) -323 .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP); -324 if (groupName == null) { -325 groupName = RSGroupInfo.DEFAULT_GROUP; -326 } -327 RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName); -328 if (rsGroupInfo == null) { -329 throw new ConstraintException("Default RSGroup (" + groupName + ") for this table's " -330 + "namespace does not exist."); -331 } -332 if (!rsGroupInfo.containsTable(desc.getTableName())) { -333 LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + groupName); -334 groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName); -335 } -336 } -337 -338 ///////////////////////////////////////////////////////////////////////////// -339 // MasterObserver overrides -340 ///////////////////////////////////////////////////////////////////////////// -341 -342 // Assign table to default RSGroup. -343 @Override -344 public void postCreateTable(ObserverContext<MasterCoprocessorEnvironment> ctx, -345 TableDescriptor desc, RegionInfo[] regions) throws IOException { -346 assignTableToGroup(desc); -347 } -348 -349 // Remove table from its RSGroup. -350 @Override -351 public void postDeleteTable(ObserverContext<MasterCoprocessorEnvironment> ctx, -352 TableName tableName) throws IOException { -353 try { -354 RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName); -355 if (group != null) { -356 LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName, -357 group.getName())); -358 groupAdminServer.moveTables(Sets.newHashSet(tableName), null); -359 } -360 } catch (IOException ex) { -361 LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex); -362 } -363 } -364 -365 @Override -366 public void preCreateNamespace(ObserverContext<MasterCoprocessorEnvironment> ctx, -367 NamespaceDescriptor ns) throws IOException { -368 String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP); -369 if(group != null && groupAdminServer.getRSGroupInfo(group) == null) { -370 throw new ConstraintException("Region server group "+group+" does not exit"); -371 } -372 } -373 -374 @Override -375 public void preModifyNamespace(ObserverContext<MasterCoprocessorEnvironment> ctx, -376 NamespaceDescriptor ns) throws IOException { -377 preCreateNamespace(ctx, ns); -378 } -379 -380 @Override -381 public void preCloneSnapshot(ObserverContext<MasterCoprocessorEnvironment> ctx, -382 SnapshotDescription snapshot, TableDescriptor desc) throws IOException { -383 assignTableToGroup(desc); -384 } -385 -386 @Override -387 public void postClearDeadServers(ObserverContext<MasterCoprocessorEnvironment> ctx, -388 List<ServerName> servers, List<ServerName> notClearedServers) -389 throws IOException { -390 Set<Address> clearedServer = servers.stream(). -391 filter(server -> !notClearedServers.contains(server)). -392 map(ServerName::getAddress). -393 collect(Collectors.toSet()); -394 groupAdminServer.removeServers(clearedServer); -395 } -396 -397 ///////////////////////////////////////////////////////////////////////////// -398} +077import org.apache.yetus.audience.InterfaceAudience; +078import org.slf4j.Logger; +079import org.slf4j.LoggerFactory; +080 +081import org.apache.hadoop.hbase.shaded.com.google.common.collect.Sets; +082 +083// TODO: Encapsulate MasterObserver functions into separate subclass. +084@CoreCoprocessor +085@InterfaceAudience.Private +086public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver { +087 private static final Logger LOG = LoggerFactory.getLogger(RSGroupAdminEndpoint.class); +088 +089 private MasterServices master = null; +090 // Only instance of RSGroupInfoManager. RSGroup aware load balancers ask for this instance on +091 // their setup. +092 private RSGroupInfoManager groupInfoManager; +093 private RSGroupAdminServer groupAdminServer; +094 private final RSGroupAdminService groupAdminService = new RSGroupAdminServiceImpl(); +095 +096 @Override +097 public void start(CoprocessorEnvironment env) throws IOException { +098 if (!(env instanceof HasMasterServices)) { +099 throw new IOException("Does not implement HMasterServices"); +100 } +101 master = ((HasMasterServices)env).getMasterServices(); +102 groupInfoManager = RSGroupInfoManagerImpl.getInstance(master); +103 groupAdminServer = new RSGroupAdminServer(master, groupInfoManager); +104 Class<?> clazz = +105 master.getConfiguration().getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, null); +106 if (!RSGroupableBalancer.class.isAssignableFrom(clazz)) { +107 throw new IOException("Configured balancer does not support RegionServer groups."); +108 } +109 } +110 +111 @Override +112 public Iterable<Service> getServices() { +113 return Collections.singleton(groupAdminService); +114 } +115 +116 @Override +117 public Optional<MasterObserver> getMasterObserver() { +118 return Optional.of(this); +119 } +120 +121 RSGroupInfoManager getGroupInfoManager() { +122 return groupInfoManager; +123 } +124 +125 /** +126 * Implementation of RSGroupAdminService defined in RSGroupAdmin.proto. +127 * This class calls {@link RSGroupAdminServer} for actual work, converts result to protocol +128 * buffer response, handles exceptions if any occurred and then calls the {@code RpcCallback} with +129 * the response. +130 */ +131 private class RSGroupAdminServiceImpl extends RSGroupAdminProtos.RSGroupAdminService { +132 @Override +133 public void getRSGroupInfo(RpcController controller, +134 GetRSGroupInfoRequest request, RpcCallback<GetRSGroupInfoResponse> done) { +135 GetRSGroupInfoResponse.Builder builder = GetRSGroupInfoResponse.newBuilder(); +136 String groupName = request.getRSGroupName(); +137 LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, group=" +138 + groupName); +139 try { +140 RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName); +141 if (rsGroupInfo != null) { +142 builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(rsGroupInfo)); +143 } +144 } catch (IOException e) { +145 CoprocessorRpcUtils.setControllerException(controller, e); +146 } +147 done.run(builder.build()); +148 } +149 +150 @Override +151 public void getRSGroupInfoOfTable(RpcController controller, +152 GetRSGroupInfoOfTableRequest request, RpcCallback<GetRSGroupInfoOfTableResponse> done) { +153 GetRSGroupInfoOfTableResponse.Builder builder = GetRSGroupInfoOfTableResponse.newBuilder(); +154 try { +155 TableName tableName = ProtobufUtil.toTableName(request.getTableName()); +156 LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, table=" +157 + tableName); +158 RSGroupInfo RSGroupInfo = groupAdminServer.getRSGroupInfoOfTable(tableName); +159 if (RSGroupInfo != null) { +160 builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo)); +161 } +162 } catch (IOException e) { +163 CoprocessorRpcUtils.setControllerException(controller, e); +164 } +165 done.run(builder.build()); +166 } +167 +168 @Override +169 public void moveServers(RpcController controller, MoveServersRequest request, +170 RpcCallback<MoveServersResponse> done) { +171 MoveServersResponse.Builder builder = MoveServersResponse.newBuilder(); +172 try { +173 Set<Address> hostPorts = Sets.newHashSet(); +174 for (HBaseProtos.ServerName el : request.getServersList()) { +175 hostPorts.add(Address.fromParts(el.getHostName(), el.getPort())); +176 } +177 LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts +" to rsgroup " +178 + request.getTargetGroup()); +179 groupAdminServer.moveServers(hostPorts, request.getTargetGroup()); +180 } catch (IOException e) { +181 CoprocessorRpcUtils.setControllerException(controller, e); +182 } +183 done.run(builder.build()); +184 } +185 +186 @Override +187 public void moveTables(RpcController controller, MoveTablesRequest request, +188 RpcCallback<MoveTablesResponse> done) { +189 MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder(); +190 try { +191 Set<TableName> tables = new HashSet<>(request.getTableNameList().size()); +192 for (HBaseProtos.TableName tableName : request.getTableNameList()) { +193 tables.add(ProtobufUtil.toTableName(tableName)); +194 } +195 LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +" to rsgroup " +196 + request.getTargetGroup()); +197 groupAdminServer.moveTables(tables, request.getTargetGroup()); +198 } catch (IOException e) { +199 CoprocessorRpcUtils.setControllerException(controller, e); +200 } +201 done.run(builder.build()); +202 } +203 +204 @Override +205 public void addRSGroup(RpcController controller, AddRSGroupRequest request, +206 RpcCallback<AddRSGroupResponse> done) { +207 AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder(); +208 LOG.info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName()); +209 try { +210 groupAdminServer.addRSGroup(request.getRSGroupName()); +211 } catch (IOException e) { +212 CoprocessorRpcUtils.setControllerException(controller, e); +213 } +214 done.run(builder.build()); +215 } +216 +217 @Override +218 public void removeRSGroup(RpcController controller, +219 RemoveRSGroupRequest request, RpcCallback<RemoveRSGroupResponse> done) { +220 RemoveRSGroupResponse.Builder builder = +221 RemoveRSGroupResponse.newBuilder(); +222 LOG.info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName()); +223 try { +224 groupAdminServer.removeRSGroup(request.getRSGroupName()); +225 } catch (IOException e) { +226 CoprocessorRpcUtils.setControllerException(controller, e); +227 } +228 done.run(builder.build()); +229 } +230 +231 @Override +232 public void balanceRSGroup(RpcController controller, +233 BalanceRSGroupRequest request, RpcCallback<BalanceRSGroupResponse> done) { +234 BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder(); +235 LOG.info(master.getClientIdAuditPrefix() + " balance rsgroup, group=" + +236 request.getRSGroupName()); +237 try { +238 builder.setBalanceRan(groupAdminServer.balanceRSGroup(request.getRSGroupName())); +239 } catch (IOException e) { +240 CoprocessorRpcUtils.setControllerException(controller, e); +241 builder.setBalanceRan(false); +242 } +243 done.run(builder.build()); +244 } +245 +246 @Override +247 public void listRSGroupInfos(RpcController controller, +248 ListRSGroupInfosRequest request, RpcCallback<ListRSGroupInfosResponse> done) { +249 ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder(); +250 LOG.info(master.getClientIdAuditPrefix() + " list rsgroup"); +251 try { +252 for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) { +253 builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo)); +254 } +255 } catch (IOException e) { +256 CoprocessorRpcUtils.setControllerException(controller, e); +257 } +258 done.run(builder.build()); +259 } +260 +261 @Override +262 public void getRSGroupInfoOfServer(RpcController controller, +263 GetRSGroupInfoOfServerRequest request, RpcCallback<GetRSGroupInfoOfServerResponse> done) { +264 GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder(); +265 try { +266 Address hp = Address.fromParts(request.getServer().getHostName(), +267 request.getServer().getPort()); +268 LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server=" + +269 hp); +270 RSGroupInfo RSGroupInfo = groupAdminServer.getRSGroupOfServer(hp); +271 if (RSGroupInfo != null) { +272 builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo)); +273 } +274 } catch (IOException e) { +275 CoprocessorRpcUtils.setControllerException(controller, e); +276 } +277 done.run(builder.build()); +278 } +279 +280 @Override +281 public void moveServersAndTables(RpcController controller, +282 MoveServersAndTablesRequest request, RpcCallback<MoveServersAndTablesResponse> done) { +283 MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder(); +284 try { +285 Set<Address> hostPorts = Sets.newHashSet(); +286 for (HBaseProtos.ServerName el : request.getServersList()) { +287 hostPorts.add(Address.fromParts(el.getHostName(), el.getPort())); +288 } +289 Set<TableName> tables = new HashSet<>(request.getTableNameList().size()); +290 for (HBaseProtos.TableName tableName : request.getTableNameList()) { +291 tables.add(ProtobufUtil.toTableName(tableName)); +292 } +293 LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts +294 + " and tables " + tables + " to rsgroup" + request.getTargetGroup()); +295 groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup()); +296 } catch (IOException e) { +297 CoprocessorRpcUtils.setControllerException(controller, e); +298 } +299 done.run(builder.build()); +300 } +301 +302 @Override +303 public void removeServers(RpcController controller, +304 RemoveServersRequest request, +305 RpcCallback<RemoveServersResponse> done) { +306 RemoveServersResponse.Builder builder = +307 RemoveServersResponse.newBuilder(); +308 try { +309 Set<Address> servers = Sets.newHashSet(); +310 for (HBaseProtos.ServerName el : request.getServersList()) { +311 servers.add(Address.fromParts(el.getHostName(), el.getPort())); +312 } +313 LOG.info(master.getClientIdAuditPrefix() +314 + " remove decommissioned servers from rsgroup: " + servers); +315 groupAdminServer.removeServers(servers); +316 } catch (IOException e) { +317 CoprocessorRpcUtils.setControllerException(controller, e); +318 } +319 done.run(builder.build()); +320 } +321 } +322 +323 void assignTableToGroup(TableDescriptor desc) throws IOException { +324 String groupName = +325 master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString()) +326 .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP); +327 if (groupName == null) { +328 groupName = RSGroupInfo.DEFAULT_GROUP; +329 } +330 RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName); +331 if (rsGroupInfo == null) { +332 throw new ConstraintException("Default RSGroup (" + groupName + ") for this table's " +333 + "namespace does not exist."); +334 } +335 if (!rsGroupInfo.containsTable(desc.getTableName())) { +336 LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + groupName); +337 groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName); +338 } +339 } +340 +341 ///////////////////////////////////////////////////////////////////////////// +342 // MasterObserver overrides +343 ///////////////////////////////////////////////////////////////////////////// +344 +345 // Assign table to default RSGroup. +346 @Override +347 public void postCreateTable(ObserverContext<MasterCoprocessorEnvironment> ctx, +348 TableDescriptor desc, RegionInfo[] regions) throws IOException { +349 assignTableToGroup(desc); +350 } +351 +352 // Remove table from its RSGroup. +353 @Override +354 public void postDeleteTable(ObserverContext<MasterCoprocessorEnvironment> ctx, +355 TableName tableName) throws IOException { +356 try { +357 RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName); +358 if (group != null) { +359 LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName, +360 group.getName())); +361 groupAdminServer.moveTables(Sets.newHashSet(tableName), null); +362 } +363 } catch (IOException ex) { +364 LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex); +365 } +366 } +367 +368 @Override +369 public void preCreateNamespace(ObserverContext<MasterCoprocessorEnvironment> ctx, +370 NamespaceDescriptor ns) throws IOException { +371 String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP); +372 if(group != null && groupAdminServer.getRSGroupInfo(group) == null) { +373 throw new ConstraintException("Region server group "+group+" does not exit"); +374 } +375 } +376 +377 @Override +378 public void preModifyNamespace(ObserverContext<MasterCoprocessorEnvironment> ctx, +379 NamespaceDescriptor ns) throws IOException { +380 preCreateNamespace(ctx, ns); +381 } +382 +383 @Override +384 public void preCloneSnapshot(ObserverContext<MasterCoprocessorEnvironment> ctx, +385 SnapshotDescription snapshot, TableDescriptor desc) throws IOException { +386 assignTableToGroup(desc); +387 } +388 +389 @Override +390 public void postClearDeadServers(ObserverContext<MasterCoprocessorEnvironment> ctx, +391 List<ServerName> servers, List<ServerName> notClearedServers) +392 throws IOException { +393 Set<Address> clearedServer = servers.stream(). +394 filter(server -> !notClearedServers.contains(server)). +395 map(ServerName::getAddress). +396 collect(Collectors.toSet()); +397 groupAdminServer.removeServers(clearedServer); +398 } +399 +400 ///////////////////////////////////////////////////////////////////////////// +401}