/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.hbase.shaded.protobuf; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import org.apache.hadoop.hbase.CellScannable; import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.client.Action; import org.apache.hadoop.hbase.client.Append; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Durability; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Increment; import org.apache.hadoop.hbase.client.MasterSwitchType; import org.apache.hadoop.hbase.client.Mutation; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.RegionCoprocessorServiceExec; import org.apache.hadoop.hbase.client.Row; import org.apache.hadoop.hbase.client.RowMutations; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.replication.ReplicationSerDeHelper; import org.apache.hadoop.hbase.exceptions.DeserializationException; import org.apache.hadoop.hbase.filter.ByteArrayComparable; import org.apache.hadoop.hbase.replication.ReplicationPeerConfig; import org.apache.hadoop.hbase.shaded.com.google.protobuf.UnsafeByteOperations; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionLoadRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerInfoRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest.RegionUpdateInfo; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WarmupRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.BulkLoadHFileRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Condition; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.GetRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutateRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.ColumnValue; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.ColumnValue.QualifierValue; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.MutationType; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionAction; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.CompareType; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AddColumnRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BalanceRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateTableRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteColumnRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteNamespaceRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteTableRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DisableTableRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableCatalogJanitorRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyNamespaceRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetCleanerChoreRunningRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTableRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetSchemaAlterStatusRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableDescriptorsRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableNamesRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableStateRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCatalogJanitorEnabledRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCleanerChoreEnabledRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsMasterRunningRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MergeTableRegionsRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyColumnRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyTableRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MoveRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.NormalizeRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.OfflineRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCatalogScanRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCleanerChoreRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetBalancerRunningRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.TruncateTableRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.GetLastFlushedSequenceIdRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.SplitTableRegionRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ListReplicationPeersRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerRequest; import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigRequest; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.security.token.Token; /** * Helper utility to build protocol buffer requests, * or build components for protocol buffer requests. */ @InterfaceAudience.Private public final class RequestConverter { private RequestConverter() { } // Start utilities for Client /** * Create a protocol buffer GetRequest for a client Get * * @param regionName the name of the region to get * @param get the client Get * @return a protocol buffer GetRequest */ public static GetRequest buildGetRequest(final byte[] regionName, final Get get) throws IOException { GetRequest.Builder builder = GetRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); builder.setGet(ProtobufUtil.toGet(get)); return builder.build(); } /** * Create a protocol buffer MutateRequest for a client increment * * @param regionName * @param row * @param family * @param qualifier * @param amount * @param durability * @return a mutate request */ public static MutateRequest buildIncrementRequest( final byte[] regionName, final byte[] row, final byte[] family, final byte[] qualifier, final long amount, final Durability durability, long nonceGroup, long nonce) { MutateRequest.Builder builder = MutateRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); MutationProto.Builder mutateBuilder = MutationProto.newBuilder(); mutateBuilder.setRow(UnsafeByteOperations.unsafeWrap(row)); mutateBuilder.setMutateType(MutationType.INCREMENT); mutateBuilder.setDurability(ProtobufUtil.toDurability(durability)); ColumnValue.Builder columnBuilder = ColumnValue.newBuilder(); columnBuilder.setFamily(UnsafeByteOperations.unsafeWrap(family)); QualifierValue.Builder valueBuilder = QualifierValue.newBuilder(); valueBuilder.setValue(UnsafeByteOperations.unsafeWrap(Bytes.toBytes(amount))); valueBuilder.setQualifier(UnsafeByteOperations .unsafeWrap(qualifier == null ? HConstants.EMPTY_BYTE_ARRAY : qualifier)); columnBuilder.addQualifierValue(valueBuilder.build()); mutateBuilder.addColumnValue(columnBuilder.build()); if (nonce != HConstants.NO_NONCE) { mutateBuilder.setNonce(nonce); } builder.setMutation(mutateBuilder.build()); if (nonceGroup != HConstants.NO_NONCE) { builder.setNonceGroup(nonceGroup); } return builder.build(); } /** * Create a protocol buffer MutateRequest for a conditioned put * * @param regionName * @param row * @param family * @param qualifier * @param comparator * @param compareType * @param put * @return a mutate request * @throws IOException */ public static MutateRequest buildMutateRequest( final byte[] regionName, final byte[] row, final byte[] family, final byte [] qualifier, final ByteArrayComparable comparator, final CompareType compareType, final Put put) throws IOException { MutateRequest.Builder builder = MutateRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); Condition condition = buildCondition( row, family, qualifier, comparator, compareType); builder.setMutation(ProtobufUtil.toMutation(MutationType.PUT, put, MutationProto.newBuilder())); builder.setCondition(condition); return builder.build(); } /** * Create a protocol buffer MutateRequest for a conditioned delete * * @param regionName * @param row * @param family * @param qualifier * @param comparator * @param compareType * @param delete * @return a mutate request * @throws IOException */ public static MutateRequest buildMutateRequest( final byte[] regionName, final byte[] row, final byte[] family, final byte [] qualifier, final ByteArrayComparable comparator, final CompareType compareType, final Delete delete) throws IOException { MutateRequest.Builder builder = MutateRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); Condition condition = buildCondition( row, family, qualifier, comparator, compareType); builder.setMutation(ProtobufUtil.toMutation(MutationType.DELETE, delete, MutationProto.newBuilder())); builder.setCondition(condition); return builder.build(); } /** * Create a protocol buffer MutateRequest for conditioned row mutations * * @param regionName * @param row * @param family * @param qualifier * @param comparator * @param compareType * @param rowMutations * @return a mutate request * @throws IOException */ public static ClientProtos.MultiRequest buildMutateRequest( final byte[] regionName, final byte[] row, final byte[] family, final byte [] qualifier, final ByteArrayComparable comparator, final CompareType compareType, final RowMutations rowMutations) throws IOException { RegionAction.Builder builder = getRegionActionBuilderWithRegion(RegionAction.newBuilder(), regionName); builder.setAtomic(true); ClientProtos.Action.Builder actionBuilder = ClientProtos.Action.newBuilder(); MutationProto.Builder mutationBuilder = MutationProto.newBuilder(); Condition condition = buildCondition( row, family, qualifier, comparator, compareType); for (Mutation mutation: rowMutations.getMutations()) { MutationType mutateType = null; if (mutation instanceof Put) { mutateType = MutationType.PUT; } else if (mutation instanceof Delete) { mutateType = MutationType.DELETE; } else { throw new DoNotRetryIOException("RowMutations supports only put and delete, not " + mutation.getClass().getName()); } mutationBuilder.clear(); MutationProto mp = ProtobufUtil.toMutation(mutateType, mutation, mutationBuilder); actionBuilder.clear(); actionBuilder.setMutation(mp); builder.addAction(actionBuilder.build()); } ClientProtos.MultiRequest request = ClientProtos.MultiRequest.newBuilder().addRegionAction(builder.build()) .setCondition(condition).build(); return request; } /** * Create a protocol buffer MutateRequest for a put * * @param regionName * @param put * @return a mutate request * @throws IOException */ public static MutateRequest buildMutateRequest( final byte[] regionName, final Put put) throws IOException { MutateRequest.Builder builder = MutateRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); builder.setMutation(ProtobufUtil.toMutation(MutationType.PUT, put, MutationProto.newBuilder())); return builder.build(); } /** * Create a protocol buffer MutateRequest for an append * * @param regionName * @param append * @return a mutate request * @throws IOException */ public static MutateRequest buildMutateRequest(final byte[] regionName, final Append append, long nonceGroup, long nonce) throws IOException { MutateRequest.Builder builder = MutateRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); if (nonce != HConstants.NO_NONCE && nonceGroup != HConstants.NO_NONCE) { builder.setNonceGroup(nonceGroup); } builder.setMutation(ProtobufUtil.toMutation(MutationType.APPEND, append, MutationProto.newBuilder(), nonce)); return builder.build(); } /** * Create a protocol buffer MutateRequest for a client increment * * @param regionName * @param increment * @return a mutate request */ public static MutateRequest buildMutateRequest(final byte[] regionName, final Increment increment, final long nonceGroup, final long nonce) { MutateRequest.Builder builder = MutateRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); if (nonce != HConstants.NO_NONCE && nonceGroup != HConstants.NO_NONCE) { builder.setNonceGroup(nonceGroup); } builder.setMutation(ProtobufUtil.toMutation(increment, MutationProto.newBuilder(), nonce)); return builder.build(); } /** * Create a protocol buffer MutateRequest for a delete * * @param regionName * @param delete * @return a mutate request * @throws IOException */ public static MutateRequest buildMutateRequest( final byte[] regionName, final Delete delete) throws IOException { MutateRequest.Builder builder = MutateRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); builder.setMutation(ProtobufUtil.toMutation(MutationType.DELETE, delete, MutationProto.newBuilder())); return builder.build(); } /** * Create a protocol buffer MultiRequest for row mutations. * Does not propagate Action absolute position. Does not set atomic action on the created * RegionAtomic. Caller should do that if wanted. * @param regionName * @param rowMutations * @return a data-laden RegionMutation.Builder * @throws IOException */ public static RegionAction.Builder buildRegionAction(final byte [] regionName, final RowMutations rowMutations) throws IOException { RegionAction.Builder builder = getRegionActionBuilderWithRegion(RegionAction.newBuilder(), regionName); ClientProtos.Action.Builder actionBuilder = ClientProtos.Action.newBuilder(); MutationProto.Builder mutationBuilder = MutationProto.newBuilder(); for (Mutation mutation: rowMutations.getMutations()) { MutationType mutateType = null; if (mutation instanceof Put) { mutateType = MutationType.PUT; } else if (mutation instanceof Delete) { mutateType = MutationType.DELETE; } else { throw new DoNotRetryIOException("RowMutations supports only put and delete, not " + mutation.getClass().getName()); } mutationBuilder.clear(); MutationProto mp = ProtobufUtil.toMutation(mutateType, mutation, mutationBuilder); actionBuilder.clear(); actionBuilder.setMutation(mp); builder.addAction(actionBuilder.build()); } return builder; } /** * Create a protocol buffer MultiRequest for row mutations that does not hold data. Data/Cells * are carried outside of protobuf. Return references to the Cells in <code>cells</code> param. * Does not propagate Action absolute position. Does not set atomic action on the created * RegionAtomic. Caller should do that if wanted. * @param regionName * @param rowMutations * @param cells Return in here a list of Cells as CellIterable. * @return a region mutation minus data * @throws IOException */ public static RegionAction.Builder buildNoDataRegionAction(final byte[] regionName, final RowMutations rowMutations, final List<CellScannable> cells, final RegionAction.Builder regionActionBuilder, final ClientProtos.Action.Builder actionBuilder, final MutationProto.Builder mutationBuilder) throws IOException { for (Mutation mutation: rowMutations.getMutations()) { MutationType type = null; if (mutation instanceof Put) { type = MutationType.PUT; } else if (mutation instanceof Delete) { type = MutationType.DELETE; } else { throw new DoNotRetryIOException("RowMutations supports only put and delete, not " + mutation.getClass().getName()); } mutationBuilder.clear(); MutationProto mp = ProtobufUtil.toMutationNoData(type, mutation, mutationBuilder); cells.add(mutation); actionBuilder.clear(); regionActionBuilder.addAction(actionBuilder.setMutation(mp).build()); } return regionActionBuilder; } private static RegionAction.Builder getRegionActionBuilderWithRegion( final RegionAction.Builder regionActionBuilder, final byte [] regionName) { RegionSpecifier region = buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName); regionActionBuilder.setRegion(region); return regionActionBuilder; } /** * Create a protocol buffer ScanRequest for a client Scan * * @param regionName * @param scan * @param numberOfRows * @param closeScanner * @return a scan request * @throws IOException */ public static ScanRequest buildScanRequest(byte[] regionName, Scan scan, int numberOfRows, boolean closeScanner) throws IOException { ScanRequest.Builder builder = ScanRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName); builder.setNumberOfRows(numberOfRows); builder.setCloseScanner(closeScanner); builder.setRegion(region); builder.setScan(ProtobufUtil.toScan(scan)); builder.setClientHandlesPartials(true); builder.setClientHandlesHeartbeats(true); builder.setTrackScanMetrics(scan.isScanMetricsEnabled()); if (scan.getLimit() > 0) { builder.setLimitOfRows(scan.getLimit()); } return builder.build(); } /** * Create a protocol buffer ScanRequest for a scanner id * @param scannerId * @param numberOfRows * @param closeScanner * @return a scan request */ public static ScanRequest buildScanRequest(long scannerId, int numberOfRows, boolean closeScanner, boolean trackMetrics) { ScanRequest.Builder builder = ScanRequest.newBuilder(); builder.setNumberOfRows(numberOfRows); builder.setCloseScanner(closeScanner); builder.setScannerId(scannerId); builder.setClientHandlesPartials(true); builder.setClientHandlesHeartbeats(true); builder.setTrackScanMetrics(trackMetrics); return builder.build(); } /** * Create a protocol buffer ScanRequest for a scanner id * @param scannerId * @param numberOfRows * @param closeScanner * @param nextCallSeq * @return a scan request */ public static ScanRequest buildScanRequest(long scannerId, int numberOfRows, boolean closeScanner, long nextCallSeq, boolean trackMetrics, boolean renew, int limitOfRows) { ScanRequest.Builder builder = ScanRequest.newBuilder(); builder.setNumberOfRows(numberOfRows); builder.setCloseScanner(closeScanner); builder.setScannerId(scannerId); builder.setNextCallSeq(nextCallSeq); builder.setClientHandlesPartials(true); builder.setClientHandlesHeartbeats(true); builder.setTrackScanMetrics(trackMetrics); builder.setRenew(renew); if (limitOfRows > 0) { builder.setLimitOfRows(limitOfRows); } return builder.build(); } /** * Create a protocol buffer bulk load request * * @param familyPaths * @param regionName * @param assignSeqNum * @param userToken * @param bulkToken * @return a bulk load request */ public static BulkLoadHFileRequest buildBulkLoadHFileRequest( final List<Pair<byte[], String>> familyPaths, final byte[] regionName, boolean assignSeqNum, final Token<?> userToken, final String bulkToken) { return buildBulkLoadHFileRequest(familyPaths, regionName, assignSeqNum, userToken, bulkToken, false); } /** * Create a protocol buffer bulk load request * * @param familyPaths * @param regionName * @param assignSeqNum * @param userToken * @param bulkToken * @param copyFiles * @return a bulk load request */ public static BulkLoadHFileRequest buildBulkLoadHFileRequest( final List<Pair<byte[], String>> familyPaths, final byte[] regionName, boolean assignSeqNum, final Token<?> userToken, final String bulkToken, boolean copyFiles) { RegionSpecifier region = RequestConverter.buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); ClientProtos.DelegationToken protoDT = null; if (userToken != null) { protoDT = ClientProtos.DelegationToken.newBuilder() .setIdentifier(UnsafeByteOperations.unsafeWrap(userToken.getIdentifier())) .setPassword(UnsafeByteOperations.unsafeWrap(userToken.getPassword())) .setKind(userToken.getKind().toString()) .setService(userToken.getService().toString()).build(); } List<ClientProtos.BulkLoadHFileRequest.FamilyPath> protoFamilyPaths = new ArrayList<>(familyPaths.size()); if (!familyPaths.isEmpty()) { ClientProtos.BulkLoadHFileRequest.FamilyPath.Builder pathBuilder = ClientProtos.BulkLoadHFileRequest.FamilyPath.newBuilder(); for(Pair<byte[], String> el: familyPaths) { protoFamilyPaths.add(pathBuilder .setFamily(UnsafeByteOperations.unsafeWrap(el.getFirst())) .setPath(el.getSecond()).build()); } pathBuilder.clear(); } BulkLoadHFileRequest.Builder request = ClientProtos.BulkLoadHFileRequest.newBuilder() .setRegion(region) .setAssignSeqNum(assignSeqNum) .addAllFamilyPath(protoFamilyPaths); if (userToken != null) { request.setFsToken(protoDT); } if (bulkToken != null) { request.setBulkToken(bulkToken); } request.setCopyFile(copyFiles); return request.build(); } /** * Create a protocol buffer multi request for a list of actions. * Propagates Actions original index. * * @param regionName * @param actions * @return a multi request * @throws IOException */ public static RegionAction.Builder buildRegionAction(final byte[] regionName, final List<Action> actions, final RegionAction.Builder regionActionBuilder, final ClientProtos.Action.Builder actionBuilder, final MutationProto.Builder mutationBuilder) throws IOException { ClientProtos.CoprocessorServiceCall.Builder cpBuilder = null; for (Action action: actions) { Row row = action.getAction(); actionBuilder.clear(); actionBuilder.setIndex(action.getOriginalIndex()); mutationBuilder.clear(); if (row instanceof Get) { Get g = (Get)row; regionActionBuilder.addAction(actionBuilder.setGet(ProtobufUtil.toGet(g))); } else if (row instanceof Put) { regionActionBuilder.addAction(actionBuilder. setMutation(ProtobufUtil.toMutation(MutationType.PUT, (Put)row, mutationBuilder))); } else if (row instanceof Delete) { regionActionBuilder.addAction(actionBuilder. setMutation(ProtobufUtil.toMutation(MutationType.DELETE, (Delete)row, mutationBuilder))); } else if (row instanceof Append) { regionActionBuilder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutation( MutationType.APPEND, (Append)row, mutationBuilder, action.getNonce()))); } else if (row instanceof Increment) { regionActionBuilder.addAction(actionBuilder.setMutation( ProtobufUtil.toMutation((Increment)row, mutationBuilder, action.getNonce()))); } else if (row instanceof RegionCoprocessorServiceExec) { RegionCoprocessorServiceExec exec = (RegionCoprocessorServiceExec) row; // DUMB COPY!!! FIX!!! Done to copy from c.g.p.ByteString to shaded ByteString. org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString value = org.apache.hadoop.hbase.shaded.com.google.protobuf.UnsafeByteOperations.unsafeWrap( exec.getRequest().toByteArray()); if (cpBuilder == null) { cpBuilder = ClientProtos.CoprocessorServiceCall.newBuilder(); } else { cpBuilder.clear(); } regionActionBuilder.addAction(actionBuilder.setServiceCall( cpBuilder.setRow(UnsafeByteOperations.unsafeWrap(exec.getRow())) .setServiceName(exec.getMethod().getService().getFullName()) .setMethodName(exec.getMethod().getName()) .setRequest(value))); } else if (row instanceof RowMutations) { throw new UnsupportedOperationException("No RowMutations in multi calls; use mutateRow"); } else { throw new DoNotRetryIOException("Multi doesn't support " + row.getClass().getName()); } } return regionActionBuilder; } /** * Create a protocol buffer multirequest with NO data for a list of actions (data is carried * otherwise than via protobuf). This means it just notes attributes, whether to write the * WAL, etc., and the presence in protobuf serves as place holder for the data which is * coming along otherwise. Note that Get is different. It does not contain 'data' and is always * carried by protobuf. We return references to the data by adding them to the passed in * <code>data</code> param. * * <p>Propagates Actions original index. * * @param regionName * @param actions * @param cells Place to stuff references to actual data. * @return a multi request that does not carry any data. * @throws IOException */ public static RegionAction.Builder buildNoDataRegionAction(final byte[] regionName, final Iterable<Action> actions, final List<CellScannable> cells, final RegionAction.Builder regionActionBuilder, final ClientProtos.Action.Builder actionBuilder, final MutationProto.Builder mutationBuilder) throws IOException { RegionAction.Builder builder = getRegionActionBuilderWithRegion( regionActionBuilder, regionName); ClientProtos.CoprocessorServiceCall.Builder cpBuilder = null; for (Action action: actions) { Row row = action.getAction(); actionBuilder.clear(); actionBuilder.setIndex(action.getOriginalIndex()); mutationBuilder.clear(); if (row instanceof Get) { Get g = (Get)row; builder.addAction(actionBuilder.setGet(ProtobufUtil.toGet(g))); } else if (row instanceof Put) { Put p = (Put)row; cells.add(p); builder.addAction(actionBuilder. setMutation(ProtobufUtil.toMutationNoData(MutationType.PUT, p, mutationBuilder))); } else if (row instanceof Delete) { Delete d = (Delete)row; int size = d.size(); // Note that a legitimate Delete may have a size of zero; i.e. a Delete that has nothing // in it but the row to delete. In this case, the current implementation does not make // a KeyValue to represent a delete-of-all-the-row until we serialize... For such cases // where the size returned is zero, we will send the Delete fully pb'd rather than have // metadata only in the pb and then send the kv along the side in cells. if (size > 0) { cells.add(d); builder.addAction(actionBuilder. setMutation(ProtobufUtil.toMutationNoData(MutationType.DELETE, d, mutationBuilder))); } else { builder.addAction(actionBuilder. setMutation(ProtobufUtil.toMutation(MutationType.DELETE, d, mutationBuilder))); } } else if (row instanceof Append) { Append a = (Append)row; cells.add(a); builder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutationNoData( MutationType.APPEND, a, mutationBuilder, action.getNonce()))); } else if (row instanceof Increment) { Increment i = (Increment)row; cells.add(i); builder.addAction(actionBuilder.setMutation(ProtobufUtil.toMutationNoData( MutationType.INCREMENT, i, mutationBuilder, action.getNonce()))); } else if (row instanceof RegionCoprocessorServiceExec) { RegionCoprocessorServiceExec exec = (RegionCoprocessorServiceExec) row; // DUMB COPY!!! FIX!!! Done to copy from c.g.p.ByteString to shaded ByteString. org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString value = org.apache.hadoop.hbase.shaded.com.google.protobuf.UnsafeByteOperations.unsafeWrap( exec.getRequest().toByteArray()); if (cpBuilder == null) { cpBuilder = ClientProtos.CoprocessorServiceCall.newBuilder(); } else { cpBuilder.clear(); } builder.addAction(actionBuilder.setServiceCall( cpBuilder.setRow(UnsafeByteOperations.unsafeWrap(exec.getRow())) .setServiceName(exec.getMethod().getService().getFullName()) .setMethodName(exec.getMethod().getName()) .setRequest(value))); } else if (row instanceof RowMutations) { throw new UnsupportedOperationException("No RowMutations in multi calls; use mutateRow"); } else { throw new DoNotRetryIOException("Multi doesn't support " + row.getClass().getName()); } } return builder; } // End utilities for Client //Start utilities for Admin /** * Create a protocol buffer GetRegionInfoRequest for a given region name * * @param regionName the name of the region to get info * @return a protocol buffer GetRegionInfoRequest */ public static GetRegionInfoRequest buildGetRegionInfoRequest(final byte[] regionName) { return buildGetRegionInfoRequest(regionName, false); } /** * Create a protocol buffer GetRegionInfoRequest for a given region name * * @param regionName the name of the region to get info * @param includeCompactionState indicate if the compaction state is requested * @return a protocol buffer GetRegionInfoRequest */ public static GetRegionInfoRequest buildGetRegionInfoRequest(final byte[] regionName, final boolean includeCompactionState) { GetRegionInfoRequest.Builder builder = GetRegionInfoRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); if (includeCompactionState) { builder.setCompactionState(includeCompactionState); } return builder.build(); } /** * Create a protocol buffer GetRegionLoadRequest for all regions/regions of a table. * * @param tableName the table for which regionLoad should be obtained from RS * @return a protocol buffer GetRegionLoadRequest */ public static GetRegionLoadRequest buildGetRegionLoadRequest(final TableName tableName) { GetRegionLoadRequest.Builder builder = GetRegionLoadRequest.newBuilder(); if (tableName != null) { builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); } return builder.build(); } /** * Create a protocol buffer GetOnlineRegionRequest * * @return a protocol buffer GetOnlineRegionRequest */ public static GetOnlineRegionRequest buildGetOnlineRegionRequest() { return GetOnlineRegionRequest.newBuilder().build(); } /** * Create a protocol buffer FlushRegionRequest for a given region name * * @param regionName the name of the region to get info * @return a protocol buffer FlushRegionRequest */ public static FlushRegionRequest buildFlushRegionRequest(final byte[] regionName) { return buildFlushRegionRequest(regionName, false); } /** * Create a protocol buffer FlushRegionRequest for a given region name * * @param regionName the name of the region to get info * @return a protocol buffer FlushRegionRequest */ public static FlushRegionRequest buildFlushRegionRequest(final byte[] regionName, boolean writeFlushWALMarker) { FlushRegionRequest.Builder builder = FlushRegionRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); builder.setWriteFlushWalMarker(writeFlushWALMarker); return builder.build(); } /** * Create a protocol buffer OpenRegionRequest to open a list of regions * * @param server the serverName for the RPC * @param regionOpenInfos info of a list of regions to open * @param openForReplay * @return a protocol buffer OpenRegionRequest */ public static OpenRegionRequest buildOpenRegionRequest(ServerName server, final List<Pair<HRegionInfo, List<ServerName>>> regionOpenInfos, Boolean openForReplay) { OpenRegionRequest.Builder builder = OpenRegionRequest.newBuilder(); for (Pair<HRegionInfo, List<ServerName>> regionOpenInfo: regionOpenInfos) { builder.addOpenInfo(buildRegionOpenInfo(regionOpenInfo.getFirst(), regionOpenInfo.getSecond(), openForReplay)); } if (server != null) { builder.setServerStartCode(server.getStartcode()); } // send the master's wall clock time as well, so that the RS can refer to it builder.setMasterSystemTime(EnvironmentEdgeManager.currentTime()); return builder.build(); } /** * Create a protocol buffer OpenRegionRequest for a given region * * @param server the serverName for the RPC * @param region the region to open * @param favoredNodes * @param openForReplay * @return a protocol buffer OpenRegionRequest */ public static OpenRegionRequest buildOpenRegionRequest(ServerName server, final HRegionInfo region, List<ServerName> favoredNodes, Boolean openForReplay) { OpenRegionRequest.Builder builder = OpenRegionRequest.newBuilder(); builder.addOpenInfo(buildRegionOpenInfo(region, favoredNodes, openForReplay)); if (server != null) { builder.setServerStartCode(server.getStartcode()); } builder.setMasterSystemTime(EnvironmentEdgeManager.currentTime()); return builder.build(); } /** * Create a protocol buffer UpdateFavoredNodesRequest to update a list of favorednode mappings * @param updateRegionInfos * @return a protocol buffer UpdateFavoredNodesRequest */ public static UpdateFavoredNodesRequest buildUpdateFavoredNodesRequest( final List<Pair<HRegionInfo, List<ServerName>>> updateRegionInfos) { UpdateFavoredNodesRequest.Builder ubuilder = UpdateFavoredNodesRequest.newBuilder(); if (updateRegionInfos != null && !updateRegionInfos.isEmpty()) { RegionUpdateInfo.Builder builder = RegionUpdateInfo.newBuilder(); for (Pair<HRegionInfo, List<ServerName>> pair : updateRegionInfos) { builder.setRegion(HRegionInfo.convert(pair.getFirst())); for (ServerName server : pair.getSecond()) { builder.addFavoredNodes(ProtobufUtil.toServerName(server)); } ubuilder.addUpdateInfo(builder.build()); builder.clear(); } } return ubuilder.build(); } /** * Create a WarmupRegionRequest for a given region name * * @param regionInfo Region we are warming up */ public static WarmupRegionRequest buildWarmupRegionRequest(final HRegionInfo regionInfo) { WarmupRegionRequest.Builder builder = WarmupRegionRequest.newBuilder(); builder.setRegionInfo(HRegionInfo.convert(regionInfo)); return builder.build(); } /** * Create a CompactRegionRequest for a given region name * * @param regionName the name of the region to get info * @param major indicator if it is a major compaction * @return a CompactRegionRequest */ public static CompactRegionRequest buildCompactRegionRequest( final byte[] regionName, final boolean major, final byte [] family) { CompactRegionRequest.Builder builder = CompactRegionRequest.newBuilder(); RegionSpecifier region = buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); builder.setRegion(region); builder.setMajor(major); if (family != null) { builder.setFamily(UnsafeByteOperations.unsafeWrap(family)); } return builder.build(); } /** * @see {@link #buildRollWALWriterRequest()} */ private static RollWALWriterRequest ROLL_WAL_WRITER_REQUEST = RollWALWriterRequest.newBuilder().build(); /** * Create a new RollWALWriterRequest * * @return a ReplicateWALEntryRequest */ public static RollWALWriterRequest buildRollWALWriterRequest() { return ROLL_WAL_WRITER_REQUEST; } /** * @see {@link #buildGetServerInfoRequest()} */ private static GetServerInfoRequest GET_SERVER_INFO_REQUEST = GetServerInfoRequest.newBuilder().build(); /** * Create a new GetServerInfoRequest * * @return a GetServerInfoRequest */ public static GetServerInfoRequest buildGetServerInfoRequest() { return GET_SERVER_INFO_REQUEST; } /** * Create a new StopServerRequest * * @param reason the reason to stop the server * @return a StopServerRequest */ public static StopServerRequest buildStopServerRequest(final String reason) { StopServerRequest.Builder builder = StopServerRequest.newBuilder(); builder.setReason(reason); return builder.build(); } //End utilities for Admin /** * Convert a byte array to a protocol buffer RegionSpecifier * * @param type the region specifier type * @param value the region specifier byte array value * @return a protocol buffer RegionSpecifier */ public static RegionSpecifier buildRegionSpecifier( final RegionSpecifierType type, final byte[] value) { RegionSpecifier.Builder regionBuilder = RegionSpecifier.newBuilder(); regionBuilder.setValue(UnsafeByteOperations.unsafeWrap(value)); regionBuilder.setType(type); return regionBuilder.build(); } /** * Create a protocol buffer Condition * * @param row * @param family * @param qualifier * @param comparator * @param compareType * @return a Condition * @throws IOException */ private static Condition buildCondition(final byte[] row, final byte[] family, final byte[] qualifier, final ByteArrayComparable comparator, final CompareType compareType) throws IOException { Condition.Builder builder = Condition.newBuilder(); builder.setRow(UnsafeByteOperations.unsafeWrap(row)); builder.setFamily(UnsafeByteOperations.unsafeWrap(family)); builder.setQualifier(UnsafeByteOperations .unsafeWrap(qualifier == null ? HConstants.EMPTY_BYTE_ARRAY : qualifier)); builder.setComparator(ProtobufUtil.toComparator(comparator)); builder.setCompareType(compareType); return builder.build(); } /** * Create a protocol buffer AddColumnRequest * * @param tableName * @param column * @return an AddColumnRequest */ public static AddColumnRequest buildAddColumnRequest( final TableName tableName, final HColumnDescriptor column, final long nonceGroup, final long nonce) { AddColumnRequest.Builder builder = AddColumnRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); builder.setColumnFamilies(ProtobufUtil.convertToColumnFamilySchema(column)); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Create a protocol buffer DeleteColumnRequest * * @param tableName * @param columnName * @return a DeleteColumnRequest */ public static DeleteColumnRequest buildDeleteColumnRequest( final TableName tableName, final byte [] columnName, final long nonceGroup, final long nonce) { DeleteColumnRequest.Builder builder = DeleteColumnRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); builder.setColumnName(UnsafeByteOperations.unsafeWrap(columnName)); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Create a protocol buffer ModifyColumnRequest * * @param tableName * @param column * @return an ModifyColumnRequest */ public static ModifyColumnRequest buildModifyColumnRequest( final TableName tableName, final HColumnDescriptor column, final long nonceGroup, final long nonce) { ModifyColumnRequest.Builder builder = ModifyColumnRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); builder.setColumnFamilies(ProtobufUtil.convertToColumnFamilySchema(column)); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Create a protocol buffer MoveRegionRequest * * @param encodedRegionName * @param destServerName * @return A MoveRegionRequest * @throws DeserializationException */ public static MoveRegionRequest buildMoveRegionRequest( final byte [] encodedRegionName, final byte [] destServerName) throws DeserializationException { MoveRegionRequest.Builder builder = MoveRegionRequest.newBuilder(); builder.setRegion( buildRegionSpecifier(RegionSpecifierType.ENCODED_REGION_NAME,encodedRegionName)); if (destServerName != null) { builder.setDestServerName( ProtobufUtil.toServerName(ServerName.valueOf(Bytes.toString(destServerName)))); } return builder.build(); } public static MergeTableRegionsRequest buildMergeTableRegionsRequest( final byte[][] encodedNameOfdaughaterRegions, final boolean forcible, final long nonceGroup, final long nonce) throws DeserializationException { MergeTableRegionsRequest.Builder builder = MergeTableRegionsRequest.newBuilder(); for (int i = 0; i< encodedNameOfdaughaterRegions.length; i++) { builder.addRegion(buildRegionSpecifier( RegionSpecifierType.ENCODED_REGION_NAME, encodedNameOfdaughaterRegions[i])); } builder.setForcible(forcible); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } public static SplitTableRegionRequest buildSplitTableRegionRequest( final HRegionInfo regionInfo, final byte[] splitPoint, final long nonceGroup, final long nonce) { SplitTableRegionRequest.Builder builder = SplitTableRegionRequest.newBuilder(); builder.setRegionInfo(HRegionInfo.convert(regionInfo)); builder.setSplitRow(UnsafeByteOperations.unsafeWrap(splitPoint)); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Create a protocol buffer AssignRegionRequest * * @param regionName * @return an AssignRegionRequest */ public static AssignRegionRequest buildAssignRegionRequest(final byte [] regionName) { AssignRegionRequest.Builder builder = AssignRegionRequest.newBuilder(); builder.setRegion(buildRegionSpecifier(RegionSpecifierType.REGION_NAME,regionName)); return builder.build(); } /** * Creates a protocol buffer UnassignRegionRequest * * @param regionName * @param force * @return an UnassignRegionRequest */ public static UnassignRegionRequest buildUnassignRegionRequest( final byte [] regionName, final boolean force) { UnassignRegionRequest.Builder builder = UnassignRegionRequest.newBuilder(); builder.setRegion(buildRegionSpecifier(RegionSpecifierType.REGION_NAME,regionName)); builder.setForce(force); return builder.build(); } /** * Creates a protocol buffer OfflineRegionRequest * * @param regionName * @return an OfflineRegionRequest */ public static OfflineRegionRequest buildOfflineRegionRequest(final byte [] regionName) { OfflineRegionRequest.Builder builder = OfflineRegionRequest.newBuilder(); builder.setRegion(buildRegionSpecifier(RegionSpecifierType.REGION_NAME,regionName)); return builder.build(); } /** * Creates a protocol buffer DeleteTableRequest * * @param tableName * @return a DeleteTableRequest */ public static DeleteTableRequest buildDeleteTableRequest( final TableName tableName, final long nonceGroup, final long nonce) { DeleteTableRequest.Builder builder = DeleteTableRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Creates a protocol buffer TruncateTableRequest * * @param tableName name of table to truncate * @param preserveSplits True if the splits should be preserved * @return a TruncateTableRequest */ public static TruncateTableRequest buildTruncateTableRequest( final TableName tableName, final boolean preserveSplits, final long nonceGroup, final long nonce) { TruncateTableRequest.Builder builder = TruncateTableRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); builder.setPreserveSplits(preserveSplits); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Creates a protocol buffer EnableTableRequest * * @param tableName * @return an EnableTableRequest */ public static EnableTableRequest buildEnableTableRequest( final TableName tableName, final long nonceGroup, final long nonce) { EnableTableRequest.Builder builder = EnableTableRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName(tableName)); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Creates a protocol buffer DisableTableRequest * * @param tableName * @return a DisableTableRequest */ public static DisableTableRequest buildDisableTableRequest( final TableName tableName, final long nonceGroup, final long nonce) { DisableTableRequest.Builder builder = DisableTableRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Creates a protocol buffer CreateTableRequest * * @param hTableDesc * @param splitKeys * @return a CreateTableRequest */ public static CreateTableRequest buildCreateTableRequest( final TableDescriptor hTableDesc, final byte [][] splitKeys, final long nonceGroup, final long nonce) { CreateTableRequest.Builder builder = CreateTableRequest.newBuilder(); builder.setTableSchema(ProtobufUtil.convertToTableSchema(hTableDesc)); if (splitKeys != null) { for (byte [] splitKey : splitKeys) { builder.addSplitKeys(UnsafeByteOperations.unsafeWrap(splitKey)); } } builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Creates a protocol buffer ModifyTableRequest * * @param tableName * @param hTableDesc * @return a ModifyTableRequest */ public static ModifyTableRequest buildModifyTableRequest( final TableName tableName, final HTableDescriptor hTableDesc, final long nonceGroup, final long nonce) { ModifyTableRequest.Builder builder = ModifyTableRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); builder.setTableSchema(ProtobufUtil.convertToTableSchema(hTableDesc)); builder.setNonceGroup(nonceGroup); builder.setNonce(nonce); return builder.build(); } /** * Creates a protocol buffer GetSchemaAlterStatusRequest * * @param tableName * @return a GetSchemaAlterStatusRequest */ public static GetSchemaAlterStatusRequest buildGetSchemaAlterStatusRequest( final TableName tableName) { GetSchemaAlterStatusRequest.Builder builder = GetSchemaAlterStatusRequest.newBuilder(); builder.setTableName(ProtobufUtil.toProtoTableName((tableName))); return builder.build(); } /** * Creates a protocol buffer GetTableDescriptorsRequest * * @param tableNames * @return a GetTableDescriptorsRequest */ public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest( final List<TableName> tableNames) { GetTableDescriptorsRequest.Builder builder = GetTableDescriptorsRequest.newBuilder(); if (tableNames != null) { for (TableName tableName : tableNames) { builder.addTableNames(ProtobufUtil.toProtoTableName(tableName)); } } return builder.build(); } /** * Creates a protocol buffer GetTableDescriptorsRequest * * @param pattern The compiled regular expression to match against * @param includeSysTables False to match only against userspace tables * @return a GetTableDescriptorsRequest */ public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest(final Pattern pattern, boolean includeSysTables) { GetTableDescriptorsRequest.Builder builder = GetTableDescriptorsRequest.newBuilder(); if (pattern != null) builder.setRegex(pattern.toString()); builder.setIncludeSysTables(includeSysTables); return builder.build(); } /** * Creates a protocol buffer GetTableNamesRequest * * @param pattern The compiled regular expression to match against * @param includeSysTables False to match only against userspace tables * @return a GetTableNamesRequest */ public static GetTableNamesRequest buildGetTableNamesRequest(final Pattern pattern, boolean includeSysTables) { GetTableNamesRequest.Builder builder = GetTableNamesRequest.newBuilder(); if (pattern != null) builder.setRegex(pattern.toString()); builder.setIncludeSysTables(includeSysTables); return builder.build(); } /** * Creates a protocol buffer GetTableStateRequest * * @param tableName table to get request for * @return a GetTableStateRequest */ public static GetTableStateRequest buildGetTableStateRequest( final TableName tableName) { return GetTableStateRequest.newBuilder() .setTableName(ProtobufUtil.toProtoTableName(tableName)) .build(); } /** * Creates a protocol buffer GetTableDescriptorsRequest for a single table * * @param tableName the table name * @return a GetTableDescriptorsRequest */ public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest( final TableName tableName) { return GetTableDescriptorsRequest.newBuilder() .addTableNames(ProtobufUtil.toProtoTableName(tableName)) .build(); } /** * Creates a protocol buffer IsMasterRunningRequest * * @return a IsMasterRunningRequest */ public static IsMasterRunningRequest buildIsMasterRunningRequest() { return IsMasterRunningRequest.newBuilder().build(); } /** * Creates a protocol buffer BalanceRequest * * @return a BalanceRequest */ public static BalanceRequest buildBalanceRequest(boolean force) { return BalanceRequest.newBuilder().setForce(force).build(); } /** * Creates a protocol buffer SetBalancerRunningRequest * * @param on * @param synchronous * @return a SetBalancerRunningRequest */ public static SetBalancerRunningRequest buildSetBalancerRunningRequest( boolean on, boolean synchronous) { return SetBalancerRunningRequest.newBuilder().setOn(on).setSynchronous(synchronous).build(); } /** * Creates a protocol buffer IsBalancerEnabledRequest * * @return a IsBalancerEnabledRequest */ public static IsBalancerEnabledRequest buildIsBalancerEnabledRequest() { return IsBalancerEnabledRequest.newBuilder().build(); } /** * @see {@link #buildGetClusterStatusRequest} */ private static final GetClusterStatusRequest GET_CLUSTER_STATUS_REQUEST = GetClusterStatusRequest.newBuilder().build(); /** * Creates a protocol buffer GetClusterStatusRequest * * @return A GetClusterStatusRequest */ public static GetClusterStatusRequest buildGetClusterStatusRequest() { return GET_CLUSTER_STATUS_REQUEST; } /** * @see {@link #buildCatalogScanRequest} */ private static final RunCatalogScanRequest CATALOG_SCAN_REQUEST = RunCatalogScanRequest.newBuilder().build(); /** * Creates a request for running a catalog scan * @return A {@link RunCatalogScanRequest} */ public static RunCatalogScanRequest buildCatalogScanRequest() { return CATALOG_SCAN_REQUEST; } /** * Creates a request for enabling/disabling the catalog janitor * @return A {@link EnableCatalogJanitorRequest} */ public static EnableCatalogJanitorRequest buildEnableCatalogJanitorRequest(boolean enable) { return EnableCatalogJanitorRequest.newBuilder().setEnable(enable).build(); } /** * @see {@link #buildIsCatalogJanitorEnabledRequest()} */ private static final IsCatalogJanitorEnabledRequest IS_CATALOG_JANITOR_ENABLED_REQUEST = IsCatalogJanitorEnabledRequest.newBuilder().build(); /** * Creates a request for querying the master whether the catalog janitor is enabled * @return A {@link IsCatalogJanitorEnabledRequest} */ public static IsCatalogJanitorEnabledRequest buildIsCatalogJanitorEnabledRequest() { return IS_CATALOG_JANITOR_ENABLED_REQUEST; } /** * @see {@link #buildCleanerChoreRequest} */ private static final RunCleanerChoreRequest CLEANER_CHORE_REQUEST = RunCleanerChoreRequest.newBuilder().build(); /** * Creates a request for running cleaner chore * @return A {@link RunCleanerChoreRequest} */ public static RunCleanerChoreRequest buildRunCleanerChoreRequest() { return CLEANER_CHORE_REQUEST; } /** * Creates a request for enabling/disabling the cleaner chore * @return A {@link SetCleanerChoreRunningRequest} */ public static SetCleanerChoreRunningRequest buildSetCleanerChoreRunningRequest(boolean on) { return SetCleanerChoreRunningRequest.newBuilder().setOn(on).build(); } /** * @see {@link #buildIsCleanerChoreEnabledRequest()} */ private static final IsCleanerChoreEnabledRequest IS_CLEANER_CHORE_ENABLED_REQUEST = IsCleanerChoreEnabledRequest.newBuilder().build(); /** * Creates a request for querying the master whether the cleaner chore is enabled * @return A {@link IsCleanerChoreEnabledRequest} */ public static IsCleanerChoreEnabledRequest buildIsCleanerChoreEnabledRequest() { return IS_CLEANER_CHORE_ENABLED_REQUEST; } /** * Creates a request for querying the master the last flushed sequence Id for a region * @param regionName * @return A {@link GetLastFlushedSequenceIdRequest} */ public static GetLastFlushedSequenceIdRequest buildGetLastFlushedSequenceIdRequest( byte[] regionName) { return GetLastFlushedSequenceIdRequest.newBuilder().setRegionName( UnsafeByteOperations.unsafeWrap(regionName)).build(); } /** * Create a RegionOpenInfo based on given region info and version of offline node */ private static RegionOpenInfo buildRegionOpenInfo( final HRegionInfo region, final List<ServerName> favoredNodes, Boolean openForReplay) { RegionOpenInfo.Builder builder = RegionOpenInfo.newBuilder(); builder.setRegion(HRegionInfo.convert(region)); if (favoredNodes != null) { for (ServerName server : favoredNodes) { builder.addFavoredNodes(ProtobufUtil.toServerName(server)); } } if(openForReplay != null) { builder.setOpenForDistributedLogReplay(openForReplay); } return builder.build(); } /** * Creates a protocol buffer NormalizeRequest * * @return a NormalizeRequest */ public static NormalizeRequest buildNormalizeRequest() { return NormalizeRequest.newBuilder().build(); } /** * Creates a protocol buffer IsNormalizerEnabledRequest * * @return a IsNormalizerEnabledRequest */ public static IsNormalizerEnabledRequest buildIsNormalizerEnabledRequest() { return IsNormalizerEnabledRequest.newBuilder().build(); } /** * Creates a protocol buffer SetNormalizerRunningRequest * * @param on * @return a SetNormalizerRunningRequest */ public static SetNormalizerRunningRequest buildSetNormalizerRunningRequest(boolean on) { return SetNormalizerRunningRequest.newBuilder().setOn(on).build(); } /** * Creates a protocol buffer IsSplitOrMergeEnabledRequest * * @param switchType see {@link org.apache.hadoop.hbase.client.MasterSwitchType} * @return a IsSplitOrMergeEnabledRequest */ public static IsSplitOrMergeEnabledRequest buildIsSplitOrMergeEnabledRequest( MasterSwitchType switchType) { IsSplitOrMergeEnabledRequest.Builder builder = IsSplitOrMergeEnabledRequest.newBuilder(); builder.setSwitchType(convert(switchType)); return builder.build(); } /** * Creates a protocol buffer SetSplitOrMergeEnabledRequest * * @param enabled switch is enabled or not * @param synchronous set switch sync? * @param switchTypes see {@link org.apache.hadoop.hbase.client.MasterSwitchType}, it is * a list. * @return a SetSplitOrMergeEnabledRequest */ public static SetSplitOrMergeEnabledRequest buildSetSplitOrMergeEnabledRequest(boolean enabled, boolean synchronous, MasterSwitchType... switchTypes) { SetSplitOrMergeEnabledRequest.Builder builder = SetSplitOrMergeEnabledRequest.newBuilder(); builder.setEnabled(enabled); builder.setSynchronous(synchronous); for (MasterSwitchType switchType : switchTypes) { builder.addSwitchTypes(convert(switchType)); } return builder.build(); } private static MasterProtos.MasterSwitchType convert(MasterSwitchType switchType) { switch (switchType) { case SPLIT: return MasterProtos.MasterSwitchType.SPLIT; case MERGE: return MasterProtos.MasterSwitchType.MERGE; default: break; } throw new UnsupportedOperationException("Unsupport switch type:" + switchType); } public static ReplicationProtos.AddReplicationPeerRequest buildAddReplicationPeerRequest( String peerId, ReplicationPeerConfig peerConfig) { AddReplicationPeerRequest.Builder builder = AddReplicationPeerRequest.newBuilder(); builder.setPeerId(peerId); builder.setPeerConfig(ReplicationSerDeHelper.convert(peerConfig)); return builder.build(); } public static ReplicationProtos.RemoveReplicationPeerRequest buildRemoveReplicationPeerRequest( String peerId) { RemoveReplicationPeerRequest.Builder builder = RemoveReplicationPeerRequest.newBuilder(); builder.setPeerId(peerId); return builder.build(); } public static ReplicationProtos.EnableReplicationPeerRequest buildEnableReplicationPeerRequest( String peerId) { EnableReplicationPeerRequest.Builder builder = EnableReplicationPeerRequest.newBuilder(); builder.setPeerId(peerId); return builder.build(); } public static ReplicationProtos.DisableReplicationPeerRequest buildDisableReplicationPeerRequest( String peerId) { DisableReplicationPeerRequest.Builder builder = DisableReplicationPeerRequest.newBuilder(); builder.setPeerId(peerId); return builder.build(); } public static GetReplicationPeerConfigRequest buildGetReplicationPeerConfigRequest( String peerId) { GetReplicationPeerConfigRequest.Builder builder = GetReplicationPeerConfigRequest.newBuilder(); builder.setPeerId(peerId); return builder.build(); } public static UpdateReplicationPeerConfigRequest buildUpdateReplicationPeerConfigRequest( String peerId, ReplicationPeerConfig peerConfig) { UpdateReplicationPeerConfigRequest.Builder builder = UpdateReplicationPeerConfigRequest .newBuilder(); builder.setPeerId(peerId); builder.setPeerConfig(ReplicationSerDeHelper.convert(peerConfig)); return builder.build(); } public static ListReplicationPeersRequest buildListReplicationPeersRequest(Pattern pattern) { ListReplicationPeersRequest.Builder builder = ListReplicationPeersRequest.newBuilder(); if (pattern != null) { builder.setRegex(pattern.toString()); } return builder.build(); } /** * Creates a protocol buffer CreateNamespaceRequest * @param descriptor * @return a CreateNamespaceRequest */ public static CreateNamespaceRequest buildCreateNamespaceRequest( final NamespaceDescriptor descriptor) { CreateNamespaceRequest.Builder builder = CreateNamespaceRequest.newBuilder(); builder.setNamespaceDescriptor(ProtobufUtil.toProtoNamespaceDescriptor(descriptor)); return builder.build(); } /** * Creates a protocol buffer ModifyNamespaceRequest * @param descriptor * @return a ModifyNamespaceRequest */ public static ModifyNamespaceRequest buildModifyNamespaceRequest( final NamespaceDescriptor descriptor) { ModifyNamespaceRequest.Builder builder = ModifyNamespaceRequest.newBuilder(); builder.setNamespaceDescriptor(ProtobufUtil.toProtoNamespaceDescriptor(descriptor)); return builder.build(); } /** * Creates a protocol buffer DeleteNamespaceRequest * @param name * @return a DeleteNamespaceRequest */ public static DeleteNamespaceRequest buildDeleteNamespaceRequest(final String name) { DeleteNamespaceRequest.Builder builder = DeleteNamespaceRequest.newBuilder(); builder.setNamespaceName(name); return builder.build(); } /** * Creates a protocol buffer GetNamespaceDescriptorRequest * @param name * @return a GetNamespaceDescriptorRequest */ public static GetNamespaceDescriptorRequest buildGetNamespaceDescriptorRequest(final String name) { GetNamespaceDescriptorRequest.Builder builder = GetNamespaceDescriptorRequest.newBuilder(); builder.setNamespaceName(name); return builder.build(); } public static ClearCompactionQueuesRequest buildClearCompactionQueuesRequest(Set<String> queues) { ClearCompactionQueuesRequest.Builder builder = ClearCompactionQueuesRequest.newBuilder(); for(String name: queues) { builder.addQueueName(name); } return builder.build(); } }