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