[infinispan-dev] API behaviour when using DIST

Bela Ban bban at redhat.com
Tue Apr 21 09:08:10 EDT 2009


Can't we reuse cacheMode (REPL_SYNC, REPL_ASYNC) ?

Manik Surtani wrote:
> And in terms of configuration - this is how I see it looking:
>
> <!-- This will allow you to use ASYNC with DIST -->
> <!-- If used with SYNC + DIST, it will optimise away the remote get 
> before a write -->
> <unsafe unreliableReturnValues="true" />
>
> <cluster mode="dist">
>   <async />
> </cluster>
>
> Reckon this is clear and intuitive enough for users?
>
> Cheers
> Manik
>
>
> On 21 Apr 2009, at 11:41, Manik Surtani wrote:
>
>> Ok, after discussing this on IRC and the clustering conf call, here 
>> is what we will do:
>>
>> 1.  Non-transactional
>>
>> * Only support DIST in SYNC mode.  Throw a configuration exception if 
>> DIST and ASYNC are detected.
>> * Allow DIST_ASYNC if an unsafe flag is set to true (breakApi=true?) 
>> in the config, so that the user is explicitly aware that API return 
>> values will be unreliable.
>> * Make sure this is documented in the Javadocs as well as the FAQs
>>
>> 2.  Transactional - Async
>>
>> * As above, do not support unless breakApi = true.  In which case 
>> this is simple - no return values, only broadcast modifications in 
>> prepare as we do with REPL_SYNC.
>>
>> 3.  Transactional - Sync
>>
>> * Offer 2 options here.  Option 1 is simple and we already have 
>> this.  Option 2 will need to be written.
>>
>> Option 1:  break API.  This will behave the same as async, in that we 
>> don't care about return values, but we still use a 2-phase commit 
>> protocol for the transaction boundary.  Users will still need to 
>> specify breakApi = true so this is explicit.
>>
>> Option 2: Before any write RPC call is broadcast, a remote get is 
>> performed.  This pulls back the necessary values so that a reliable 
>> return value is available.
>>
>> Cheers
>> Manik
>>
>> On 17 Apr 2009, at 12:18, Manik Surtani wrote:
>>
>>> This gets even more interesting when we have transactions in play.  
>>> E.g.:
>>>
>>> K resides on {A, B} in a cluster of {A, B, C}
>>>
>>> On C, we do:
>>>
>>> 1.  tx.begin()
>>> 2.  retval = C.replace(K, V, V2)
>>> 3.  // do something with retval
>>> 4.  tx.commit()
>>>
>>> It is one thing to set the expectation of unreliable return values 
>>> for async mode as defined below, but the above would be tricky even 
>>> in the case of sync mode.  On line 2 we would have to start the tx 
>>> on remote nodes and start processing the commands and pull back 
>>> results.  And on 4, the prepare logic would have to change to assume 
>>> that all writes have already been executed.
>>>
>>> On the plus side, this means we have txs that will fail fast(er) if 
>>> remote locks cannot be be acquired...
>>>
>>> Thoughts and comments?
>>>
>>> - Manik
>>>
>>> On 16 Apr 2009, at 14:33, Manik Surtani wrote:
>>>
>>>> Some of the API methods' return values may not be as expected when 
>>>> using DIST.  Just wanted to run this by you guys to see what you 
>>>> thought.
>>>>
>>>> Specifically, what I am referring to is methods like put(), 
>>>> putIfAbsent(), and the 2 versions of remove() and replace().
>>>>
>>>> Now when these are executed in any other cache mode (LOCAL, REPL, 
>>>> INVAL) return values are as expected from their java.util.Map 
>>>> contracts.
>>>>
>>>> However with DIST, there are 2 separate ways this could go.
>>>>
>>>> 1.  The key in question is mapped to the local cache on which the 
>>>> method is invoked.
>>>>
>>>> This case behaves normally as well as per the Map contract.
>>>>
>>>> 2.  The key in question is *not* mapped to the local cache.  E.g., 
>>>> K is mapped to nodes A and B, and on C we do C.remove().
>>>>
>>>> I can stick with the map contract if each of these methods first 
>>>> does a remote lookup of the key and stores this in L1 (or even in 
>>>> the invocation context and then throw it away if there is no L1) 
>>>> but this is unnecessarily wasteful IMO.
>>>>
>>>> The other approach is to realise the command pertains to a key for 
>>>> which the local cache is not the owner, and replicate the call to 
>>>> the remote nodes.
>>>>
>>>> What happens next is also a matter of tuning:  we could
>>>>
>>>> a) replicate + ignore responses.  Then the retval to these methods 
>>>> are indeterminate, and probably unusable.
>>>> b) replicate + wait for response.  This will adhere to the Map 
>>>> contract, albeit at a cost.  Probably not possible if we use 
>>>> DIST_ASYNC.
>>>> c) L1: we could either "correct" the L1 cache with the change, or 
>>>> remove the key forcing another lookup for the next time around.
>>>>
>>>> What do people think?  Maybe offer all strategies?  Or will this 
>>>> then become configuration hell?  :)
>>>>
>>>> Cheers
>>>> -- 
>>>> Manik Surtani
>>>> manik at jboss.org
>>>> Lead, Infinispan
>>>> Lead, JBoss Cache
>>>> http://www.infinispan.org
>>>> http://www.jbosscache.org
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> infinispan-dev mailing list
>>>> infinispan-dev at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>
>>> -- 
>>> Manik Surtani
>>> manik at jboss.org
>>> Lead, Infinispan
>>> Lead, JBoss Cache
>>> http://www.infinispan.org
>>> http://www.jbosscache.org
>>>
>>>
>>>
>>>
>>
>> -- 
>> Manik Surtani
>> manik at jboss.org
>> Lead, Infinispan
>> Lead, JBoss Cache
>> http://www.infinispan.org
>> http://www.jbosscache.org
>>
>>
>>
>>
>> _______________________________________________
>> infinispan-dev mailing list
>> infinispan-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>
> -- 
> Manik Surtani
> manik at jboss.org
> Lead, Infinispan
> Lead, JBoss Cache
> http://www.infinispan.org
> http://www.jbosscache.org
>
>
>
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev

-- 
Bela Ban
Lead JGroups / Clustering Team
JBoss - a division of Red Hat




More information about the infinispan-dev mailing list