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