[ 
https://issues.apache.org/jira/browse/HBASE-8542?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrew Purtell resolved HBASE-8542.
-----------------------------------
    Resolution: Later

This proposal includes a big API departure for checkAndXXX including return of 
the original value. Might be useful someday if we have a volunteer to do the 
work. In the meantime we have HBASE-11796. Resolving this as Later.

> Need a more common and capable atomic row mutation
> --------------------------------------------------
>
>                 Key: HBASE-8542
>                 URL: https://issues.apache.org/jira/browse/HBASE-8542
>             Project: HBase
>          Issue Type: Improvement
>          Components: Client, regionserver
>    Affects Versions: 0.95.0
>            Reporter: Raymond Liu
>
> Hi
> For Atomic row mutation, currently , there are CheckAndPut/Delete and people 
> ask for more CheckAndMutation like API,  also Increment/IncrementColumnValue 
> are available. However there are a lot of limitation of these approaching. 
> Say :
> 1. The CheckAndMutation family can only check upon one value upon equal 
> condition and upon single column. This is quite limited, you probably want to 
> compare two column, or need more CompareOp (  for CompareOp, the lower level 
> code can support different CompareOp, we probably could export them to client 
> API level.)
> 2. The mutation can only be done upon success, do not have a fail branch to 
> perform another operation. In order to implement branching at client level , 
> you need to loop and check upon a serial different conditions and fall back 
> from the beginning upon anyone fails. Sometime even this loop approaching can 
> not full fill the requirements.
> 3. The CheckAndMutation don't return value, it's ok now, since it only do 
> mutation upon equal, while if you support more CompareOp, you have no way to 
> know what's the original value been changed.
> 4. Value can only be a constant one , could not reference other column
> 5. For ICV, well, it is only self referenced, could not check upon other 
> column and increase. Thus limit the usage.
> In HBASE-2322, it said "We provide a compare-and-swap primitive, which is 
> sufficient to achieve the same effect as row locks from the client side" But 
> I don't see this is easy and seems to me only ICV is compare and swap 
> primitve the others just do compare and set.
> To give a few example which I think are quite common simple cases, while 
> could not be easily satisfied now :
> Case 1:  SQL like INSERT ON DUPLICATE, you want to insert a new row if there 
> are no duplicate row exist, while you want to update some column if there are 
> already existing row.
> Case 2: Upon update/add/delete a row which have one size column employ the 
> value say 'S'/'M'/'L',  a count number also need to be updated according to 
> the size column. In order to achieve this, you need to get the old size value 
> to correctly figure out the count changes. Thus you need an atomic operation 
> for Get+Put on the size column ( though you could do this job by looping 
> through different value for check, just to figure out what the original value 
> it is. But we could surely do better than this. Say if you got hundreds of 
> status instead of three?)
> If you like , I am sure you can also think out more similar cases that you 
> require a more capable row mutation.
> Thus I am wondering, can we provide a common atomic row mutation API like :
> AtomicRowMutation( Map<KV, CompareOp> compare,  
> List<KV|Column>onSuccessMutation,  List<KV|Column>onFaileMutation,  
> Map<Column, beforeafterflag> ColumntoReturn)
> Well , I believe you expert surely could figure out API better than this.
> The point is that I guess this won't be very hard to been implemented since 
> in the current CheckAndMutation/Increment code path, most thing is available 
> and not much additional logic is needed. API like this one might not solve 
> all the issue  that people might ask for atomic row mutation ( and which 
> could be solved by the deprecated buggy rowLock). But I guess it can solve 
> majority of the mutation that involve a single row instead of cross row.  At 
> least for my own use cases.
> Any ideas?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to