Xuesen Liang created HBASE-29217: ------------------------------------ Summary: Enhancement for CheckAndMutate Key: HBASE-29217 URL: https://issues.apache.org/jira/browse/HBASE-29217 Project: HBase Issue Type: Improvement Components: Client, regionserver Reporter: Xuesen Liang Assignee: Xuesen Liang
The current implementation of _CheckAndMutate_ operation provides two conditional verification modes: 1. Column Non-exists: {code:java} ifMatches(family, qualifier, CompareOperator.EQUAL, null) {code} Validates that the specified column does not exist. 2. Column Value Comparison/Filter {code:java} ifMatches(family, qualifier, CompareOperator, value) {code} OR {code:java} ifMatches(Filter) {code} Verifies that the column exists and satisfies the defined comparison/filter logic. *Limitation:* The existing API lacks support for composite conditional checks of the form: _"Column X either does not exist, OR exists and meets comparison condition"._ *Current Workaround & Risks:* To implement this logic, developers must: {code:java} // Step 1: Check column absence checkAndMutate.ifMatches(family, qualifier, CompareOperator.EQUAL, null) // Step 2: Check value condition if Step 1 fails checkAndMutate.ifMatches(family, qualifier, CompareOperator, value) {code} This approach introduces following critical issues: * Non-atomic Execution: The two-phase check creates race conditions. * API Complexity: Forces developers to implement client-side synchronization logic. * Performance: There are two RPC calls. *Proposed Solution:* Introduce a composite conditional operator: {code:java} ifNotExistsOr(family, qualifier, CompareOperator, value) {code} *Implementation Benefits:* * Atomic Guarantee: Executes the "NOT EXISTS OR SATISFIES" logic in a single RPC call. * API Simplification: Reduces client-side code complexity. This enhancement would align HBase's conditional mutation capabilities with modern database systems supporting compound atomic predicates, while maintaining backward compatibility. -- This message was sent by Atlassian Jira (v8.20.10#820010)