saintstack commented on a change in pull request #1320: HBASE-8458 Support for
batch version of checkAndPut() and checkAndDel…
URL: https://github.com/apache/hbase/pull/1320#discussion_r397615457
##########
File path:
hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java
##########
@@ -665,23 +614,104 @@ public static void buildNoDataRegionActions(final
byte[] regionName,
// on the one row. We do separate RegionAction for each RowMutations.
// We maintain a map to keep track of this RegionAction and the original
Action index.
for (Action action : rowMutationsList) {
- RowMutations rms = (RowMutations) action.getAction();
- if (rowMutationsRegionActionBuilder == null) {
- rowMutationsRegionActionBuilder =
ClientProtos.RegionAction.newBuilder();
+ builder.clear();
+ getRegionActionBuilderWithRegion(builder, regionName);
+ actionBuilder.clear();
+ mutationBuilder.clear();
+
+ buildNoDataRegionAction((RowMutations) action.getAction(), cells,
builder, actionBuilder,
+ mutationBuilder);
+ builder.setAtomic(true);
+
+ multiRequestBuilder.addRegionAction(builder.build());
+
+ // This rowMutations region action is at
(multiRequestBuilder.getRegionActionCount() - 1)
+ // in the overall multiRequest.
+ indexMap.put(multiRequestBuilder.getRegionActionCount() - 1,
action.getOriginalIndex());
+ }
+
+ // Process CheckAndMutate here. Similar to RowMutations, we do separate
RegionAction for each
+ // CheckAndMutate and maintain a map to keep track of this RegionAction
and the original
+ // Action index.
+ for (Action action : checkAndMutates) {
+ builder.clear();
+ getRegionActionBuilderWithRegion(builder, regionName);
+ actionBuilder.clear();
+ mutationBuilder.clear();
+
+ CheckAndMutate cam = (CheckAndMutate) action.getAction();
+ builder.setCondition(buildCondition(cam.getRow(), cam.getFamily(),
cam.getQualifier(),
+ cam.getCompareOp(), cam.getValue(), cam.getFilter(),
cam.getTimeRange()));
+
+ if (cam.getAction() instanceof Put) {
+ buildNoDataRegionAction((Put) cam.getAction(), cells, builder,
actionBuilder,
+ mutationBuilder);
+ } else if (cam.getAction() instanceof Delete) {
+ buildNoDataRegionAction((Delete) cam.getAction(), cells, builder,
actionBuilder,
+ mutationBuilder);
+ } else if (cam.getAction() instanceof RowMutations) {
+ buildNoDataRegionAction((RowMutations) cam.getAction(), cells,
builder, actionBuilder,
+ mutationBuilder);
+ builder.setAtomic(true);
} else {
- rowMutationsRegionActionBuilder.clear();
+ throw new DoNotRetryIOException("CheckAndMutate doesn't support " +
+ cam.getAction().getClass().getName());
}
- rowMutationsRegionActionBuilder.setRegion(
- RequestConverter.buildRegionSpecifier(RegionSpecifierType.REGION_NAME,
regionName));
- rowMutationsRegionActionBuilder =
RequestConverter.buildNoDataRegionAction(regionName, rms,
- cells, rowMutationsRegionActionBuilder, actionBuilder,
mutationBuilder);
- rowMutationsRegionActionBuilder.setAtomic(true);
- // Put it in the multiRequestBuilder
-
multiRequestBuilder.addRegionAction(rowMutationsRegionActionBuilder.build());
- // This rowMutations region action is at
(multiRequestBuilder.getRegionActionCount() - 1)
+
+ multiRequestBuilder.addRegionAction(builder.build());
+
+ // This CheckAndMutate region action is at
(multiRequestBuilder.getRegionActionCount() - 1)
// in the overall multiRequest.
- rowMutationsIndexMap.put(multiRequestBuilder.getRegionActionCount() - 1,
- action.getOriginalIndex());
+ indexMap.put(multiRequestBuilder.getRegionActionCount() - 1,
action.getOriginalIndex());
+ }
+ }
+
+ private static void buildNoDataRegionAction(final Put put, final
List<CellScannable> cells,
+ final RegionAction.Builder regionActionBuilder,
+ final ClientProtos.Action.Builder actionBuilder,
+ final MutationProto.Builder mutationBuilder) throws IOException {
+ cells.add(put);
+ regionActionBuilder.addAction(actionBuilder.
+ setMutation(ProtobufUtil.toMutationNoData(MutationType.PUT, put,
mutationBuilder)));
+ }
+
+ private static void buildNoDataRegionAction(final Delete delete,
+ final List<CellScannable> cells, final RegionAction.Builder
regionActionBuilder,
+ final ClientProtos.Action.Builder actionBuilder, final
MutationProto.Builder mutationBuilder)
+ throws IOException {
+ int size = delete.size();
+ // Note that a legitimate Delete may have a size of zero; i.e. a Delete
that has nothing
+ // in it but the row to delete. In this case, the current implementation
does not make
+ // a KeyValue to represent a delete-of-all-the-row until we serialize...
For such cases
+ // where the size returned is zero, we will send the Delete fully pb'd
rather than have
+ // metadata only in the pb and then send the kv along the side in cells.
+ if (size > 0) {
+ cells.add(delete);
+ regionActionBuilder.addAction(actionBuilder.
+ setMutation(ProtobufUtil.toMutationNoData(MutationType.DELETE, delete,
mutationBuilder)));
+ } else {
+ regionActionBuilder.addAction(actionBuilder.
+ setMutation(ProtobufUtil.toMutation(MutationType.DELETE, delete,
mutationBuilder)));
+ }
+ }
+
+ private static void buildNoDataRegionAction(final RowMutations rowMutations,
+ final List<CellScannable> cells, final RegionAction.Builder
regionActionBuilder,
+ final ClientProtos.Action.Builder actionBuilder, final
MutationProto.Builder mutationBuilder)
+ throws IOException {
+ for (Mutation mutation: rowMutations.getMutations()) {
+ MutationType type;
+ if (mutation instanceof Put) {
+ type = MutationType.PUT;
+ } else if (mutation instanceof Delete) {
+ type = MutationType.DELETE;
+ } else {
+ throw new DoNotRetryIOException("RowMutations supports only put and
delete, not " +
+ mutation.getClass().getName());
+ }
+ MutationProto mp = ProtobufUtil.toMutationNoData(type, mutation,
mutationBuilder);
+ cells.add(mutation);
+ regionActionBuilder.addAction(actionBuilder.setMutation(mp).build());
}
}
Review comment:
Argh. The old code was hard to decipher.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services