Hi folks!

Could someone please review the following Jira and PR? Actually this
feature is important for our use case.

HBASE-8458 Support for batch version of checkAndMutate():
https://issues.apache.org/jira/browse/HBASE-8458

The RP:
https://github.com/apache/hbase/pull/1648

The highlights of the changes are as follows:

- Introduced CheckAndMutate class that's used to perform CheckAndMutate
operations. The following is the JavaDoc for this class:
```
* Used to perform CheckAndMutate operations. Currently {@link Put}, {@link
Delete}
* and {@link RowMutations} are supported.
* <p>
* This has a fluent style API to instantiate it, the code is like:
* <pre>
* <code>
* // A CheckAndMutate operation where do the specified action if the column
(specified by the
* // family and the qualifier) of the row equals to the specified value
* CheckAndMutate checkAndMutate = new CheckAndMutate(row)
*   .ifEquals(family, qualifier, value)
*   .action(put);
*
* // A CheckAndMutate operation where do the specified action if the column
(specified by the
* // family and the qualifier) of the row doesn't exist
* CheckAndMutate checkAndMutate = new CheckAndMutate(row)
*   .ifNotExists(family, qualifier)
*   .action(put);
*
* // A CheckAndMutate operation where do the specified action if the row
matches the filter
* CheckAndMutate checkAndMutate = new CheckAndMutate(row)
*   .ifMatches(filter)
*   .action(delete);
* </code>
* </pre>
```

- Added new checkAndMutate APIs to the Table and AsyncTable interfaces.

The APIs for the Table interface:
```
/**
  * checkAndMutate that atomically checks if a row matches the specified
condition. If it does,
  * it performs the specified action.
  *
  * @param checkAndMutate The CheckAndMutate object.
  * @return boolean that represents the result for the CheckAndMutate.
  * @throws IOException if a remote or network exception occurs.
  */
 default boolean checkAndMutate(CheckAndMutate checkAndMutate) throws
IOException {
   return checkAndMutate(Collections.singletonList(checkAndMutate))[0];
 }

 /**
  * Batch version of checkAndMutate.
  *
  * @param checkAndMutates The list of CheckAndMutate.
  * @return A array of boolean that represents the result for each
CheckAndMutate.
  * @throws IOException if a remote or network exception occurs.
  */
 default boolean[] checkAndMutate(List<CheckAndMutate> checkAndMutates)
throws IOException {
   throw new NotImplementedException("Add an implementation!");
 }
```

The APIs for the AsyncTable interface:
```
/**
 * checkAndMutate that atomically checks if a row matches the specified
condition. If it does,
 * it performs the specified action.
 *
 * @param checkAndMutate The CheckAndMutate object.
 * @return A {@link CompletableFuture}s that represent the result for the
CheckAndMutate.
 */
CompletableFuture<Boolean> checkAndMutate(CheckAndMutate checkAndMutate);

/**
 * Batch version of checkAndMutate.
 *
 * @param checkAndMutates The list of CheckAndMutate.
 * @return A list of {@link CompletableFuture}s that represent the result
for each
 *   CheckAndMutate.
 */
List<CompletableFuture<Boolean>> checkAndMutate(List<CheckAndMutate>
checkAndMutates);

/**
 * A simple version of batch checkAndMutate. It will fail if there are any
failures.
 *
 * @param checkAndMutates The list of rows to apply.
 * @return A {@link CompletableFuture} that wrapper the result boolean list.
 */
default CompletableFuture<List<Boolean>> checkAndMutateAll(
  List<CheckAndMutate> checkAndMutates) {
  return allOf(checkAndMutate(checkAndMutates));
}
```

- Deprecated the old checkAndMutate APIs of the Table and AsyncTable
interfaces.

- This has Protocol Buffers level changes. I moved MultiRequest#condition
to RegionAction and MultiResponse#processed to RegionActionResult. This is
already discussed in the Jira:
https://issues.apache.org/jira/browse/HBASE-8458?focusedCommentId=17064155&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17064155

Thanks,
Toshi

Reply via email to