Thanks, I'm following now... I think adding the new method to the interface and throwing UnsupportedOperationException for 1_1_2, or using the original checkAndPut and implementing it in both services, would both be fine solutions.
I guess another variation might be to introduce the new method in the interface, but in the 1_1_2 implementation just delegate back to the original checkAndPut and ignore the timestamp, and document that it isn't used in that implementation. I don't love this, but it does allow both services to implement the functionality and still leverage the better solution for 2_x. On Thu, Apr 25, 2019 at 3:54 PM Shawn Weeks <swe...@weeksconsulting.us> wrote: > > Here is what I think the new checkAndPut or checkAndMutate method would look > like. This also shows what the new mutate api looks like. > > @Override > public boolean checkAndPut(String tableName, byte[] rowId, byte[] family, > byte[] qualifier, byte[] value, long timestamp, PutColumn column) throws > IOException { > try (final Table table = > connection.getTable(TableName.valueOf(tableName))) { > Put put = new Put(rowId); > put.addColumn( > column.getColumnFamily(), > column.getColumnQualifier(), > column.getBuffer()); > return table.checkAndMutate(rowId, > family).qualifier(qualifier).ifEquals(value).timeRange(TimeRange.at(timestamp)).thenPut(put); > } > } > > If the atomic guarantee for the original checkAndPut is good enough then > there is no reason I can't implement the atomic map cache for both versions > of HBase. > > Thanks > Shawn > > -----Original Message----- > From: Bryan Bende <bbe...@gmail.com> > Sent: Thursday, April 25, 2019 12:39 PM > To: dev@nifi.apache.org > Subject: Re: Adding HBase Support for AtomicDistributedMapCacheClient > > I'm not totally if would matter if there were changes in between, as long as > the current value is what we thought it was then the changes we are sending > back should be accurate as a replacement. As a simplified scenario, if the > current value is 1 and thread-A retrieves that value, thread-B then changes > it to 2 and back to 1 before thread-A can do anything, then thread-A sends in > 2 with a previous of 1, that is still the correct replacement. > > I can see the argument for using the timestamp though... can you show the > method signature of the new checkAndMutate method that would need to be added > to the client service, and also which method of the HBase client it needs to > call? > > Just so I can get an idea of the differences between 1.x and 2.x. > > On Thu, Apr 25, 2019 at 1:00 PM Shawn Weeks <swe...@weeksconsulting.us> wrote: > > > > While checkAndPut is atomic as it's built now it doesn't support also > > checking the timestamp range which is included in the new checkAndMutate > > API. I had planned on using the cell's timestamp as the revision along with > > the value to ensure not only that the value hadn't been changed but that > > there hadn't been changes in between that just happened to put the value > > back. > > > > As I was looking at everything I had another question. Why is the cache > > currently using a scan instead of a get to fetch values from HBase. It > > seems like that would be much less performant considering we know the row > > key we're looking for. > > > > > > Thanks > > Shawn > > > > -----Original Message----- > > From: Bryan Bende <bbe...@gmail.com> > > Sent: Thursday, April 25, 2019 11:56 AM > > To: dev@nifi.apache.org > > Subject: Re: Adding HBase Support for AtomicDistributedMapCacheClient > > > > Can it not be done with the existing checkAndPut method? [1] > > > > I think if you use the value as the revision it should work. Would be > > similar to how the Redis implementation works [2]. > > > > [1] > > https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-stand > > ard-services/nifi-hbase-client-service-api/src/main/java/org/apache/ni > > fi/hbase/HBaseClientService.java#L65 > > [2] > > https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-redis > > -bundle/nifi-redis-extensions/src/main/java/org/apache/nifi/redis/serv > > ice/RedisDistributedMapCacheClientService.java#L271 > > > > On Thu, Apr 25, 2019 at 12:38 PM Shawn Weeks <swe...@weeksconsulting.us> > > wrote: > > > > > > I'll need to add a check and mutate method to the HBaseClientService > > > Interface, should I just extend with a HBase2ClientService or add > > > checkAndMutate to the existing interface and just make it raise an > > > exception if you try and use it against hbase 1? While Hbase 1.x supports > > > checkAndMutate it doesn't provide a way to filter on timestamp which is > > > part of how I was going to implement the revision requirement for > > > AtomicMapCache. > > > > > > Thanks > > > Shawn > > > > > > -----Original Message----- > > > From: Bryan Bende <bbe...@gmail.com> > > > Sent: Thursday, April 25, 2019 9:11 AM > > > To: dev@nifi.apache.org > > > Subject: Re: Adding HBase Support for > > > AtomicDistributedMapCacheClient > > > > > > I'm not aware of a JIRA, so I'd say go for it. > > > > > > On Wed, Apr 24, 2019 at 9:27 PM Shawn Weeks <swe...@weeksconsulting.us> > > > wrote: > > > > > > > > Seems like this should be fairly easy for HBase 2.x with the > > > > checkAndMutate functionality and I was wondering if there is already a > > > > Jira for this. Otherwise I might make an attempt at it. It would be > > > > good to be able to support Wait/Notify and other things that need > > > > AtomicDistributedMapCacheClient using an Apache developed product > > > > commonly found in a Hadoop Cluster. > > > > > > > > Thanks > > > > Shawn