001/** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.shaded.protobuf; 019 020import java.io.IOException; 021import java.util.ArrayList; 022import java.util.Collection; 023import java.util.EnumSet; 024import java.util.List; 025import java.util.Map; 026import java.util.Set; 027import java.util.regex.Pattern; 028 029import org.apache.hadoop.hbase.CellScannable; 030import org.apache.hadoop.hbase.ClusterMetrics.Option; 031import org.apache.hadoop.hbase.ClusterMetricsBuilder; 032import org.apache.hadoop.hbase.DoNotRetryIOException; 033import org.apache.hadoop.hbase.HConstants; 034import org.apache.hadoop.hbase.NamespaceDescriptor; 035import org.apache.hadoop.hbase.ServerName; 036import org.apache.hadoop.hbase.TableName; 037import org.apache.hadoop.hbase.client.Action; 038import org.apache.hadoop.hbase.client.Append; 039import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor; 040import org.apache.hadoop.hbase.client.Delete; 041import org.apache.hadoop.hbase.client.Durability; 042import org.apache.hadoop.hbase.client.Get; 043import org.apache.hadoop.hbase.client.Increment; 044import org.apache.hadoop.hbase.client.MasterSwitchType; 045import org.apache.hadoop.hbase.client.Mutation; 046import org.apache.hadoop.hbase.client.Put; 047import org.apache.hadoop.hbase.client.RegionCoprocessorServiceExec; 048import org.apache.hadoop.hbase.client.RegionInfo; 049import org.apache.hadoop.hbase.client.Row; 050import org.apache.hadoop.hbase.client.RowMutations; 051import org.apache.hadoop.hbase.client.Scan; 052import org.apache.hadoop.hbase.client.TableDescriptor; 053import org.apache.hadoop.hbase.client.TableState; 054import org.apache.hadoop.hbase.client.replication.ReplicationPeerConfigUtil; 055import org.apache.hadoop.hbase.exceptions.DeserializationException; 056import org.apache.hadoop.hbase.filter.ByteArrayComparable; 057import org.apache.hadoop.hbase.io.TimeRange; 058import org.apache.hadoop.hbase.replication.ReplicationPeerConfig; 059import org.apache.hadoop.hbase.util.Bytes; 060import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; 061import org.apache.hadoop.hbase.util.Pair; 062import org.apache.hadoop.security.token.Token; 063import org.apache.yetus.audience.InterfaceAudience; 064 065import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations; 066import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest; 067import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheRequest; 068import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest; 069import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest; 070import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest; 071import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest; 072import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionLoadRequest; 073import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerInfoRequest; 074import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest; 075import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo; 076import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterRequest; 077import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerRequest; 078import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest; 079import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest.RegionUpdateInfo; 080import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WarmupRegionRequest; 081import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos; 082import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.BulkLoadHFileRequest; 083import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Condition; 084import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.GetRequest; 085import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest; 086import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutateRequest; 087import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto; 088import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.ColumnValue; 089import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.ColumnValue.QualifierValue; 090import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.MutationType; 091import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionAction; 092import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest; 093import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos; 094import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.CompareType; 095import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier; 096import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType; 097import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos; 098import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AddColumnRequest; 099import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignRegionRequest; 100import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BalanceRequest; 101import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersRequest; 102import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceRequest; 103import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateTableRequest; 104import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersRequest; 105import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteColumnRequest; 106import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteNamespaceRequest; 107import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteTableRequest; 108import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DisableTableRequest; 109import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableCatalogJanitorRequest; 110import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTableRequest; 111import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest; 112import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorRequest; 113import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetSchemaAlterStatusRequest; 114import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableDescriptorsRequest; 115import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableNamesRequest; 116import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableStateRequest; 117import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledRequest; 118import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCatalogJanitorEnabledRequest; 119import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCleanerChoreEnabledRequest; 120import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsMasterRunningRequest; 121import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledRequest; 122import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledRequest; 123import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MergeTableRegionsRequest; 124import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyColumnRequest; 125import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyNamespaceRequest; 126import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyTableRequest; 127import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MoveRegionRequest; 128import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.NormalizeRequest; 129import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.OfflineRegionRequest; 130import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RecommissionRegionServerRequest; 131import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCatalogScanRequest; 132import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCleanerChoreRequest; 133import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetBalancerRunningRequest; 134import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetCleanerChoreRunningRequest; 135import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningRequest; 136import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledRequest; 137import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetTableStateInMetaRequest; 138import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SplitTableRegionRequest; 139import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.TruncateTableRequest; 140import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignRegionRequest; 141import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetQuotaStatesRequest; 142import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaRegionSizesRequest; 143import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsRequest; 144import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.GetLastFlushedSequenceIdRequest; 145import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos; 146import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerRequest; 147import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerRequest; 148import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerRequest; 149import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigRequest; 150import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ListReplicationPeersRequest; 151import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerRequest; 152import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigRequest; 153 154/** 155 * Helper utility to build protocol buffer requests, 156 * or build components for protocol buffer requests. 157 */ 158@InterfaceAudience.Private 159public final class RequestConverter { 160 161 private RequestConverter() { 162 } 163 164// Start utilities for Client 165 166 /** 167 * Create a protocol buffer GetRequest for a client Get 168 * 169 * @param regionName the name of the region to get 170 * @param get the client Get 171 * @return a protocol buffer GetRequest 172 */ 173 public static GetRequest buildGetRequest(final byte[] regionName, 174 final Get get) throws IOException { 175 GetRequest.Builder builder = GetRequest.newBuilder(); 176 RegionSpecifier region = buildRegionSpecifier( 177 RegionSpecifierType.REGION_NAME, regionName); 178 builder.setRegion(region); 179 builder.setGet(ProtobufUtil.toGet(get)); 180 return builder.build(); 181 } 182 183 /** 184 * Create a protocol buffer MutateRequest for a client increment 185 * 186 * @param regionName 187 * @param row 188 * @param family 189 * @param qualifier 190 * @param amount 191 * @param durability 192 * @return a mutate request 193 */ 194 public static MutateRequest buildIncrementRequest( 195 final byte[] regionName, final byte[] row, final byte[] family, final byte[] qualifier, 196 final long amount, final Durability durability, long nonceGroup, long nonce) { 197 MutateRequest.Builder builder = MutateRequest.newBuilder(); 198 RegionSpecifier region = buildRegionSpecifier( 199 RegionSpecifierType.REGION_NAME, regionName); 200 builder.setRegion(region); 201 202 MutationProto.Builder mutateBuilder = MutationProto.newBuilder(); 203 mutateBuilder.setRow(UnsafeByteOperations.unsafeWrap(row)); 204 mutateBuilder.setMutateType(MutationType.INCREMENT); 205 mutateBuilder.setDurability(ProtobufUtil.toDurability(durability)); 206 ColumnValue.Builder columnBuilder = ColumnValue.newBuilder(); 207 columnBuilder.setFamily(UnsafeByteOperations.unsafeWrap(family)); 208 QualifierValue.Builder valueBuilder = QualifierValue.newBuilder(); 209 valueBuilder.setValue(UnsafeByteOperations.unsafeWrap(Bytes.toBytes(amount))); 210 valueBuilder.setQualifier(UnsafeByteOperations 211 .unsafeWrap(qualifier == null ? HConstants.EMPTY_BYTE_ARRAY : qualifier)); 212 valueBuilder.setTimestamp(HConstants.LATEST_TIMESTAMP); 213 columnBuilder.addQualifierValue(valueBuilder.build()); 214 mutateBuilder.addColumnValue(columnBuilder.build()); 215 if (nonce != HConstants.NO_NONCE) { 216 mutateBuilder.setNonce(nonce); 217 } 218 builder.setMutation(mutateBuilder.build()); 219 if (nonceGroup != HConstants.NO_NONCE) { 220 builder.setNonceGroup(nonceGroup); 221 } 222 return builder.build(); 223 } 224 225 /** 226 * Create a protocol buffer MutateRequest for a conditioned put 227 * 228 * @param regionName 229 * @param row 230 * @param family 231 * @param qualifier 232 * @param comparator 233 * @param compareType 234 * @param put 235 * @return a mutate request 236 * @throws IOException 237 */ 238 public static MutateRequest buildMutateRequest( 239 final byte[] regionName, final byte[] row, final byte[] family, 240 final byte [] qualifier, final ByteArrayComparable comparator, 241 final CompareType compareType, TimeRange timeRange, final Put put) throws IOException { 242 return buildMutateRequest(regionName, row, family, qualifier, comparator, compareType, timeRange 243 , put, MutationType.PUT); 244 } 245 246 /** 247 * Create a protocol buffer MutateRequest for a conditioned delete 248 * 249 * @param regionName 250 * @param row 251 * @param family 252 * @param qualifier 253 * @param comparator 254 * @param compareType 255 * @param delete 256 * @return a mutate request 257 * @throws IOException 258 */ 259 public static MutateRequest buildMutateRequest( 260 final byte[] regionName, final byte[] row, final byte[] family, 261 final byte [] qualifier, final ByteArrayComparable comparator, 262 final CompareType compareType, TimeRange timeRange, final Delete delete) throws IOException { 263 return buildMutateRequest(regionName, row, family, qualifier, comparator, compareType, timeRange 264 , delete, MutationType.DELETE); 265 } 266 267 public static MutateRequest buildMutateRequest(final byte[] regionName, final byte[] row, 268 final byte[] family, final byte[] qualifier, final ByteArrayComparable comparator, 269 final CompareType compareType, TimeRange timeRange, final Mutation mutation, 270 final MutationType type) throws IOException { 271 return MutateRequest.newBuilder() 272 .setRegion(buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName)) 273 .setMutation(ProtobufUtil.toMutation(type, mutation)) 274 .setCondition(buildCondition(row, family, qualifier, comparator, compareType, timeRange)) 275 .build(); 276 } 277 /** 278 * Create a protocol buffer MutateRequest for conditioned row mutations 279 * 280 * @param regionName 281 * @param row 282 * @param family 283 * @param qualifier 284 * @param comparator 285 * @param compareType 286 * @param rowMutations 287 * @return a mutate request 288 * @throws IOException 289 */ 290 public static ClientProtos.MultiRequest buildMutateRequest(final byte[] regionName, 291 final byte[] row, final byte[] family, final byte[] qualifier, 292 final ByteArrayComparable comparator, final CompareType compareType, final TimeRange timeRange, 293 final RowMutations rowMutations) throws IOException { 294 RegionAction.Builder builder = 295 getRegionActionBuilderWithRegion(RegionAction.newBuilder(), regionName); 296 builder.setAtomic(true); 297 ClientProtos.Action.Builder actionBuilder = ClientProtos.Action.newBuilder(); 298 MutationProto.Builder mutationBuilder = MutationProto.newBuilder(); 299 for (Mutation mutation: rowMutations.getMutations()) { 300 MutationType mutateType = null; 301 if (mutation instanceof Put) { 302 mutateType = MutationType.PUT; 303 } else if (mutation instanceof Delete) { 304 mutateType = MutationType.DELETE; 305 } else { 306 throw new DoNotRetryIOException("RowMutations supports only put and delete, not " + 307 mutation.getClass().getName()); 308 } 309 mutationBuilder.clear(); 310 MutationProto mp = ProtobufUtil.toMutation(mutateType, mutation, mutationBuilder); 311 actionBuilder.clear(); 312 actionBuilder.setMutation(mp); 313 builder.addAction(actionBuilder.build()); 314 } 315 return ClientProtos.MultiRequest.newBuilder().addRegionAction(builder.build()) 316 .setCondition(buildCondition(row, family, qualifier, comparator, compareType, timeRange)) 317 .build(); 318 } 319 320 /** 321 * Create a protocol buffer MutateRequest for a put 322 * 323 * @param regionName 324 * @param put 325 * @return a mutate request 326 * @throws IOException 327 */ 328 public static MutateRequest buildMutateRequest( 329 final byte[] regionName, final Put put) throws IOException { 330 MutateRequest.Builder builder = MutateRequest.newBuilder(); 331 RegionSpecifier region = buildRegionSpecifier( 332 RegionSpecifierType.REGION_NAME, regionName); 333 builder.setRegion(region); 334 builder.setMutation(ProtobufUtil.toMutation(MutationType.PUT, put, MutationProto.newBuilder())); 335 return builder.build(); 336 } 337 338 /** 339 * Create a protocol buffer MutateRequest for an append 340 * 341 * @param regionName 342 * @param append 343 * @return a mutate request 344 * @throws IOException 345 */ 346 public static MutateRequest buildMutateRequest(final byte[] regionName, 347 final Append append, long nonceGroup, long nonce) throws IOException { 348 MutateRequest.Builder builder = MutateRequest.newBuilder(); 349 RegionSpecifier region = buildRegionSpecifier( 350 RegionSpecifierType.REGION_NAME, regionName); 351 builder.setRegion(region); 352 if (nonce != HConstants.NO_NONCE && nonceGroup != HConstants.NO_NONCE) { 353 builder.setNonceGroup(nonceGroup); 354 } 355 builder.setMutation(ProtobufUtil.toMutation(MutationType.APPEND, append, 356 MutationProto.newBuilder(), nonce)); 357 return builder.build(); 358 } 359 360 /** 361 * Create a protocol buffer MutateRequest for a client increment 362 * 363 * @param regionName 364 * @param increment 365 * @return a mutate request 366 */ 367 public static MutateRequest buildMutateRequest(final byte[] regionName, 368 final Increment increment, final long nonceGroup, final long nonce) throws IOException { 369 MutateRequest.Builder builder = MutateRequest.newBuilder(); 370 RegionSpecifier region = buildRegionSpecifier( 371 RegionSpecifierType.REGION_NAME, regionName); 372 builder.setRegion(region); 373 if (nonce != HConstants.NO_NONCE && nonceGroup != HConstants.NO_NONCE) { 374 builder.setNonceGroup(nonceGroup); 375 } 376 builder.setMutation(ProtobufUtil.toMutation(MutationType.INCREMENT, increment, 377 MutationProto.newBuilder(), nonce)); 378 return builder.build(); 379 } 380 381 /** 382 * Create a protocol buffer MutateRequest for a delete 383 * 384 * @param regionName 385 * @param delete 386 * @return a mutate request 387 * @throws IOException 388 */ 389 public static MutateRequest buildMutateRequest( 390 final byte[] regionName, final Delete delete) throws IOException { 391 MutateRequest.Builder builder = MutateRequest.newBuilder(); 392 RegionSpecifier region = buildRegionSpecifier( 393 RegionSpecifierType.REGION_NAME, regionName); 394 builder.setRegion(region); 395 builder.setMutation(ProtobufUtil.toMutation(MutationType.DELETE, delete, 396 MutationProto.newBuilder())); 397 return builder.build(); 398 } 399 400 /** 401 * Create a protocol buffer MultiRequest for row mutations. 402 * Does not propagate Action absolute position. Does not set atomic action on the created 403 * RegionAtomic. Caller should do that if wanted. 404 * @param regionName 405 * @param rowMutations 406 * @return a data-laden RegionMutation.Builder 407 * @throws IOException 408 */ 409 public static RegionAction.Builder buildRegionAction(final byte [] regionName, 410 final RowMutations rowMutations) 411 throws IOException { 412 RegionAction.Builder builder = 413 getRegionActionBuilderWithRegion(RegionAction.newBuilder(), regionName); 414 ClientProtos.Action.Builder actionBuilder = ClientProtos.Action.newBuilder(); 415 MutationProto.Builder mutationBuilder = MutationProto.newBuilder(); 416 for (Mutation mutation: rowMutations.getMutations()) { 417 MutationType mutateType = null; 418 if (mutation instanceof Put) { 419 mutateType = MutationType.PUT; 420 } else if (mutation instanceof Delete) { 421 mutateType = MutationType.DELETE; 422 } else { 423 throw new DoNotRetryIOException("RowMutations supports only put and delete, not " + 424 mutation.getClass().getName()); 425 } 426 mutationBuilder.clear(); 427 MutationProto mp = ProtobufUtil.toMutation(mutateType, mutation, mutationBuilder); 428 actionBuilder.clear(); 429 actionBuilder.setMutation(mp); 430 builder.addAction(actionBuilder.build()); 431 } 432 return builder; 433 } 434 435 /** 436 * Create a protocol buffer MultiRequest for row mutations that does not hold data. Data/Cells 437 * are carried outside of protobuf. Return references to the Cells in <code>cells</code> param. 438 * Does not propagate Action absolute position. Does not set atomic action on the created 439 * RegionAtomic. Caller should do that if wanted. 440 * @param regionName 441 * @param rowMutations 442 * @param cells Return in here a list of Cells as CellIterable. 443 * @return a region mutation minus data 444 * @throws IOException 445 */ 446 public static RegionAction.Builder buildNoDataRegionAction(final byte[] regionName, 447 final RowMutations rowMutations, final List<CellScannable> cells, 448 final RegionAction.Builder regionActionBuilder, 449 final ClientProtos.Action.Builder actionBuilder, 450 final MutationProto.Builder mutationBuilder) 451 throws IOException { 452 for (Mutation mutation: rowMutations.getMutations()) { 453 MutationType type = null; 454 if (mutation instanceof Put) { 455 type = MutationType.PUT; 456 } else if (mutation instanceof Delete) { 457 type = MutationType.DELETE; 458 } else { 459 throw new DoNotRetryIOException("RowMutations supports only put and delete, not " + 460 mutation.getClass().getName()); 461 } 462 mutationBuilder.clear(); 463 MutationProto mp = ProtobufUtil.toMutationNoData(type, mutation, mutationBuilder); 464 cells.add(mutation); 465 actionBuilder.clear(); 466 regionActionBuilder.addAction(actionBuilder.setMutation(mp).build()); 467 } 468 return regionActionBuilder; 469 } 470 471 public static RegionAction.Builder getRegionActionBuilderWithRegion( 472 final RegionAction.Builder regionActionBuilder, final byte [] regionName) { 473 RegionSpecifier region = buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName); 474 regionActionBuilder.setRegion(region); 475 return regionActionBuilder; 476 } 477 478 /** 479 * Create a protocol buffer ScanRequest for a client Scan 480 * 481 * @param regionName 482 * @param scan 483 * @param numberOfRows 484 * @param closeScanner 485 * @return a scan request 486 * @throws IOException 487 */ 488 public static ScanRequest buildScanRequest(byte[] regionName, Scan scan, int numberOfRows, 489 boolean closeScanner) throws IOException { 490 ScanRequest.Builder builder = ScanRequest.newBuilder(); 491 RegionSpecifier region = buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName); 492 builder.setNumberOfRows(numberOfRows); 493 builder.setCloseScanner(closeScanner); 494 builder.setRegion(region); 495 builder.setScan(ProtobufUtil.toScan(scan)); 496 builder.setClientHandlesPartials(true); 497 builder.setClientHandlesHeartbeats(true); 498 builder.setTrackScanMetrics(scan.isScanMetricsEnabled()); 499 if (scan.getLimit() > 0) { 500 builder.setLimitOfRows(scan.getLimit()); 501 } 502 return builder.build(); 503 } 504 505 /** 506 * Create a protocol buffer ScanRequest for a scanner id 507 * @param scannerId 508 * @param numberOfRows 509 * @param closeScanner 510 * @return a scan request 511 */ 512 public static ScanRequest buildScanRequest(long scannerId, int numberOfRows, boolean closeScanner, 513 boolean trackMetrics) { 514 ScanRequest.Builder builder = ScanRequest.newBuilder(); 515 builder.setNumberOfRows(numberOfRows); 516 builder.setCloseScanner(closeScanner); 517 builder.setScannerId(scannerId); 518 builder.setClientHandlesPartials(true); 519 builder.setClientHandlesHeartbeats(true); 520 builder.setTrackScanMetrics(trackMetrics); 521 return builder.build(); 522 } 523 524 /** 525 * Create a protocol buffer ScanRequest for a scanner id 526 * @param scannerId 527 * @param numberOfRows 528 * @param closeScanner 529 * @param nextCallSeq 530 * @return a scan request 531 */ 532 public static ScanRequest buildScanRequest(long scannerId, int numberOfRows, boolean closeScanner, 533 long nextCallSeq, boolean trackMetrics, boolean renew, int limitOfRows) { 534 ScanRequest.Builder builder = ScanRequest.newBuilder(); 535 builder.setNumberOfRows(numberOfRows); 536 builder.setCloseScanner(closeScanner); 537 builder.setScannerId(scannerId); 538 builder.setNextCallSeq(nextCallSeq); 539 builder.setClientHandlesPartials(true); 540 builder.setClientHandlesHeartbeats(true); 541 builder.setTrackScanMetrics(trackMetrics); 542 builder.setRenew(renew); 543 if (limitOfRows > 0) { 544 builder.setLimitOfRows(limitOfRows); 545 } 546 return builder.build(); 547 } 548 549 /** 550 * Create a protocol buffer bulk load request 551 * 552 * @param familyPaths 553 * @param regionName 554 * @param assignSeqNum 555 * @param userToken 556 * @param bulkToken 557 * @return a bulk load request 558 */ 559 public static BulkLoadHFileRequest buildBulkLoadHFileRequest( 560 final List<Pair<byte[], String>> familyPaths, 561 final byte[] regionName, boolean assignSeqNum, 562 final Token<?> userToken, final String bulkToken) { 563 return buildBulkLoadHFileRequest(familyPaths, regionName, assignSeqNum, userToken, bulkToken, 564 false); 565 } 566 567 /** 568 * Create a protocol buffer bulk load request 569 * 570 * @param familyPaths 571 * @param regionName 572 * @param assignSeqNum 573 * @param userToken 574 * @param bulkToken 575 * @param copyFiles 576 * @return a bulk load request 577 */ 578 public static BulkLoadHFileRequest buildBulkLoadHFileRequest( 579 final List<Pair<byte[], String>> familyPaths, 580 final byte[] regionName, boolean assignSeqNum, 581 final Token<?> userToken, final String bulkToken, boolean copyFiles) { 582 RegionSpecifier region = RequestConverter.buildRegionSpecifier( 583 RegionSpecifierType.REGION_NAME, regionName); 584 585 ClientProtos.DelegationToken protoDT = null; 586 if (userToken != null) { 587 protoDT = 588 ClientProtos.DelegationToken.newBuilder() 589 .setIdentifier(UnsafeByteOperations.unsafeWrap(userToken.getIdentifier())) 590 .setPassword(UnsafeByteOperations.unsafeWrap(userToken.getPassword())) 591 .setKind(userToken.getKind().toString()) 592 .setService(userToken.getService().toString()).build(); 593 } 594 595 List<ClientProtos.BulkLoadHFileRequest.FamilyPath> protoFamilyPaths = new ArrayList<>(familyPaths.size()); 596 if (!familyPaths.isEmpty()) { 597 ClientProtos.BulkLoadHFileRequest.FamilyPath.Builder pathBuilder 598 = ClientProtos.BulkLoadHFileRequest.FamilyPath.newBuilder(); 599 for(Pair<byte[], String> el: familyPaths) { 600 protoFamilyPaths.add(pathBuilder 601 .setFamily(UnsafeByteOperations.unsafeWrap(el.getFirst())) 602 .setPath(el.getSecond()).build()); 603 } 604 pathBuilder.clear(); 605 } 606 607 BulkLoadHFileRequest.Builder request = 608 ClientProtos.BulkLoadHFileRequest.newBuilder() 609 .setRegion(region) 610 .setAssignSeqNum(assignSeqNum) 611 .addAllFamilyPath(protoFamilyPaths); 612 if (userToken != null) { 613 request.setFsToken(protoDT); 614 } 615 if (bulkToken != null) { 616 request.setBulkToken(bulkToken); 617 } 618 request.setCopyFile(copyFiles); 619 return request.build(); 620 } 621 622 /** 623 * Create a protocol buffer multi request for a list of actions. Propagates Actions original 624 * index. The passed in multiRequestBuilder will be populated with region actions. 625 * @param regionName The region name of the actions. 626 * @param actions The actions that are grouped by the same region name. 627 * @param multiRequestBuilder The multiRequestBuilder to be populated with region actions. 628 * @param regionActionBuilder regionActionBuilder to be used to build region action. 629 * @param actionBuilder actionBuilder to be used to build action. 630 * @param mutationBuilder mutationBuilder to be used to build mutation. 631 * @param nonceGroup nonceGroup to be applied. 632 * @param rowMutationsIndexMap Map of created RegionAction to the original index for a 633 * RowMutations within the original list of actions 634 * @throws IOException 635 */ 636 public static void buildRegionActions(final byte[] regionName, 637 final List<Action> actions, final MultiRequest.Builder multiRequestBuilder, 638 final RegionAction.Builder regionActionBuilder, 639 final ClientProtos.Action.Builder actionBuilder, 640 final MutationProto.Builder mutationBuilder, 641 long nonceGroup, final Map<Integer, Integer> rowMutationsIndexMap) throws IOException { 642 regionActionBuilder.clear(); 643 RegionAction.Builder builder = getRegionActionBuilderWithRegion( 644 regionActionBuilder, regionName); 645 ClientProtos.CoprocessorServiceCall.Builder cpBuilder = null; 646 boolean hasNonce = false; 647 List<Action> rowMutationsList = new ArrayList<>(); 648 649 for (Action action: actions) { 650 Row row = action.getAction(); 651 actionBuilder.clear(); 652 actionBuilder.setIndex(action.getOriginalIndex()); 653 mutationBuilder.clear(); 654 if (row instanceof Get) { 655 Get g = (Get)row; 656 builder.addAction(actionBuilder.setGet(ProtobufUtil.toGet(g))); 657 } else if (row instanceof Put) { 658 builder.addAction(actionBuilder. 659 setMutation(ProtobufUtil.toMutation(MutationType.PUT, (Put)row, mutationBuilder))); 660 } else if (row instanceof Delete) { 661 builder.addAction(actionBuilder. 662 setMutation(ProtobufUtil.toMutation(MutationType.DELETE, (Delete)row, mutationBuilder))); 663 } else if (row instanceof Append) { 664 builder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutation( 665 MutationType.APPEND, (Append)row, mutationBuilder, action.getNonce()))); 666 hasNonce = true; 667 } else if (row instanceof Increment) { 668 builder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutation( 669 MutationType.INCREMENT, (Increment)row, mutationBuilder, action.getNonce()))); 670 hasNonce = true; 671 } else if (row instanceof RegionCoprocessorServiceExec) { 672 RegionCoprocessorServiceExec exec = (RegionCoprocessorServiceExec) row; 673 // DUMB COPY!!! FIX!!! Done to copy from c.g.p.ByteString to shaded ByteString. 674 org.apache.hbase.thirdparty.com.google.protobuf.ByteString value = 675 org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.unsafeWrap( 676 exec.getRequest().toByteArray()); 677 if (cpBuilder == null) { 678 cpBuilder = ClientProtos.CoprocessorServiceCall.newBuilder(); 679 } else { 680 cpBuilder.clear(); 681 } 682 builder.addAction(actionBuilder.setServiceCall( 683 cpBuilder.setRow(UnsafeByteOperations.unsafeWrap(exec.getRow())) 684 .setServiceName(exec.getMethod().getService().getFullName()) 685 .setMethodName(exec.getMethod().getName()) 686 .setRequest(value))); 687 } else if (row instanceof RowMutations) { 688 rowMutationsList.add(action); 689 } else { 690 throw new DoNotRetryIOException("Multi doesn't support " + row.getClass().getName()); 691 } 692 } 693 if (!multiRequestBuilder.hasNonceGroup() && hasNonce) { 694 multiRequestBuilder.setNonceGroup(nonceGroup); 695 } 696 multiRequestBuilder.addRegionAction(builder.build()); 697 698 // Process RowMutations here. We can not process it in the big loop above because 699 // it will corrupt the sequence order maintained in cells. 700 // RowMutations is a set of Puts and/or Deletes all to be applied atomically 701 // on the one row. We do separate RegionAction for each RowMutations. 702 // We maintain a map to keep track of this RegionAction and the original Action index. 703 for (Action action : rowMutationsList) { 704 RowMutations rms = (RowMutations) action.getAction(); 705 RegionAction.Builder rowMutationsRegionActionBuilder = 706 RequestConverter.buildRegionAction(regionName, rms); 707 rowMutationsRegionActionBuilder.setAtomic(true); 708 // Put it in the multiRequestBuilder 709 multiRequestBuilder.addRegionAction(rowMutationsRegionActionBuilder.build()); 710 // This rowMutations region action is at (multiRequestBuilder.getRegionActionCount() - 1) 711 // in the overall multiRequest. 712 rowMutationsIndexMap.put(multiRequestBuilder.getRegionActionCount() - 1, 713 action.getOriginalIndex()); 714 } 715 } 716 717 /** 718 * Create a protocol buffer multirequest with NO data for a list of actions (data is carried 719 * otherwise than via protobuf). This means it just notes attributes, whether to write the 720 * WAL, etc., and the presence in protobuf serves as place holder for the data which is 721 * coming along otherwise. Note that Get is different. It does not contain 'data' and is always 722 * carried by protobuf. We return references to the data by adding them to the passed in 723 * <code>data</code> param. 724 * <p> Propagates Actions original index. 725 * <p> The passed in multiRequestBuilder will be populated with region actions. 726 * @param regionName The region name of the actions. 727 * @param actions The actions that are grouped by the same region name. 728 * @param cells Place to stuff references to actual data. 729 * @param multiRequestBuilder The multiRequestBuilder to be populated with region actions. 730 * @param regionActionBuilder regionActionBuilder to be used to build region action. 731 * @param actionBuilder actionBuilder to be used to build action. 732 * @param mutationBuilder mutationBuilder to be used to build mutation. 733 * @param nonceGroup nonceGroup to be applied. 734 * @param rowMutationsIndexMap Map of created RegionAction to the original index for a 735 * RowMutations within the original list of actions 736 * @throws IOException 737 */ 738 public static void buildNoDataRegionActions(final byte[] regionName, 739 final Iterable<Action> actions, final List<CellScannable> cells, 740 final MultiRequest.Builder multiRequestBuilder, 741 final RegionAction.Builder regionActionBuilder, 742 final ClientProtos.Action.Builder actionBuilder, 743 final MutationProto.Builder mutationBuilder, 744 long nonceGroup, final Map<Integer, Integer> rowMutationsIndexMap) throws IOException { 745 regionActionBuilder.clear(); 746 RegionAction.Builder builder = getRegionActionBuilderWithRegion( 747 regionActionBuilder, regionName); 748 ClientProtos.CoprocessorServiceCall.Builder cpBuilder = null; 749 RegionAction.Builder rowMutationsRegionActionBuilder = null; 750 boolean hasNonce = false; 751 List<Action> rowMutationsList = new ArrayList<>(); 752 753 for (Action action: actions) { 754 Row row = action.getAction(); 755 actionBuilder.clear(); 756 actionBuilder.setIndex(action.getOriginalIndex()); 757 mutationBuilder.clear(); 758 if (row instanceof Get) { 759 Get g = (Get)row; 760 builder.addAction(actionBuilder.setGet(ProtobufUtil.toGet(g))); 761 } else if (row instanceof Put) { 762 Put p = (Put)row; 763 cells.add(p); 764 builder.addAction(actionBuilder. 765 setMutation(ProtobufUtil.toMutationNoData(MutationType.PUT, p, mutationBuilder))); 766 } else if (row instanceof Delete) { 767 Delete d = (Delete)row; 768 int size = d.size(); 769 // Note that a legitimate Delete may have a size of zero; i.e. a Delete that has nothing 770 // in it but the row to delete. In this case, the current implementation does not make 771 // a KeyValue to represent a delete-of-all-the-row until we serialize... For such cases 772 // where the size returned is zero, we will send the Delete fully pb'd rather than have 773 // metadata only in the pb and then send the kv along the side in cells. 774 if (size > 0) { 775 cells.add(d); 776 builder.addAction(actionBuilder. 777 setMutation(ProtobufUtil.toMutationNoData(MutationType.DELETE, d, mutationBuilder))); 778 } else { 779 builder.addAction(actionBuilder. 780 setMutation(ProtobufUtil.toMutation(MutationType.DELETE, d, mutationBuilder))); 781 } 782 } else if (row instanceof Append) { 783 Append a = (Append)row; 784 cells.add(a); 785 builder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutationNoData( 786 MutationType.APPEND, a, mutationBuilder, action.getNonce()))); 787 hasNonce = true; 788 } else if (row instanceof Increment) { 789 Increment i = (Increment)row; 790 cells.add(i); 791 builder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutationNoData( 792 MutationType.INCREMENT, i, mutationBuilder, action.getNonce()))); 793 hasNonce = true; 794 } else if (row instanceof RegionCoprocessorServiceExec) { 795 RegionCoprocessorServiceExec exec = (RegionCoprocessorServiceExec) row; 796 // DUMB COPY!!! FIX!!! Done to copy from c.g.p.ByteString to shaded ByteString. 797 org.apache.hbase.thirdparty.com.google.protobuf.ByteString value = 798 org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.unsafeWrap( 799 exec.getRequest().toByteArray()); 800 if (cpBuilder == null) { 801 cpBuilder = ClientProtos.CoprocessorServiceCall.newBuilder(); 802 } else { 803 cpBuilder.clear(); 804 } 805 builder.addAction(actionBuilder.setServiceCall( 806 cpBuilder.setRow(UnsafeByteOperations.unsafeWrap(exec.getRow())) 807 .setServiceName(exec.getMethod().getService().getFullName()) 808 .setMethodName(exec.getMethod().getName()) 809 .setRequest(value))); 810 } else if (row instanceof RowMutations) { 811 rowMutationsList.add(action); 812 } else { 813 throw new DoNotRetryIOException("Multi doesn't support " + row.getClass().getName()); 814 } 815 } 816 if (!multiRequestBuilder.hasNonceGroup() && hasNonce) { 817 multiRequestBuilder.setNonceGroup(nonceGroup); 818 } 819 multiRequestBuilder.addRegionAction(builder.build()); 820 821 // Process RowMutations here. We can not process it in the big loop above because 822 // it will corrupt the sequence order maintained in cells. 823 // RowMutations is a set of Puts and/or Deletes all to be applied atomically 824 // on the one row. We do separate RegionAction for each RowMutations. 825 // We maintain a map to keep track of this RegionAction and the original Action index. 826 for (Action action : rowMutationsList) { 827 RowMutations rms = (RowMutations) action.getAction(); 828 if (rowMutationsRegionActionBuilder == null) { 829 rowMutationsRegionActionBuilder = ClientProtos.RegionAction.newBuilder(); 830 } else { 831 rowMutationsRegionActionBuilder.clear(); 832 } 833 rowMutationsRegionActionBuilder.setRegion( 834 RequestConverter.buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName)); 835 rowMutationsRegionActionBuilder = RequestConverter.buildNoDataRegionAction(regionName, rms, 836 cells, rowMutationsRegionActionBuilder, actionBuilder, mutationBuilder); 837 rowMutationsRegionActionBuilder.setAtomic(true); 838 // Put it in the multiRequestBuilder 839 multiRequestBuilder.addRegionAction(rowMutationsRegionActionBuilder.build()); 840 // This rowMutations region action is at (multiRequestBuilder.getRegionActionCount() - 1) 841 // in the overall multiRequest. 842 rowMutationsIndexMap.put(multiRequestBuilder.getRegionActionCount() - 1, 843 action.getOriginalIndex()); 844 } 845 } 846 847// End utilities for Client 848//Start utilities for Admin 849 850 /** 851 * Create a protocol buffer GetRegionInfoRequest for a given region name 852 * 853 * @param regionName the name of the region to get info 854 * @return a protocol buffer GetRegionInfoRequest 855 */ 856 public static GetRegionInfoRequest 857 buildGetRegionInfoRequest(final byte[] regionName) { 858 return buildGetRegionInfoRequest(regionName, false); 859 } 860 861 /** 862 * Create a protocol buffer GetRegionInfoRequest for a given region name 863 * 864 * @param regionName the name of the region to get info 865 * @param includeCompactionState indicate if the compaction state is requested 866 * @return a protocol buffer GetRegionInfoRequest 867 */ 868 public static GetRegionInfoRequest 869 buildGetRegionInfoRequest(final byte[] regionName, 870 final boolean includeCompactionState) { 871 return buildGetRegionInfoRequest(regionName, includeCompactionState, false); 872 } 873 874 /** 875 * 876 * @param regionName the name of the region to get info 877 * @param includeCompactionState indicate if the compaction state is requested 878 * @param includeBestSplitRow indicate if the bestSplitRow is requested 879 * @return protocol buffer GetRegionInfoRequest 880 */ 881 public static GetRegionInfoRequest buildGetRegionInfoRequest(final byte[] regionName, 882 final boolean includeCompactionState, boolean includeBestSplitRow) { 883 GetRegionInfoRequest.Builder builder = GetRegionInfoRequest.newBuilder(); 884 RegionSpecifier region = buildRegionSpecifier( 885 RegionSpecifierType.REGION_NAME, regionName); 886 builder.setRegion(region); 887 if (includeCompactionState) { 888 builder.setCompactionState(includeCompactionState); 889 } 890 if (includeBestSplitRow) { 891 builder.setBestSplitRow(includeBestSplitRow); 892 } 893 return builder.build(); 894 } 895 896 /** 897 * Create a protocol buffer GetRegionLoadRequest for all regions/regions of a table. 898 * @param tableName the table for which regionLoad should be obtained from RS 899 * @return a protocol buffer GetRegionLoadRequest 900 */ 901 public static GetRegionLoadRequest buildGetRegionLoadRequest(final TableName tableName) { 902 GetRegionLoadRequest.Builder builder = GetRegionLoadRequest.newBuilder(); 903 if (tableName != null) { 904 builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); 905 } 906 return builder.build(); 907 } 908 909 /** 910 * Create a protocol buffer GetOnlineRegionRequest 911 * @return a protocol buffer GetOnlineRegionRequest 912 */ 913 public static GetOnlineRegionRequest buildGetOnlineRegionRequest() { 914 return GetOnlineRegionRequest.newBuilder().build(); 915 } 916 917 /** 918 * Create a protocol buffer FlushRegionRequest for a given region name 919 * @param regionName the name of the region to get info 920 * @return a protocol buffer FlushRegionRequest 921 */ 922 public static FlushRegionRequest buildFlushRegionRequest(final byte[] regionName) { 923 return buildFlushRegionRequest(regionName, false); 924 } 925 926 /** 927 * Create a protocol buffer FlushRegionRequest for a given region name 928 * @param regionName the name of the region to get info 929 * @return a protocol buffer FlushRegionRequest 930 */ 931 public static FlushRegionRequest buildFlushRegionRequest(final byte[] regionName, 932 boolean writeFlushWALMarker) { 933 FlushRegionRequest.Builder builder = FlushRegionRequest.newBuilder(); 934 RegionSpecifier region = buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName); 935 builder.setRegion(region); 936 builder.setWriteFlushWalMarker(writeFlushWALMarker); 937 return builder.build(); 938 } 939 940 /** 941 * Create a protocol buffer OpenRegionRequest to open a list of regions 942 * @param server the serverName for the RPC 943 * @param regionOpenInfos info of a list of regions to open 944 * @return a protocol buffer OpenRegionRequest 945 */ 946 public static OpenRegionRequest buildOpenRegionRequest(ServerName server, 947 final List<Pair<RegionInfo, List<ServerName>>> regionOpenInfos) { 948 OpenRegionRequest.Builder builder = OpenRegionRequest.newBuilder(); 949 for (Pair<RegionInfo, List<ServerName>> regionOpenInfo : regionOpenInfos) { 950 builder.addOpenInfo(buildRegionOpenInfo(regionOpenInfo.getFirst(), 951 regionOpenInfo.getSecond())); 952 } 953 if (server != null) { 954 builder.setServerStartCode(server.getStartcode()); 955 } 956 // send the master's wall clock time as well, so that the RS can refer to it 957 builder.setMasterSystemTime(EnvironmentEdgeManager.currentTime()); 958 return builder.build(); 959 } 960 961 /** 962 * Create a protocol buffer OpenRegionRequest for a given region 963 * @param server the serverName for the RPC 964 * @param region the region to open 965 * @param favoredNodes a list of favored nodes 966 * @return a protocol buffer OpenRegionRequest 967 */ 968 public static OpenRegionRequest buildOpenRegionRequest(ServerName server, 969 final RegionInfo region, List<ServerName> favoredNodes) { 970 OpenRegionRequest.Builder builder = OpenRegionRequest.newBuilder(); 971 builder.addOpenInfo(buildRegionOpenInfo(region, favoredNodes)); 972 if (server != null) { 973 builder.setServerStartCode(server.getStartcode()); 974 } 975 builder.setMasterSystemTime(EnvironmentEdgeManager.currentTime()); 976 return builder.build(); 977 } 978 979 /** 980 * Create a protocol buffer UpdateFavoredNodesRequest to update a list of favorednode mappings 981 * @param updateRegionInfos a list of favored node mappings 982 * @return a protocol buffer UpdateFavoredNodesRequest 983 */ 984 public static UpdateFavoredNodesRequest buildUpdateFavoredNodesRequest( 985 final List<Pair<RegionInfo, List<ServerName>>> updateRegionInfos) { 986 UpdateFavoredNodesRequest.Builder ubuilder = UpdateFavoredNodesRequest.newBuilder(); 987 if (updateRegionInfos != null && !updateRegionInfos.isEmpty()) { 988 RegionUpdateInfo.Builder builder = RegionUpdateInfo.newBuilder(); 989 for (Pair<RegionInfo, List<ServerName>> pair : updateRegionInfos) { 990 builder.setRegion(ProtobufUtil.toRegionInfo(pair.getFirst())); 991 for (ServerName server : pair.getSecond()) { 992 builder.addFavoredNodes(ProtobufUtil.toServerName(server)); 993 } 994 ubuilder.addUpdateInfo(builder.build()); 995 builder.clear(); 996 } 997 } 998 return ubuilder.build(); 999 } 1000 1001 /** 1002 * Create a WarmupRegionRequest for a given region name 1003 * @param regionInfo Region we are warming up 1004 */ 1005 public static WarmupRegionRequest buildWarmupRegionRequest(final RegionInfo regionInfo) { 1006 WarmupRegionRequest.Builder builder = WarmupRegionRequest.newBuilder(); 1007 builder.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo)); 1008 return builder.build(); 1009 } 1010 1011 /** 1012 * Create a CompactRegionRequest for a given region name 1013 * @param regionName the name of the region to get info 1014 * @param major indicator if it is a major compaction 1015 * @param columnFamily 1016 * @return a CompactRegionRequest 1017 */ 1018 public static CompactRegionRequest buildCompactRegionRequest(byte[] regionName, boolean major, 1019 byte[] columnFamily) { 1020 CompactRegionRequest.Builder builder = CompactRegionRequest.newBuilder(); 1021 RegionSpecifier region = buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName); 1022 builder.setRegion(region); 1023 builder.setMajor(major); 1024 if (columnFamily != null) { 1025 builder.setFamily(UnsafeByteOperations.unsafeWrap(columnFamily)); 1026 } 1027 return builder.build(); 1028 } 1029 1030 /** 1031 * @see {@link #buildRollWALWriterRequest()} 1032 */ 1033 private static RollWALWriterRequest ROLL_WAL_WRITER_REQUEST = RollWALWriterRequest.newBuilder() 1034 .build(); 1035 1036 /** 1037 * Create a new RollWALWriterRequest 1038 * @return a ReplicateWALEntryRequest 1039 */ 1040 public static RollWALWriterRequest buildRollWALWriterRequest() { 1041 return ROLL_WAL_WRITER_REQUEST; 1042 } 1043 1044 /** 1045 * @see {@link #buildGetServerInfoRequest()} 1046 */ 1047 private static GetServerInfoRequest GET_SERVER_INFO_REQUEST = GetServerInfoRequest.newBuilder() 1048 .build(); 1049 1050 /** 1051 * Create a new GetServerInfoRequest 1052 * @return a GetServerInfoRequest 1053 */ 1054 public static GetServerInfoRequest buildGetServerInfoRequest() { 1055 return GET_SERVER_INFO_REQUEST; 1056 } 1057 1058 /** 1059 * Create a new StopServerRequest 1060 * @param reason the reason to stop the server 1061 * @return a StopServerRequest 1062 */ 1063 public static StopServerRequest buildStopServerRequest(final String reason) { 1064 StopServerRequest.Builder builder = StopServerRequest.newBuilder(); 1065 builder.setReason(reason); 1066 return builder.build(); 1067 } 1068 1069//End utilities for Admin 1070 1071 /** 1072 * Convert a byte array to a protocol buffer RegionSpecifier 1073 * 1074 * @param type the region specifier type 1075 * @param value the region specifier byte array value 1076 * @return a protocol buffer RegionSpecifier 1077 */ 1078 public static RegionSpecifier buildRegionSpecifier( 1079 final RegionSpecifierType type, final byte[] value) { 1080 RegionSpecifier.Builder regionBuilder = RegionSpecifier.newBuilder(); 1081 regionBuilder.setValue(UnsafeByteOperations.unsafeWrap(value)); 1082 regionBuilder.setType(type); 1083 return regionBuilder.build(); 1084 } 1085 1086 /** 1087 * Create a protocol buffer Condition 1088 * 1089 * @param row 1090 * @param family 1091 * @param qualifier 1092 * @param comparator 1093 * @param compareType 1094 * @return a Condition 1095 * @throws IOException 1096 */ 1097 public static Condition buildCondition(final byte[] row, final byte[] family, 1098 final byte[] qualifier, final ByteArrayComparable comparator, final CompareType compareType, 1099 final TimeRange timeRange) { 1100 return Condition.newBuilder().setRow(UnsafeByteOperations.unsafeWrap(row)) 1101 .setFamily(UnsafeByteOperations.unsafeWrap(family)) 1102 .setQualifier(UnsafeByteOperations.unsafeWrap(qualifier == null ? 1103 HConstants.EMPTY_BYTE_ARRAY : qualifier)) 1104 .setComparator(ProtobufUtil.toComparator(comparator)) 1105 .setCompareType(compareType) 1106 .setTimeRange(ProtobufUtil.toTimeRange(timeRange)) 1107 .build(); 1108 } 1109 1110 /** 1111 * Create a protocol buffer AddColumnRequest 1112 * 1113 * @param tableName 1114 * @param column 1115 * @return an AddColumnRequest 1116 */ 1117 public static AddColumnRequest buildAddColumnRequest( 1118 final TableName tableName, 1119 final ColumnFamilyDescriptor column, 1120 final long nonceGroup, 1121 final long nonce) { 1122 AddColumnRequest.Builder builder = AddColumnRequest.newBuilder(); 1123 builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); 1124 builder.setColumnFamilies(ProtobufUtil.toColumnFamilySchema(column)); 1125 builder.setNonceGroup(nonceGroup); 1126 builder.setNonce(nonce); 1127 return builder.build(); 1128 } 1129 1130 /** 1131 * Create a protocol buffer DeleteColumnRequest 1132 * 1133 * @param tableName 1134 * @param columnName 1135 * @return a DeleteColumnRequest 1136 */ 1137 public static DeleteColumnRequest buildDeleteColumnRequest( 1138 final TableName tableName, 1139 final byte [] columnName, 1140 final long nonceGroup, 1141 final long nonce) { 1142 DeleteColumnRequest.Builder builder = DeleteColumnRequest.newBuilder(); 1143 builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); 1144 builder.setColumnName(UnsafeByteOperations.unsafeWrap(columnName)); 1145 builder.setNonceGroup(nonceGroup); 1146 builder.setNonce(nonce); 1147 return builder.build(); 1148 } 1149 1150 /** 1151 * Create a protocol buffer ModifyColumnRequest 1152 * 1153 * @param tableName 1154 * @param column 1155 * @return an ModifyColumnRequest 1156 */ 1157 public static ModifyColumnRequest buildModifyColumnRequest( 1158 final TableName tableName, 1159 final ColumnFamilyDescriptor column, 1160 final long nonceGroup, 1161 final long nonce) { 1162 ModifyColumnRequest.Builder builder = ModifyColumnRequest.newBuilder(); 1163 builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); 1164 builder.setColumnFamilies(ProtobufUtil.toColumnFamilySchema(column)); 1165 builder.setNonceGroup(nonceGroup); 1166 builder.setNonce(nonce); 1167 return builder.build(); 1168 } 1169 1170 /** 1171 * Create a protocol buffer MoveRegionRequest 1172 * @param encodedRegionName 1173 * @param destServerName 1174 * @return A MoveRegionRequest 1175 */ 1176 public static MoveRegionRequest buildMoveRegionRequest(byte[] encodedRegionName, 1177 ServerName destServerName) { 1178 MoveRegionRequest.Builder builder = MoveRegionRequest.newBuilder(); 1179 builder.setRegion(buildRegionSpecifier(RegionSpecifierType.ENCODED_REGION_NAME, 1180 encodedRegionName)); 1181 if (destServerName != null) { 1182 builder.setDestServerName(ProtobufUtil.toServerName(destServerName)); 1183 } 1184 return builder.build(); 1185 } 1186 1187 public static MergeTableRegionsRequest buildMergeTableRegionsRequest( 1188 final byte[][] encodedNameOfdaughaterRegions, 1189 final boolean forcible, 1190 final long nonceGroup, 1191 final long nonce) throws DeserializationException { 1192 MergeTableRegionsRequest.Builder builder = MergeTableRegionsRequest.newBuilder(); 1193 for (int i = 0; i< encodedNameOfdaughaterRegions.length; i++) { 1194 builder.addRegion(buildRegionSpecifier( 1195 RegionSpecifierType.ENCODED_REGION_NAME, encodedNameOfdaughaterRegions[i])); 1196 } 1197 builder.setForcible(forcible); 1198 builder.setNonceGroup(nonceGroup); 1199 builder.setNonce(nonce); 1200 return builder.build(); 1201 } 1202 1203 public static SplitTableRegionRequest buildSplitTableRegionRequest(final RegionInfo regionInfo, 1204 final byte[] splitRow, final long nonceGroup, final long nonce) 1205 throws DeserializationException { 1206 SplitTableRegionRequest.Builder builder = SplitTableRegionRequest.newBuilder(); 1207 builder.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo)); 1208 if (splitRow != null) { 1209 builder.setSplitRow(UnsafeByteOperations.unsafeWrap(splitRow)); 1210 } 1211 builder.setNonceGroup(nonceGroup); 1212 builder.setNonce(nonce); 1213 return builder.build(); 1214 } 1215 1216 /** 1217 * Create a protocol buffer AssignRegionRequest 1218 * 1219 * @param regionName 1220 * @return an AssignRegionRequest 1221 */ 1222 public static AssignRegionRequest buildAssignRegionRequest(final byte [] regionName) { 1223 AssignRegionRequest.Builder builder = AssignRegionRequest.newBuilder(); 1224 builder.setRegion(buildRegionSpecifier(RegionSpecifierType.REGION_NAME,regionName)); 1225 return builder.build(); 1226 } 1227 1228 /** 1229 * Creates a protocol buffer UnassignRegionRequest 1230 * 1231 * @param regionName 1232 * @param force 1233 * @return an UnassignRegionRequest 1234 */ 1235 public static UnassignRegionRequest buildUnassignRegionRequest( 1236 final byte [] regionName, final boolean force) { 1237 UnassignRegionRequest.Builder builder = UnassignRegionRequest.newBuilder(); 1238 builder.setRegion(buildRegionSpecifier(RegionSpecifierType.REGION_NAME,regionName)); 1239 builder.setForce(force); 1240 return builder.build(); 1241 } 1242 1243 /** 1244 * Creates a protocol buffer OfflineRegionRequest 1245 * 1246 * @param regionName 1247 * @return an OfflineRegionRequest 1248 */ 1249 public static OfflineRegionRequest buildOfflineRegionRequest(final byte [] regionName) { 1250 OfflineRegionRequest.Builder builder = OfflineRegionRequest.newBuilder(); 1251 builder.setRegion(buildRegionSpecifier(RegionSpecifierType.REGION_NAME,regionName)); 1252 return builder.build(); 1253 } 1254 1255 /** 1256 * Creates a protocol buffer DeleteTableRequest 1257 * 1258 * @param tableName 1259 * @return a DeleteTableRequest 1260 */ 1261 public static DeleteTableRequest buildDeleteTableRequest( 1262 final TableName tableName, 1263 final long nonceGroup, 1264 final long nonce) { 1265 DeleteTableRequest.Builder builder = DeleteTableRequest.newBuilder(); 1266 builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); 1267 builder.setNonceGroup(nonceGroup); 1268 builder.setNonce(nonce); 1269 return builder.build(); 1270 } 1271 1272 /** 1273 * Creates a protocol buffer TruncateTableRequest 1274 * 1275 * @param tableName name of table to truncate 1276 * @param preserveSplits True if the splits should be preserved 1277 * @return a TruncateTableRequest 1278 */ 1279 public static TruncateTableRequest buildTruncateTableRequest( 1280 final TableName tableName, 1281 final boolean preserveSplits, 1282 final long nonceGroup, 1283 final long nonce) { 1284 TruncateTableRequest.Builder builder = TruncateTableRequest.newBuilder(); 1285 builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); 1286 builder.setPreserveSplits(preserveSplits); 1287 builder.setNonceGroup(nonceGroup); 1288 builder.setNonce(nonce); 1289 return builder.build(); 1290 } 1291 1292 /** 1293 * Creates a protocol buffer EnableTableRequest 1294 * 1295 * @param tableName 1296 * @return an EnableTableRequest 1297 */ 1298 public static EnableTableRequest buildEnableTableRequest( 1299 final TableName tableName, 1300 final long nonceGroup, 1301 final long nonce) { 1302 EnableTableRequest.Builder builder = EnableTableRequest.newBuilder(); 1303 builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); 1304 builder.setNonceGroup(nonceGroup); 1305 builder.setNonce(nonce); 1306 return builder.build(); 1307 } 1308 1309 /** 1310 * Creates a protocol buffer DisableTableRequest 1311 * 1312 * @param tableName 1313 * @return a DisableTableRequest 1314 */ 1315 public static DisableTableRequest buildDisableTableRequest( 1316 final TableName tableName, 1317 final long nonceGroup, 1318 final long nonce) { 1319 DisableTableRequest.Builder builder = DisableTableRequest.newBuilder(); 1320 builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); 1321 builder.setNonceGroup(nonceGroup); 1322 builder.setNonce(nonce); 1323 return builder.build(); 1324 } 1325 1326 /** 1327 * Creates a protocol buffer CreateTableRequest 1328 * 1329 * @param tableDescriptor 1330 * @param splitKeys 1331 * @return a CreateTableRequest 1332 */ 1333 public static CreateTableRequest buildCreateTableRequest( 1334 final TableDescriptor tableDescriptor, 1335 final byte [][] splitKeys, 1336 final long nonceGroup, 1337 final long nonce) { 1338 CreateTableRequest.Builder builder = CreateTableRequest.newBuilder(); 1339 builder.setTableSchema(ProtobufUtil.toTableSchema(tableDescriptor)); 1340 if (splitKeys != null) { 1341 for(byte[] key : splitKeys) { 1342 builder.addSplitKeys(UnsafeByteOperations.unsafeWrap(key)); 1343 } 1344 } 1345 builder.setNonceGroup(nonceGroup); 1346 builder.setNonce(nonce); 1347 return builder.build(); 1348 } 1349 1350 /** 1351 * Creates a protocol buffer ModifyTableRequest 1352 * 1353 * @param tableName 1354 * @param tableDesc 1355 * @return a ModifyTableRequest 1356 */ 1357 public static ModifyTableRequest buildModifyTableRequest( 1358 final TableName tableName, 1359 final TableDescriptor tableDesc, 1360 final long nonceGroup, 1361 final long nonce) { 1362 ModifyTableRequest.Builder builder = ModifyTableRequest.newBuilder(); 1363 builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); 1364 builder.setTableSchema(ProtobufUtil.toTableSchema(tableDesc)); 1365 builder.setNonceGroup(nonceGroup); 1366 builder.setNonce(nonce); 1367 return builder.build(); 1368 } 1369 1370 /** 1371 * Creates a protocol buffer GetSchemaAlterStatusRequest 1372 * 1373 * @param tableName 1374 * @return a GetSchemaAlterStatusRequest 1375 */ 1376 public static GetSchemaAlterStatusRequest buildGetSchemaAlterStatusRequest( 1377 final TableName tableName) { 1378 GetSchemaAlterStatusRequest.Builder builder = GetSchemaAlterStatusRequest.newBuilder(); 1379 builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); 1380 return builder.build(); 1381 } 1382 1383 /** 1384 * Creates a protocol buffer GetTableDescriptorsRequest 1385 * 1386 * @param tableNames 1387 * @return a GetTableDescriptorsRequest 1388 */ 1389 public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest( 1390 final List<TableName> tableNames) { 1391 GetTableDescriptorsRequest.Builder builder = GetTableDescriptorsRequest.newBuilder(); 1392 if (tableNames != null) { 1393 for (TableName tableName : tableNames) { 1394 builder.addTableNames(ProtobufUtil.toProtoTableName(tableName)); 1395 } 1396 } 1397 return builder.build(); 1398 } 1399 1400 /** 1401 * Creates a protocol buffer GetTableDescriptorsRequest 1402 * 1403 * @param pattern The compiled regular expression to match against 1404 * @param includeSysTables False to match only against userspace tables 1405 * @return a GetTableDescriptorsRequest 1406 */ 1407 public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest(final Pattern pattern, 1408 boolean includeSysTables) { 1409 GetTableDescriptorsRequest.Builder builder = GetTableDescriptorsRequest.newBuilder(); 1410 if (pattern != null) { 1411 builder.setRegex(pattern.toString()); 1412 } 1413 builder.setIncludeSysTables(includeSysTables); 1414 return builder.build(); 1415 } 1416 1417 /** 1418 * Creates a protocol buffer GetTableNamesRequest 1419 * 1420 * @param pattern The compiled regular expression to match against 1421 * @param includeSysTables False to match only against userspace tables 1422 * @return a GetTableNamesRequest 1423 */ 1424 public static GetTableNamesRequest buildGetTableNamesRequest(final Pattern pattern, 1425 boolean includeSysTables) { 1426 GetTableNamesRequest.Builder builder = GetTableNamesRequest.newBuilder(); 1427 if (pattern != null) { 1428 builder.setRegex(pattern.toString()); 1429 } 1430 builder.setIncludeSysTables(includeSysTables); 1431 return builder.build(); 1432 } 1433 1434 /** 1435 * Creates a protocol buffer GetTableStateRequest 1436 * 1437 * @param tableName table to get request for 1438 * @return a GetTableStateRequest 1439 */ 1440 public static GetTableStateRequest buildGetTableStateRequest( 1441 final TableName tableName) { 1442 return GetTableStateRequest.newBuilder() 1443 .setTableName(ProtobufUtil.toProtoTableName(tableName)) 1444 .build(); 1445 } 1446 1447 /** 1448 * Creates a protocol buffer SetTableStateInMetaRequest 1449 * @param state table state to update in Meta 1450 * @return a SetTableStateInMetaRequest 1451 */ 1452 public static SetTableStateInMetaRequest buildSetTableStateInMetaRequest(final TableState state) { 1453 return SetTableStateInMetaRequest.newBuilder().setTableState(state.convert()) 1454 .setTableName(ProtobufUtil.toProtoTableName(state.getTableName())).build(); 1455 } 1456 1457 /** 1458 * Creates a protocol buffer GetTableDescriptorsRequest for a single table 1459 * 1460 * @param tableName the table name 1461 * @return a GetTableDescriptorsRequest 1462 */ 1463 public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest( 1464 final TableName tableName) { 1465 return GetTableDescriptorsRequest.newBuilder() 1466 .addTableNames(ProtobufUtil.toProtoTableName(tableName)) 1467 .build(); 1468 } 1469 1470 /** 1471 * Creates a protocol buffer IsMasterRunningRequest 1472 * 1473 * @return a IsMasterRunningRequest 1474 */ 1475 public static IsMasterRunningRequest buildIsMasterRunningRequest() { 1476 return IsMasterRunningRequest.newBuilder().build(); 1477 } 1478 1479 /** 1480 * Creates a protocol buffer BalanceRequest 1481 * 1482 * @return a BalanceRequest 1483 */ 1484 public static BalanceRequest buildBalanceRequest(boolean force) { 1485 return BalanceRequest.newBuilder().setForce(force).build(); 1486 } 1487 1488 /** 1489 * Creates a protocol buffer SetBalancerRunningRequest 1490 * 1491 * @param on 1492 * @param synchronous 1493 * @return a SetBalancerRunningRequest 1494 */ 1495 public static SetBalancerRunningRequest buildSetBalancerRunningRequest( 1496 boolean on, 1497 boolean synchronous) { 1498 return SetBalancerRunningRequest.newBuilder().setOn(on).setSynchronous(synchronous).build(); 1499 } 1500 1501 /** 1502 * Creates a protocol buffer IsBalancerEnabledRequest 1503 * 1504 * @return a IsBalancerEnabledRequest 1505 */ 1506 public static IsBalancerEnabledRequest buildIsBalancerEnabledRequest() { 1507 return IsBalancerEnabledRequest.newBuilder().build(); 1508 } 1509 1510 /** 1511 * Creates a protocol buffer ClearRegionBlockCacheRequest 1512 * 1513 * @return a ClearRegionBlockCacheRequest 1514 */ 1515 public static ClearRegionBlockCacheRequest 1516 buildClearRegionBlockCacheRequest(List<RegionInfo> hris) { 1517 ClearRegionBlockCacheRequest.Builder builder = ClearRegionBlockCacheRequest.newBuilder(); 1518 hris.forEach( 1519 hri -> builder.addRegion( 1520 buildRegionSpecifier(RegionSpecifierType.REGION_NAME, hri.getRegionName()) 1521 )); 1522 return builder.build(); 1523 } 1524 1525 /** 1526 * Creates a protocol buffer GetClusterStatusRequest 1527 * 1528 * @return A GetClusterStatusRequest 1529 */ 1530 public static GetClusterStatusRequest buildGetClusterStatusRequest(EnumSet<Option> options) { 1531 return GetClusterStatusRequest.newBuilder() 1532 .addAllOptions(ClusterMetricsBuilder.toOptions(options)) 1533 .build(); 1534 } 1535 1536 /** 1537 * @see {@link #buildCatalogScanRequest} 1538 */ 1539 private static final RunCatalogScanRequest CATALOG_SCAN_REQUEST = 1540 RunCatalogScanRequest.newBuilder().build(); 1541 1542 /** 1543 * Creates a request for running a catalog scan 1544 * @return A {@link RunCatalogScanRequest} 1545 */ 1546 public static RunCatalogScanRequest buildCatalogScanRequest() { 1547 return CATALOG_SCAN_REQUEST; 1548 } 1549 1550 /** 1551 * Creates a request for enabling/disabling the catalog janitor 1552 * @return A {@link EnableCatalogJanitorRequest} 1553 */ 1554 public static EnableCatalogJanitorRequest buildEnableCatalogJanitorRequest(boolean enable) { 1555 return EnableCatalogJanitorRequest.newBuilder().setEnable(enable).build(); 1556 } 1557 1558 /** 1559 * @see {@link #buildIsCatalogJanitorEnabledRequest()} 1560 */ 1561 private static final IsCatalogJanitorEnabledRequest IS_CATALOG_JANITOR_ENABLED_REQUEST = 1562 IsCatalogJanitorEnabledRequest.newBuilder().build(); 1563 1564 /** 1565 * Creates a request for querying the master whether the catalog janitor is enabled 1566 * @return A {@link IsCatalogJanitorEnabledRequest} 1567 */ 1568 public static IsCatalogJanitorEnabledRequest buildIsCatalogJanitorEnabledRequest() { 1569 return IS_CATALOG_JANITOR_ENABLED_REQUEST; 1570 } 1571 1572 /** 1573 * @see {@link #buildCleanerChoreRequest} 1574 */ 1575 private static final RunCleanerChoreRequest CLEANER_CHORE_REQUEST = 1576 RunCleanerChoreRequest.newBuilder().build(); 1577 1578 /** 1579 * Creates a request for running cleaner chore 1580 * @return A {@link RunCleanerChoreRequest} 1581 */ 1582 public static RunCleanerChoreRequest buildRunCleanerChoreRequest() { 1583 return CLEANER_CHORE_REQUEST; 1584 } 1585 1586 /** 1587 * Creates a request for enabling/disabling the cleaner chore 1588 * @return A {@link SetCleanerChoreRunningRequest} 1589 */ 1590 public static SetCleanerChoreRunningRequest buildSetCleanerChoreRunningRequest(boolean on) { 1591 return SetCleanerChoreRunningRequest.newBuilder().setOn(on).build(); 1592 } 1593 1594 /** 1595 * @see {@link #buildIsCleanerChoreEnabledRequest()} 1596 */ 1597 private static final IsCleanerChoreEnabledRequest IS_CLEANER_CHORE_ENABLED_REQUEST = 1598 IsCleanerChoreEnabledRequest.newBuilder().build(); 1599 1600 /** 1601 * Creates a request for querying the master whether the cleaner chore is enabled 1602 * @return A {@link IsCleanerChoreEnabledRequest} 1603 */ 1604 public static IsCleanerChoreEnabledRequest buildIsCleanerChoreEnabledRequest() { 1605 return IS_CLEANER_CHORE_ENABLED_REQUEST; 1606 } 1607 1608 /** 1609 * Creates a request for querying the master the last flushed sequence Id for a region 1610 * @param regionName 1611 * @return A {@link GetLastFlushedSequenceIdRequest} 1612 */ 1613 public static GetLastFlushedSequenceIdRequest buildGetLastFlushedSequenceIdRequest( 1614 byte[] regionName) { 1615 return GetLastFlushedSequenceIdRequest.newBuilder().setRegionName( 1616 UnsafeByteOperations.unsafeWrap(regionName)).build(); 1617 } 1618 1619 /** 1620 * Create a RegionOpenInfo based on given region info and version of offline node 1621 */ 1622 public static RegionOpenInfo buildRegionOpenInfo( 1623 final RegionInfo region, final List<ServerName> favoredNodes) { 1624 RegionOpenInfo.Builder builder = RegionOpenInfo.newBuilder(); 1625 builder.setRegion(ProtobufUtil.toRegionInfo(region)); 1626 if (favoredNodes != null) { 1627 for (ServerName server : favoredNodes) { 1628 builder.addFavoredNodes(ProtobufUtil.toServerName(server)); 1629 } 1630 } 1631 return builder.build(); 1632 } 1633 1634 /** 1635 * Creates a protocol buffer NormalizeRequest 1636 * 1637 * @return a NormalizeRequest 1638 */ 1639 public static NormalizeRequest buildNormalizeRequest() { 1640 return NormalizeRequest.newBuilder().build(); 1641 } 1642 1643 /** 1644 * Creates a protocol buffer IsNormalizerEnabledRequest 1645 * 1646 * @return a IsNormalizerEnabledRequest 1647 */ 1648 public static IsNormalizerEnabledRequest buildIsNormalizerEnabledRequest() { 1649 return IsNormalizerEnabledRequest.newBuilder().build(); 1650 } 1651 1652 /** 1653 * Creates a protocol buffer SetNormalizerRunningRequest 1654 * 1655 * @param on 1656 * @return a SetNormalizerRunningRequest 1657 */ 1658 public static SetNormalizerRunningRequest buildSetNormalizerRunningRequest(boolean on) { 1659 return SetNormalizerRunningRequest.newBuilder().setOn(on).build(); 1660 } 1661 1662 /** 1663 * Creates a protocol buffer IsSplitOrMergeEnabledRequest 1664 * 1665 * @param switchType see {@link org.apache.hadoop.hbase.client.MasterSwitchType} 1666 * @return a IsSplitOrMergeEnabledRequest 1667 */ 1668 public static IsSplitOrMergeEnabledRequest buildIsSplitOrMergeEnabledRequest( 1669 MasterSwitchType switchType) { 1670 IsSplitOrMergeEnabledRequest.Builder builder = IsSplitOrMergeEnabledRequest.newBuilder(); 1671 builder.setSwitchType(convert(switchType)); 1672 return builder.build(); 1673 } 1674 1675 /** 1676 * Creates a protocol buffer SetSplitOrMergeEnabledRequest 1677 * 1678 * @param enabled switch is enabled or not 1679 * @param synchronous set switch sync? 1680 * @param switchTypes see {@link org.apache.hadoop.hbase.client.MasterSwitchType}, it is 1681 * a list. 1682 * @return a SetSplitOrMergeEnabledRequest 1683 */ 1684 public static SetSplitOrMergeEnabledRequest buildSetSplitOrMergeEnabledRequest(boolean enabled, 1685 boolean synchronous, MasterSwitchType... switchTypes) { 1686 SetSplitOrMergeEnabledRequest.Builder builder = SetSplitOrMergeEnabledRequest.newBuilder(); 1687 builder.setEnabled(enabled); 1688 builder.setSynchronous(synchronous); 1689 for (MasterSwitchType switchType : switchTypes) { 1690 builder.addSwitchTypes(convert(switchType)); 1691 } 1692 return builder.build(); 1693 } 1694 1695 private static MasterProtos.MasterSwitchType convert(MasterSwitchType switchType) { 1696 switch (switchType) { 1697 case SPLIT: 1698 return MasterProtos.MasterSwitchType.SPLIT; 1699 case MERGE: 1700 return MasterProtos.MasterSwitchType.MERGE; 1701 default: 1702 break; 1703 } 1704 throw new UnsupportedOperationException("Unsupport switch type:" + switchType); 1705 } 1706 1707 public static ReplicationProtos.AddReplicationPeerRequest buildAddReplicationPeerRequest( 1708 String peerId, ReplicationPeerConfig peerConfig, boolean enabled) { 1709 AddReplicationPeerRequest.Builder builder = AddReplicationPeerRequest.newBuilder(); 1710 builder.setPeerId(peerId); 1711 builder.setPeerConfig(ReplicationPeerConfigUtil.convert(peerConfig)); 1712 ReplicationProtos.ReplicationState.Builder stateBuilder = 1713 ReplicationProtos.ReplicationState.newBuilder(); 1714 stateBuilder.setState(enabled ? ReplicationProtos.ReplicationState.State.ENABLED 1715 : ReplicationProtos.ReplicationState.State.DISABLED); 1716 builder.setPeerState(stateBuilder.build()); 1717 return builder.build(); 1718 } 1719 1720 public static ReplicationProtos.RemoveReplicationPeerRequest buildRemoveReplicationPeerRequest( 1721 String peerId) { 1722 RemoveReplicationPeerRequest.Builder builder = RemoveReplicationPeerRequest.newBuilder(); 1723 builder.setPeerId(peerId); 1724 return builder.build(); 1725 } 1726 1727 public static ReplicationProtos.EnableReplicationPeerRequest buildEnableReplicationPeerRequest( 1728 String peerId) { 1729 EnableReplicationPeerRequest.Builder builder = EnableReplicationPeerRequest.newBuilder(); 1730 builder.setPeerId(peerId); 1731 return builder.build(); 1732 } 1733 1734 public static ReplicationProtos.DisableReplicationPeerRequest buildDisableReplicationPeerRequest( 1735 String peerId) { 1736 DisableReplicationPeerRequest.Builder builder = DisableReplicationPeerRequest.newBuilder(); 1737 builder.setPeerId(peerId); 1738 return builder.build(); 1739 } 1740 1741 public static GetReplicationPeerConfigRequest buildGetReplicationPeerConfigRequest( 1742 String peerId) { 1743 GetReplicationPeerConfigRequest.Builder builder = GetReplicationPeerConfigRequest.newBuilder(); 1744 builder.setPeerId(peerId); 1745 return builder.build(); 1746 } 1747 1748 public static UpdateReplicationPeerConfigRequest buildUpdateReplicationPeerConfigRequest( 1749 String peerId, ReplicationPeerConfig peerConfig) { 1750 UpdateReplicationPeerConfigRequest.Builder builder = UpdateReplicationPeerConfigRequest 1751 .newBuilder(); 1752 builder.setPeerId(peerId); 1753 builder.setPeerConfig(ReplicationPeerConfigUtil.convert(peerConfig)); 1754 return builder.build(); 1755 } 1756 1757 public static ListReplicationPeersRequest buildListReplicationPeersRequest(Pattern pattern) { 1758 ListReplicationPeersRequest.Builder builder = ListReplicationPeersRequest.newBuilder(); 1759 if (pattern != null) { 1760 builder.setRegex(pattern.toString()); 1761 } 1762 return builder.build(); 1763 } 1764 1765 /** 1766 * Creates a protocol buffer CreateNamespaceRequest 1767 * @param descriptor 1768 * @return a CreateNamespaceRequest 1769 */ 1770 public static CreateNamespaceRequest buildCreateNamespaceRequest( 1771 final NamespaceDescriptor descriptor) { 1772 CreateNamespaceRequest.Builder builder = CreateNamespaceRequest.newBuilder(); 1773 builder.setNamespaceDescriptor(ProtobufUtil.toProtoNamespaceDescriptor(descriptor)); 1774 return builder.build(); 1775 } 1776 1777 /** 1778 * Creates a protocol buffer ModifyNamespaceRequest 1779 * @param descriptor 1780 * @return a ModifyNamespaceRequest 1781 */ 1782 public static ModifyNamespaceRequest buildModifyNamespaceRequest( 1783 final NamespaceDescriptor descriptor) { 1784 ModifyNamespaceRequest.Builder builder = ModifyNamespaceRequest.newBuilder(); 1785 builder.setNamespaceDescriptor(ProtobufUtil.toProtoNamespaceDescriptor(descriptor)); 1786 return builder.build(); 1787 } 1788 1789 /** 1790 * Creates a protocol buffer DeleteNamespaceRequest 1791 * @param name 1792 * @return a DeleteNamespaceRequest 1793 */ 1794 public static DeleteNamespaceRequest buildDeleteNamespaceRequest(final String name) { 1795 DeleteNamespaceRequest.Builder builder = DeleteNamespaceRequest.newBuilder(); 1796 builder.setNamespaceName(name); 1797 return builder.build(); 1798 } 1799 1800 /** 1801 * Creates a protocol buffer GetNamespaceDescriptorRequest 1802 * @param name 1803 * @return a GetNamespaceDescriptorRequest 1804 */ 1805 public static GetNamespaceDescriptorRequest buildGetNamespaceDescriptorRequest(final String name) { 1806 GetNamespaceDescriptorRequest.Builder builder = GetNamespaceDescriptorRequest.newBuilder(); 1807 builder.setNamespaceName(name); 1808 return builder.build(); 1809 } 1810 1811 public static ClearCompactionQueuesRequest buildClearCompactionQueuesRequest(Set<String> queues) { 1812 ClearCompactionQueuesRequest.Builder builder = ClearCompactionQueuesRequest.newBuilder(); 1813 for(String name: queues) { 1814 builder.addQueueName(name); 1815 } 1816 return builder.build(); 1817 } 1818 1819 public static ClearDeadServersRequest buildClearDeadServersRequest( 1820 Collection<ServerName> deadServers) { 1821 ClearDeadServersRequest.Builder builder = ClearDeadServersRequest.newBuilder(); 1822 for(ServerName server: deadServers) { 1823 builder.addServerName(ProtobufUtil.toServerName(server)); 1824 } 1825 return builder.build(); 1826 } 1827 1828 private static final GetSpaceQuotaRegionSizesRequest GET_SPACE_QUOTA_REGION_SIZES_REQUEST = 1829 GetSpaceQuotaRegionSizesRequest.newBuilder().build(); 1830 1831 /** 1832 * Returns a {@link GetSpaceQuotaRegionSizesRequest} object. 1833 */ 1834 public static GetSpaceQuotaRegionSizesRequest buildGetSpaceQuotaRegionSizesRequest() { 1835 return GET_SPACE_QUOTA_REGION_SIZES_REQUEST; 1836 } 1837 1838 private static final GetSpaceQuotaSnapshotsRequest GET_SPACE_QUOTA_SNAPSHOTS_REQUEST = 1839 GetSpaceQuotaSnapshotsRequest.newBuilder().build(); 1840 1841 /** 1842 * Returns a {@link GetSpaceQuotaSnapshotsRequest} object. 1843 */ 1844 public static GetSpaceQuotaSnapshotsRequest buildGetSpaceQuotaSnapshotsRequest() { 1845 return GET_SPACE_QUOTA_SNAPSHOTS_REQUEST; 1846 } 1847 1848 private static final GetQuotaStatesRequest GET_QUOTA_STATES_REQUEST = 1849 GetQuotaStatesRequest.newBuilder().build(); 1850 1851 /** 1852 * Returns a {@link GetQuotaStatesRequest} object. 1853 */ 1854 public static GetQuotaStatesRequest buildGetQuotaStatesRequest() { 1855 return GET_QUOTA_STATES_REQUEST; 1856 } 1857 1858 public static DecommissionRegionServersRequest 1859 buildDecommissionRegionServersRequest(List<ServerName> servers, boolean offload) { 1860 return DecommissionRegionServersRequest.newBuilder() 1861 .addAllServerName(toProtoServerNames(servers)).setOffload(offload).build(); 1862 } 1863 1864 public static RecommissionRegionServerRequest 1865 buildRecommissionRegionServerRequest(ServerName server, List<byte[]> encodedRegionNames) { 1866 RecommissionRegionServerRequest.Builder builder = RecommissionRegionServerRequest.newBuilder(); 1867 if (encodedRegionNames != null) { 1868 for (byte[] name : encodedRegionNames) { 1869 builder.addRegion(buildRegionSpecifier(RegionSpecifierType.ENCODED_REGION_NAME, name)); 1870 } 1871 } 1872 return builder.setServerName(ProtobufUtil.toServerName(server)).build(); 1873 } 1874 1875 private static List<HBaseProtos.ServerName> toProtoServerNames(List<ServerName> servers) { 1876 List<HBaseProtos.ServerName> pbServers = new ArrayList<>(servers.size()); 1877 for (ServerName server : servers) { 1878 pbServers.add(ProtobufUtil.toServerName(server)); 1879 } 1880 return pbServers; 1881 } 1882}