[infinispan-dev] eager locking and deadlocks

Mircea Markus mircea.markus at jboss.com
Tue Jul 6 13:08:50 EDT 2010


On 6 Jul 2010, at 19:40, Manik Surtani wrote:

> 
> On 6 Jul 2010, at 16:06, Mircea Markus wrote:
> 
>> Hi,
>> 
>> Whit eager locking enabled, cache.put(k,v) acquires locks as follows:
>> 1. acquire local lock on k
>> 2. acquire remote lock on k
>> 3. if 2 fails release local lock on k
>> 
>> Previous sequence (i.e. local then remote) makes more sense to me than the reversed:
>> 1. acquire remote lock on k
>> 2. acquire local lock on k
>> 3. if 2 fails release remote lock on k 
>> 
>> This is because it doesn't make sense to go remotely just then to realise that you cannot acquire a local lock.
>> 
>> However, this approach does not work with deadlock detection[1] which requires the 2nd approach.
>> Here are my options:
>> 1. forbid deadlock detection on eager locking
>> 2. allow users to use deadlock detection with eager locking and if DLD is on to use the 2nd locking approach, otherwise to use the first one. 
>> 3.?
> 
> Would this not result in a very complex implementation though?
the InterceptorChainFactory would add a parameter to the LockInterceptor, a boolean value.
Then there would be an if in visitLockControlCommand.
The bit I don't know about is to rollback the remote lock acquisition if I cannot acquire it locally (remember remote lock is acquired when trying to acquire local one). Vladimir - do I have support for release a remote lock?   
> 
>> 
>> 2 is doable, and I think DLD might have a good impact on eager locking, as in this situation the transactions hold locks longer, hence the chance for deadlock is higher. 
>> 
>> Wdyt?
>> 
>> Cheers,
>> Mircea
>> 
>> [1] here is why:
>> tx1 and tx2 two transactions.
>> tx1 originates on node A, tx2 originates on node B
>> 
>> Step 1 (simultaneously):
>> tx1: A.put(k1) -> lock(tx1) = {A_k1, B_k1}
>> tx2: B.put(k2) -> lock(tx2) = {A_k2, B_k2}
>> 
>> Step 2:
>> tx1: A.put(k2) -> status(tx1) = Holds lock on {A_k1, B_k1} and tries to lock A_k2 
>> tx2: B.put(k1) -> status(tx2) = Holds lock on {A_k2, B_k2} and tries to lock A_k1
>> 
>> DLD on Tx1 cannot progress: it tries to lock A_k2 and cannot, it is aware that A_k2 is locked by tx2, but it doesn't know that tx2's intention is to lock A_k1(that would mean a deadlock). Why? because tx2 hasn't replicated its intention to the other node as it's waiting to acquire lock on A_k1.
>> Similar to Tx2.
>> 
>> 
>> 
>> 
>> _______________________________________________
>> 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




More information about the infinispan-dev mailing list