Email summary:
Number of lines: 188
Number of useful lines (Strict): 1 (0,53%)
Number of useful line (contextual): 12 (6.3%)
Position of the useful line in the amount of data: 57 (had to scroll 30% of the 
data to find it and the addition 70% as I was not sure another one wasn't lost 
somewhere later)

I'm sure one can do better than that.

On 5 juil. 2011, at 15:15, Sanne Grinovero wrote:

> 2011/7/5 Galder Zamarreño <gal...@redhat.com>:
>> 
>> On Jul 5, 2011, at 11:46 AM, Sanne Grinovero wrote:
>> 
>>> 2011/7/5 Galder Zamarreño <gal...@redhat.com>:
>>>> 
>>>> 
>>>> On Jul 4, 2011, at 11:25 AM, Sanne Grinovero wrote:
>>>> 
>>>>> I agree they don't make sense, but only in the sense of exposed API
>>>>> during a transaction: some time ago I admit I was expecting them to
>>>>> just work: the API is there, nice public methods in the public
>>>>> interface with javadocs explaining that that was exactly what I was
>>>>> looking for, no warnings, no failures. Even worse, all works fine when
>>>>> running a local test because how the locks currently work they are
>>>>> acquired locally first, so unless you're running such a test in DIST
>>>>> mode, and happen to be *not* the owner of the being tested key, people
>>>>> won't even notice that this is not supported.
>>>>> 
>>>>> Still being able to use them is very important, also in combination
>>>>> with transactions: I might be running blocks of transactional code
>>>>> (like a CRUD operation via OGM) and still require to advance a
>>>>> sequence for primary key generation. This needs to be an atomic
>>>>> operation, and I should really not forget to suspend the transaction.
>>>> 
>>>> Fair point. At first glance, the best way to deal with this is suspending 
>>>> the tx cos that guarantees the API contract while not forcing locks to be 
>>>> acquired for too long.
>>>> 
>>>> I'd advice though that whoever works on this though needs to go over 
>>>> existing use cases and see if the end result could differ somehow if this 
>>>> change gets applied. If any divergences are found and are to be expected, 
>>>> these need to be thoroughly documented.
>>>> 
>>>> I've gone through some cases and end results would not differ at first 
>>>> glance if the atomic ops suspend the txs. The only thing that would change 
>>>> would be the expectations of lock acquisition timeouts by atomic ops 
>>>> within txs.
>>>> 
>>>> For example:
>>>> 
>>>> Cache contains: k1=galder
>>>> 
>>>> 1. Tx1 does a cache.replace(k1, "galder", "sanne") -> suspends tx and 
>>>> applies change -> k1=sanne now
>>>> 2. Tx2 does a cache.replace(k1, "galder", "manik") -> suspends tx and is 
>>>> not able to apply change
>>>> 3. Tx2 commits
>>>> 4. Tx1 commits
>>>> End result: k1=sanne
>>> 
>>> Right.
>>> To clarify, this is what would happen with the current implementation:
>>> 
>>> 1. Tx2 does a cache.get(k1) -> it reads the value of k1, and is
>>> returned "galder"
>>> 2. Tx1 does a cache.replace(k1, "galder", "sanne") -> k1="sanne" in
>>> the scope of this transaction, but not seen by other tx
>>> 3. Tx2 does a cache.replace(k1, "galder", "manik") -> k1="manik" is
>>> assigned, as because of repeatable read we're still seeing "galder"
>>> 4. Tx2  & Tx1 commit
>>> 
>>> ..and the end result depends on who commits first.
>> 
>> The sequence of events above is what I suppose would happen with the 
>> suspended tx mode, not the current impl
> 
> thanks, I just felt the need to double check we where on the same page.
> 
>>>> 1. Tx1 does a cache.replace(k1, "galder", "sanne") -> acquires lock
>>>> 2. Tx2 does a cache.replace(k1, "galder", "manik") -> waits for lock
>>>> 3. Tx2 rollback -> times out acquiring lock
>>>> 4. Tx1 commits -> applies change
>>>> End result: k1=sanne
>>> 
>>> I'm not sure we're on the same line here. 1) should apply the
>>> operation right away, so even if it might very briefly have to acquire
>>> a lock on it, it's immediately released (not at the end of the
>>> transaction), so why would TX2 have to wait for it to the point it
>>> needs to rollback?
>> 
>> This is what I was trying to picture as current implementation. It's true 
>> that it should apply the operation, but it also acquires the lock, at least 
>> in local mode and the locks are only release at prepare/commit time.
>> 
>> Well, tx2 is trying to acquire a WL on a entry that's being modified by TX1. 
>> Here I'm assuming that Tx1 does 'something else' and so Tx2 times out 
>> waiting for the lock.
>> 
>>> 
>>> 
>>>> 
>>>>> 
>>>>> Sanne
>>>>> 
>>>>> 2011/7/4 Galder Zamarreño <gal...@redhat.com>:
>>>>>> Do these atomic operations really make sense within an (optimitic) 
>>>>>> transaction?
>>>>>> 
>>>>>> For example, putIfAbsent(): it stores a k,v pair if the key is not 
>>>>>> present. But the key about it's usability is that the return of 
>>>>>> putIfAbsent can tell you whether the put succeeded or not.
>>>>>> 
>>>>>> Once you go into transactions, the result is only valid once the 
>>>>>> transaction has been prepared unless the pessimistic locking as per 
>>>>>> definition in http://community.jboss.org/docs/DOC-16973 is in use, and 
>>>>>> that's already pretty confusing IMO.
>>>>>> 
>>>>>> I get the feeling that those atomic operations are particularly useful 
>>>>>> when transactions are not used cos they allow you to reduce to cache 
>>>>>> operations to one, hence avoiding the need to use a lock or synchronized 
>>>>>> block, or in our case, a transaction.
>>>>>> 
>>>>>> On Jun 30, 2011, at 3:11 PM, Sanne Grinovero wrote:
>>>>>> 
>>>>>>> Hello all,
>>>>>>> some team members had a meeting yesterday, one of the discussed
>>>>>>> subjects was about using atomic operations (putIfAbsent, etc..).
>>>>>>> Mircea just summarised it in the following proposal:
>>>>>>> 
>>>>>>> The atomic operations, as defined by the ConcurrentHashMap, don't fit
>>>>>>> well within the scope of optimistic transaction: this is because there
>>>>>>> is a discrepancy between the value returned by the operation and the
>>>>>>> value and the fact that the operation is applied or not:
>>>>>>> E.g. putIfAbsent(k, v) might return true as there's no entry for k in
>>>>>>> the scope of the current transaction, but in fact there might be a
>>>>>>> value committed by another transaction, hidden by the fact we're
>>>>>>> running in repeatable read mode.
>>>>>>> Later on, at prepare time when the same operation is applied on the
>>>>>>> node that actually holds k, it might not succeed as another
>>>>>>> transaction has updated k in between, but the return value of the
>>>>>>> method was already evaluated long before this point.
>>>>>>> In order to solve this problem, if an atomic operations happens within
>>>>>>> the scope of a transaction, Infinispan eagerly acquires a lock on the
>>>>>>> remote node. This locks is held for the entire duration of the
>>>>>>> transaction, and is an expensive lock as it involves an RPC. If
>>>>>>> keeping the lock remotely for potentially long time represents a
>>>>>>> problem, the user can suspend the running transaction and run the
>>>>>>> atomic operation out of transaction's scope, then resume the
>>>>>>> transaction.
>>>>>>> 
>>>>>>> 
>>>>>>> In addition to this, would would you think about adding a flag to
>>>>>>> these methods which acts as suspending the transaction just before and
>>>>>>> resuming it right after? I don't know what is the cost of suspending &
>>>>>>> resuming a transaction, but such a flag could optionally be optimized
>>>>>>> in future by just ignoring the current transaction instead of really
>>>>>>> suspending it, or apply other clever tricks we might come across.
>>>>>>> 
>>>>>>> I also think that we should discuss if such a behaviour should not be
>>>>>>> the default - anybody using an atomic operation is going to make some
>>>>>>> assumptions which are clearly incompatible with the transaction, so
>>>>>>> I'm wondering what is the path here to "least surprise" for default
>>>>>>> invocation.
>>>>>>> 
>>>>>>> Regards,
>>>>>>> Sanne
>>>>>>> _______________________________________________
>>>>>>> infinispan-dev mailing list
>>>>>>> infinispan-dev@lists.jboss.org
>>>>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>>> 
>>>>>> --
>>>>>> Galder Zamarreño
>>>>>> Sr. Software Engineer
>>>>>> Infinispan, JBoss Cache
>>>>>> 
>>>>>> 
>>>>>> _______________________________________________
>>>>>> infinispan-dev mailing list
>>>>>> infinispan-dev@lists.jboss.org
>>>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> infinispan-dev mailing list
>>>>> infinispan-dev@lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>> 
>>>> --
>>>> Galder Zamarreño
>>>> Sr. Software Engineer
>>>> Infinispan, JBoss Cache
>>>> 
>>>> 
>>>> _______________________________________________
>>>> infinispan-dev mailing list
>>>> infinispan-dev@lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>> 
>>> 
>>> _______________________________________________
>>> infinispan-dev mailing list
>>> infinispan-dev@lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>> 
>> --
>> Galder Zamarreño
>> Sr. Software Engineer
>> Infinispan, JBoss Cache
>> 
>> 
>> _______________________________________________
>> infinispan-dev mailing list
>> infinispan-dev@lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>> 
> 
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev


_______________________________________________
infinispan-dev mailing list
infinispan-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/infinispan-dev

Reply via email to