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