[infinispan-dev] API behaviour when using DIST
Manik Surtani
manik at jboss.org
Tue Apr 21 06:49:51 EDT 2009
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
More information about the infinispan-dev
mailing list