@@ -203,39 +203,78 @@ public static GetRequest buildGetRequest(final byte[] regionName,
203203 */
204204 public static MutateRequest buildMutateRequest (final byte [] regionName , final byte [] row ,
205205 final byte [] family , final byte [] qualifier , final CompareOperator op , final byte [] value ,
206- final Filter filter , final TimeRange timeRange , final Mutation mutation ) throws IOException {
207- return MutateRequest .newBuilder ()
208- .setRegion (buildRegionSpecifier (RegionSpecifierType .REGION_NAME , regionName ))
209- .setMutation (ProtobufUtil .toMutation (getMutationType (mutation ), mutation ))
206+ final Filter filter , final TimeRange timeRange , final Mutation mutation , long nonceGroup ,
207+ long nonce ) throws IOException {
208+ MutateRequest .Builder builder = MutateRequest .newBuilder ();
209+ if (mutation instanceof Increment || mutation instanceof Append ) {
210+ builder .setMutation (ProtobufUtil .toMutation (getMutationType (mutation ), mutation , nonce ))
211+ .setNonceGroup (nonceGroup );
212+ } else {
213+ builder .setMutation (ProtobufUtil .toMutation (getMutationType (mutation ), mutation ));
214+ }
215+ return builder .setRegion (buildRegionSpecifier (RegionSpecifierType .REGION_NAME , regionName ))
210216 .setCondition (buildCondition (row , family , qualifier , op , value , filter , timeRange ))
211217 .build ();
212218 }
213219
214220 /**
215- * Create a protocol buffer MutateRequest for conditioned row mutations
221+ * Create a protocol buffer MultiRequest for conditioned row mutations
216222 *
217- * @return a mutate request
223+ * @return a multi request
218224 * @throws IOException
219225 */
220- public static ClientProtos .MultiRequest buildMutateRequest (final byte [] regionName ,
226+ public static ClientProtos .MultiRequest buildMultiRequest (final byte [] regionName ,
221227 final byte [] row , final byte [] family , final byte [] qualifier ,
222228 final CompareOperator op , final byte [] value , final Filter filter , final TimeRange timeRange ,
223- final RowMutations rowMutations ) throws IOException {
229+ final RowMutations rowMutations , long nonceGroup , long nonce ) throws IOException {
230+ return buildMultiRequest (regionName , rowMutations , buildCondition (row , family , qualifier , op ,
231+ value , filter , timeRange ), nonceGroup , nonce );
232+ }
233+
234+ /**
235+ * Create a protocol buffer MultiRequest for row mutations
236+ *
237+ * @return a multi request
238+ */
239+ public static ClientProtos .MultiRequest buildMultiRequest (final byte [] regionName ,
240+ final RowMutations rowMutations , long nonceGroup , long nonce ) throws IOException {
241+ return buildMultiRequest (regionName , rowMutations , null , nonceGroup , nonce );
242+ }
243+
244+ private static ClientProtos .MultiRequest buildMultiRequest (final byte [] regionName ,
245+ final RowMutations rowMutations , final Condition condition , long nonceGroup , long nonce )
246+ throws IOException {
224247 RegionAction .Builder builder =
225- getRegionActionBuilderWithRegion (RegionAction .newBuilder (), regionName );
248+ getRegionActionBuilderWithRegion (RegionAction .newBuilder (), regionName );
226249 builder .setAtomic (true );
250+
251+ boolean hasNonce = false ;
227252 ClientProtos .Action .Builder actionBuilder = ClientProtos .Action .newBuilder ();
228253 MutationProto .Builder mutationBuilder = MutationProto .newBuilder ();
229254 for (Mutation mutation : rowMutations .getMutations ()) {
230255 mutationBuilder .clear ();
231- MutationProto mp = ProtobufUtil .toMutation (getMutationType (mutation ), mutation ,
232- mutationBuilder );
256+ MutationProto mp ;
257+ if (mutation instanceof Increment || mutation instanceof Append ) {
258+ mp = ProtobufUtil .toMutation (getMutationType (mutation ), mutation , mutationBuilder , nonce );
259+ hasNonce = true ;
260+ } else {
261+ mp = ProtobufUtil .toMutation (getMutationType (mutation ), mutation , mutationBuilder );
262+ }
233263 actionBuilder .clear ();
234264 actionBuilder .setMutation (mp );
235265 builder .addAction (actionBuilder .build ());
236266 }
237- return ClientProtos .MultiRequest .newBuilder ().addRegionAction (builder .setCondition (
238- buildCondition (row , family , qualifier , op , value , filter , timeRange )).build ()).build ();
267+
268+ if (condition != null ) {
269+ builder .setCondition (condition );
270+ }
271+
272+ MultiRequest .Builder multiRequestBuilder = MultiRequest .newBuilder ();
273+ if (hasNonce ) {
274+ multiRequestBuilder .setNonceGroup (nonceGroup );
275+ }
276+
277+ return multiRequestBuilder .addRegionAction (builder .build ()).build ();
239278 }
240279
241280 /**
@@ -318,33 +357,6 @@ public static MutateRequest buildMutateRequest(
318357 return builder .build ();
319358 }
320359
321- /**
322- * Create a protocol buffer MultiRequest for row mutations.
323- * Does not propagate Action absolute position. Does not set atomic action on the created
324- * RegionAtomic. Caller should do that if wanted.
325- * @param regionName
326- * @param rowMutations
327- * @return a data-laden RegionMutation.Builder
328- * @throws IOException
329- */
330- public static RegionAction .Builder buildRegionAction (final byte [] regionName ,
331- final RowMutations rowMutations )
332- throws IOException {
333- RegionAction .Builder builder =
334- getRegionActionBuilderWithRegion (RegionAction .newBuilder (), regionName );
335- ClientProtos .Action .Builder actionBuilder = ClientProtos .Action .newBuilder ();
336- MutationProto .Builder mutationBuilder = MutationProto .newBuilder ();
337- for (Mutation mutation : rowMutations .getMutations ()) {
338- mutationBuilder .clear ();
339- MutationProto mp = ProtobufUtil .toMutation (getMutationType (mutation ), mutation ,
340- mutationBuilder );
341- actionBuilder .clear ();
342- actionBuilder .setMutation (mp );
343- builder .addAction (actionBuilder .build ());
344- }
345- return builder ;
346- }
347-
348360 public static RegionAction .Builder getRegionActionBuilderWithRegion (
349361 final RegionAction .Builder regionActionBuilder , final byte [] regionName ) {
350362 RegionSpecifier region = buildRegionSpecifier (RegionSpecifierType .REGION_NAME , regionName );
@@ -562,9 +574,6 @@ public static void buildNoDataRegionActions(final byte[] regionName,
562574 throw new DoNotRetryIOException ("Multi doesn't support " + row .getClass ().getName ());
563575 }
564576 }
565- if (!multiRequestBuilder .hasNonceGroup () && hasNonce ) {
566- multiRequestBuilder .setNonceGroup (nonceGroup );
567- }
568577 if (builder .getActionCount () > 0 ) {
569578 multiRequestBuilder .addRegionAction (builder .build ());
570579 }
@@ -578,8 +587,11 @@ public static void buildNoDataRegionActions(final byte[] regionName,
578587 builder .clear ();
579588 getRegionActionBuilderWithRegion (builder , regionName );
580589
581- buildNoDataRegionAction ((RowMutations ) action .getAction (), cells , builder , actionBuilder ,
582- mutationBuilder );
590+ boolean hasIncrementOrAppend = buildNoDataRegionAction ((RowMutations ) action .getAction (),
591+ cells , action .getNonce (), builder , actionBuilder , mutationBuilder );
592+ if (hasIncrementOrAppend ) {
593+ hasNonce = true ;
594+ }
583595 builder .setAtomic (true );
584596
585597 multiRequestBuilder .addRegionAction (builder .build ());
@@ -613,16 +625,21 @@ public static void buildNoDataRegionActions(final byte[] regionName,
613625 } else if (cam .getAction () instanceof Increment ) {
614626 actionBuilder .clear ();
615627 mutationBuilder .clear ();
616- buildNoDataRegionAction ((Increment ) cam .getAction (), cells , HConstants . NO_NONCE , builder ,
628+ buildNoDataRegionAction ((Increment ) cam .getAction (), cells , action . getNonce () , builder ,
617629 actionBuilder , mutationBuilder );
630+ hasNonce = true ;
618631 } else if (cam .getAction () instanceof Append ) {
619632 actionBuilder .clear ();
620633 mutationBuilder .clear ();
621- buildNoDataRegionAction ((Append ) cam .getAction (), cells , HConstants . NO_NONCE , builder ,
634+ buildNoDataRegionAction ((Append ) cam .getAction (), cells , action . getNonce () , builder ,
622635 actionBuilder , mutationBuilder );
636+ hasNonce = true ;
623637 } else if (cam .getAction () instanceof RowMutations ) {
624- buildNoDataRegionAction ((RowMutations ) cam .getAction (), cells , builder , actionBuilder ,
625- mutationBuilder );
638+ boolean hasIncrementOrAppend = buildNoDataRegionAction ((RowMutations ) cam .getAction (),
639+ cells , action .getNonce (), builder , actionBuilder , mutationBuilder );
640+ if (hasIncrementOrAppend ) {
641+ hasNonce = true ;
642+ }
626643 builder .setAtomic (true );
627644 } else {
628645 throw new DoNotRetryIOException ("CheckAndMutate doesn't support " +
@@ -635,6 +652,10 @@ public static void buildNoDataRegionActions(final byte[] regionName,
635652 // in the overall multiRequest.
636653 indexMap .put (multiRequestBuilder .getRegionActionCount () - 1 , action .getOriginalIndex ());
637654 }
655+
656+ if (!multiRequestBuilder .hasNonceGroup () && hasNonce ) {
657+ multiRequestBuilder .setNonceGroup (nonceGroup );
658+ }
638659 }
639660
640661 private static void buildNoDataRegionAction (final Put put , final List <CellScannable > cells ,
@@ -684,18 +705,29 @@ private static void buildNoDataRegionAction(final Append append,
684705 MutationType .APPEND , append , mutationBuilder , nonce )));
685706 }
686707
687- private static void buildNoDataRegionAction (final RowMutations rowMutations ,
688- final List <CellScannable > cells , final RegionAction .Builder regionActionBuilder ,
708+ /**
709+ * @return whether or not the rowMutations has a Increment or Append
710+ */
711+ private static boolean buildNoDataRegionAction (final RowMutations rowMutations ,
712+ final List <CellScannable > cells , long nonce , final RegionAction .Builder regionActionBuilder ,
689713 final ClientProtos .Action .Builder actionBuilder , final MutationProto .Builder mutationBuilder )
690714 throws IOException {
715+ boolean ret = false ;
691716 for (Mutation mutation : rowMutations .getMutations ()) {
692717 mutationBuilder .clear ();
693- MutationProto mp = ProtobufUtil .toMutationNoData (getMutationType (mutation ), mutation ,
694- mutationBuilder );
718+ MutationProto mp ;
719+ if (mutation instanceof Increment || mutation instanceof Append ) {
720+ mp = ProtobufUtil .toMutationNoData (getMutationType (mutation ), mutation , mutationBuilder ,
721+ nonce );
722+ ret = true ;
723+ } else {
724+ mp = ProtobufUtil .toMutationNoData (getMutationType (mutation ), mutation , mutationBuilder );
725+ }
695726 cells .add (mutation );
696727 actionBuilder .clear ();
697728 regionActionBuilder .addAction (actionBuilder .setMutation (mp ).build ());
698729 }
730+ return ret ;
699731 }
700732
701733 private static MutationType getMutationType (Mutation mutation ) {
0 commit comments