There was this https://issues.apache.org/jira/browse/HBASE-4999 ticket for supporting atomic row level mutations based on generic constraints with some discussion on possible solution.
Jonathan - is there another jira that you were working on for a similar checkAndMutate functionality? Thanks, --Suraj On Thu, Nov 29, 2012 at 12:32 PM, Jonathan Hsieh <[email protected]> wrote: > The piece that I'm assuming from my previous comment is that the checks and > mutations are *all on the same row* and that all this happens *atomically*. > This is in line with Mike Spreitzer's earlier post. > > I'm hacking on something that needs to check two conditions and if > successful does some deletes and puts. > > Jon. > > On Thu, Nov 29, 2012 at 11:59 AM, Mike Spreitzer <[email protected]>wrote: > >> I would not suggest that a single composite operation should be able to >> access multiple rows. What I expect would be easy is an arbitrary set of >> accesses to one row. >> >> The use case is optimistic concurrency control. In scenarios where >> conflicts are rare, you can get reasonably efficient serializable >> transactions (where one transaction can do arbitrary pointwise accesses to >> a single row) by using a general test-and-set operation. There is some >> non-trivial stuff the client has to do, but a general single-row >> test-and-set is the only missing piece of HTable functionality. >> >> Mike >> >> >> >> From: Michel Segel <[email protected]> >> To: "[email protected]" <[email protected]> >> Cc: "[email protected]" <[email protected]> >> Date: 11/29/2012 02:46 PM >> Subject: Re: Why only check1-and-putMany and check1-and-deleteMany? >> >> >> >> Silly question... >> Why? >> >> I mean while it is technically feasible to do, can you come up with a use >> case and then show how it is better than the alternatives? >> >> >> >> Sent from a remote device. Please excuse any typos... >> >> Mike Segel >> >> On Nov 29, 2012, at 12:44 PM, Jonathan Hsieh <[email protected]> wrote: >> >> > Actually, I think we'd want to have repeated Conditions in to have >> multiple >> > check predicates, and would want to add repeated Conditions to multi >> > requests. >> > >> > This would let us have arbitrary number of checks and arbitrary number >> of >> > puts and deletes from an API point of view. >> > >> > Jon. >> > >> > On Mon, Nov 19, 2012 at 10:55 AM, Ted Yu <[email protected]> wrote: >> > >> >> Looking at hbase-server/src/main/protobuf/Client.proto in trunk, I >> tried >> >> the following formation to see if we can pass more than one qualifier: >> >> >> >> Index: hbase-server/src/main/protobuf/Client.proto >> >> =================================================================== >> >> --- hbase-server/src/main/protobuf/Client.proto (revision 1411337) >> >> +++ hbase-server/src/main/protobuf/Client.proto (working copy) >> >> @@ -97,7 +97,7 @@ >> >> message Condition { >> >> required bytes row = 1; >> >> required bytes family = 2; >> >> - required bytes qualifier = 3; >> >> + repeated bytes qualifier = 3; >> >> required CompareType compareType = 4; >> >> required Comparator comparator = 5; >> >> } >> >> >> >> protoc is able to compile the above code. >> >> This means we can potentially compare more than one qualifier in the >> check >> >> step. >> >> >> >> More discussion is needed to figure out the proper API which would be a >> >> superset of what we have today: >> >> public boolean checkAndPut(final byte [] row, >> >> final byte [] family, final byte [] qualifier, final byte [] >> value, >> >> final Put put) >> >> >> >> Cheers >> >> >> >> On Sat, Nov 17, 2012 at 10:28 PM, Mike Spreitzer <[email protected] >> >>> wrote: >> >> >> >>> I am not looking at the trunk. I am just a user looking at the >> interface >> >>> documented on the web site and wondering why the atomic composite >> >>> functionality is so limited. It is not hard to imagine an expanded >> >>> interface that allows checking an arbitrary set of columns and, if >> each >> >>> has a value specified for it, doing an arbitrary set of Mutations. >> >>> >> >>> Thanks, >> >>> Mike >> >>> >> >>> >> >>> >> >>> From: Ted Yu <[email protected]> >> >>> To: [email protected] >> >>> Date: 11/17/2012 11:44 PM >> >>> Subject: Re: Why only check1-and-putMany and >> >> check1-and-deleteMany? >> >>> >> >>> >> >>> >> >>> Are you looking at trunk code ? >> >>> >> >>> In trunk, take a look at HRegion.checkAndMutate() where you can >> specify >> >>> ByteArrayComparable which does the comparison (matching). >> >>> There is still the limit of single value: >> >>> } else if (result.size() == 1 && !valueIsNull) { >> >>> KeyValue kv = result.get(0); >> >>> >> >>> For the moment, only Put and Delete are supported: >> >>> >> >>> if (!isPut && !(w instanceof Delete)) >> >>> throw new DoNotRetryIOException("Action must be Put or Delete"); >> >>> If you have suggestion on how the check part can be more general, >> please >> >>> comment. >> >>> >> >>> Thanks >> >>> >> >>> On Sat, Nov 17, 2012 at 7:30 PM, Mike Spreitzer <[email protected]> >> >>> wrote: >> >>> >> >>>> If I understand correctly, an HTable has two composite atomic >> >>> operations, >> >>>> checkAndPut and checkAndDelete. The check part checks just a single >> >>>> column's value. Why not allow checking more than one column? >> >>>> >> >>>> Why no checkAndAppend? >> >>>> >> >>>> The checkAndPut operation can put to multiple columns, right? And >> the >> >>>> checkAndDelete operation can delete multiple columns, right? Why not >> >>> let >> >>>> them be mixed? Why not checkAndMutate? >> >>>> >> >>>> Thanks! >> >>>> Mike >> > >> > >> > >> > -- >> > // Jonathan Hsieh (shay) >> > // Software Engineer, Cloudera >> > // [email protected] >> >> >> > > > -- > // Jonathan Hsieh (shay) > // Software Engineer, Cloudera > // [email protected]
