[infinispan-dev] Unbalanced lock releases

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[infinispan-dev] Unbalanced lock releases

Sanne Grinovero
Hello all,
I am getting an "IllegalMonitorStateException" while Infinispan
attempts to release a lock it doesn't own, basically at:
org.infinispan.container.EntryFactoryImpl.wrapEntryForWriting(EntryFactoryImpl.java:178

(I was using SKIP_LOCKING, so lockAcquired is false at this point).
I tried to fix it introducing an "if (lockAcquired)" in line 178, but
then the situation seems worse:

In "LockManagerImpl", line 174, reads:

boolean needToUnlock = possiblyLocked(entry)

where the javadoc of possiblyLocked reads:

"Inspects the entry for signs that it is possibly locked, and hence
would need to be unlocked. Note that this is not deterministic, and is
pessimistic in that even if an entry is not locked but *might* be
locked, this will return true.
As such, this should only be used to determine whether *unlocking* is
necessary, not whether locking is necessary. Unlocking an entry that
has not been locked has no effect, so this is just an optimisation. "

Still, some assumption seems wrong here as I'm experiencing the
following stacktrace :

java.lang.IllegalMonitorStateException
        at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1239)
        at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:431)
        at org.infinispan.util.concurrent.locks.containers.AbstractStripedLockContainer.releaseLock(AbstractStripedLockContainer.java:97)
        at org.infinispan.util.concurrent.locks.LockManagerImpl.unlock(LockManagerImpl.java:111)
        at org.infinispan.util.concurrent.locks.LockManagerImpl.releaseLocks(LockManagerImpl.java:183)
        at org.infinispan.interceptors.LockingInterceptor.cleanupLocks(LockingInterceptor.java:407)
        at org.infinispan.interceptors.LockingInterceptor.cleanLocksAndRethrow(LockingInterceptor.java:412)
        at org.infinispan.interceptors.LockingInterceptor.visitReplaceCommand(LockingInterceptor.java:340)
        at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
        at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
        at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:132)
        at org.infinispan.commands.AbstractVisitor.visitReplaceCommand(AbstractVisitor.java:66)
        at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
        at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
        at org.infinispan.interceptors.TxInterceptor.enlistWriteAndInvokeNext(TxInterceptor.java:184)
        at org.infinispan.interceptors.TxInterceptor.visitReplaceCommand(TxInterceptor.java:142)
        at org.infinispan.interceptors.DistTxInterceptor.visitReplaceCommand(DistTxInterceptor.java:90)
        at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
        at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
        at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:87)
        at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:58)
        at org.infinispan.commands.AbstractVisitor.visitReplaceCommand(AbstractVisitor.java:66)
        at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
        at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:273)
        at org.infinispan.CacheDelegate.replace(CacheDelegate.java:475)
        at org.infinispan.CacheSupport.replace(CacheSupport.java:96)
        at org.infinispan.lucene.readlocks.DistributedSegmentReadLocker.acquireReadLock(DistributedSegmentReadLocker.java:146)
        at org.infinispan.lucene.readlocks.StressTestReadLocksTest$LockUser.run(StressTestReadLocksTest.java:74)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

It's totally possible that the exception wouldn't happen without my
"fix" mentioned above, but then I get the IllegalMonitorStateException
earlier.
Any hint?

I'm sharing my failing testcase on GitHub, branch
"IllegalMonitorStateException", forked from 4.2.x :
https://github.com/Sanne/infinispan/tree/IllegalMonitorStateException

Cheers,
Sanne
_______________________________________________
infinispan-dev mailing list
[hidden email]
https://lists.jboss.org/mailman/listinfo/infinispan-dev
Reply | Threaded
Open this post in threaded view
|

Re: [infinispan-dev] Unbalanced lock releases

Manik Surtani
Thanks for spotting this.  AbstractStripedLockContainer.releaseLock() should not throw this exception because of the very reason documented in possiblyLocked() - the contents of AbstractStripedLockContainer.releaseLock() should be wrapped in a try block and should catch and (maybe) log IMSE's.

Could you pls create a JIRA for this?  Should be a very simple fix.

On 3 Feb 2011, at 19:52, Sanne Grinovero wrote:

> Hello all,
> I am getting an "IllegalMonitorStateException" while Infinispan
> attempts to release a lock it doesn't own, basically at:
> org.infinispan.container.EntryFactoryImpl.wrapEntryForWriting(EntryFactoryImpl.java:178
>
> (I was using SKIP_LOCKING, so lockAcquired is false at this point).
> I tried to fix it introducing an "if (lockAcquired)" in line 178, but
> then the situation seems worse:
>
> In "LockManagerImpl", line 174, reads:
>
> boolean needToUnlock = possiblyLocked(entry)
>
> where the javadoc of possiblyLocked reads:
>
> "Inspects the entry for signs that it is possibly locked, and hence
> would need to be unlocked. Note that this is not deterministic, and is
> pessimistic in that even if an entry is not locked but *might* be
> locked, this will return true.
> As such, this should only be used to determine whether *unlocking* is
> necessary, not whether locking is necessary. Unlocking an entry that
> has not been locked has no effect, so this is just an optimisation. "
>
> Still, some assumption seems wrong here as I'm experiencing the
> following stacktrace :
>
> java.lang.IllegalMonitorStateException
> at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1239)
> at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:431)
> at org.infinispan.util.concurrent.locks.containers.AbstractStripedLockContainer.releaseLock(AbstractStripedLockContainer.java:97)
> at org.infinispan.util.concurrent.locks.LockManagerImpl.unlock(LockManagerImpl.java:111)
> at org.infinispan.util.concurrent.locks.LockManagerImpl.releaseLocks(LockManagerImpl.java:183)
> at org.infinispan.interceptors.LockingInterceptor.cleanupLocks(LockingInterceptor.java:407)
> at org.infinispan.interceptors.LockingInterceptor.cleanLocksAndRethrow(LockingInterceptor.java:412)
> at org.infinispan.interceptors.LockingInterceptor.visitReplaceCommand(LockingInterceptor.java:340)
> at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:132)
> at org.infinispan.commands.AbstractVisitor.visitReplaceCommand(AbstractVisitor.java:66)
> at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> at org.infinispan.interceptors.TxInterceptor.enlistWriteAndInvokeNext(TxInterceptor.java:184)
> at org.infinispan.interceptors.TxInterceptor.visitReplaceCommand(TxInterceptor.java:142)
> at org.infinispan.interceptors.DistTxInterceptor.visitReplaceCommand(DistTxInterceptor.java:90)
> at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:87)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:58)
> at org.infinispan.commands.AbstractVisitor.visitReplaceCommand(AbstractVisitor.java:66)
> at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
> at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:273)
> at org.infinispan.CacheDelegate.replace(CacheDelegate.java:475)
> at org.infinispan.CacheSupport.replace(CacheSupport.java:96)
> at org.infinispan.lucene.readlocks.DistributedSegmentReadLocker.acquireReadLock(DistributedSegmentReadLocker.java:146)
> at org.infinispan.lucene.readlocks.StressTestReadLocksTest$LockUser.run(StressTestReadLocksTest.java:74)
> at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> at java.lang.Thread.run(Thread.java:662)
>
> It's totally possible that the exception wouldn't happen without my
> "fix" mentioned above, but then I get the IllegalMonitorStateException
> earlier.
> Any hint?
>
> I'm sharing my failing testcase on GitHub, branch
> "IllegalMonitorStateException", forked from 4.2.x :
> https://github.com/Sanne/infinispan/tree/IllegalMonitorStateException
>
> Cheers,
> Sanne
> _______________________________________________
> infinispan-dev mailing list
> [hidden email]
> https://lists.jboss.org/mailman/listinfo/infinispan-dev

--
Manik Surtani
[hidden email]
twitter.com/maniksurtani

Lead, Infinispan
http://www.infinispan.org




_______________________________________________
infinispan-dev mailing list
[hidden email]
https://lists.jboss.org/mailman/listinfo/infinispan-dev
Reply | Threaded
Open this post in threaded view
|

Re: [infinispan-dev] Unbalanced lock releases

Sanne Grinovero
thanks,
created: URL: https://issues.jboss.org/browse/ISPN-919

2011/2/7 Manik Surtani <[hidden email]>:

> Thanks for spotting this.  AbstractStripedLockContainer.releaseLock() should not throw this exception because of the very reason documented in possiblyLocked() - the contents of AbstractStripedLockContainer.releaseLock() should be wrapped in a try block and should catch and (maybe) log IMSE's.
>
> Could you pls create a JIRA for this?  Should be a very simple fix.
>
> On 3 Feb 2011, at 19:52, Sanne Grinovero wrote:
>
>> Hello all,
>> I am getting an "IllegalMonitorStateException" while Infinispan
>> attempts to release a lock it doesn't own, basically at:
>> org.infinispan.container.EntryFactoryImpl.wrapEntryForWriting(EntryFactoryImpl.java:178
>>
>> (I was using SKIP_LOCKING, so lockAcquired is false at this point).
>> I tried to fix it introducing an "if (lockAcquired)" in line 178, but
>> then the situation seems worse:
>>
>> In "LockManagerImpl", line 174, reads:
>>
>> boolean needToUnlock = possiblyLocked(entry)
>>
>> where the javadoc of possiblyLocked reads:
>>
>> "Inspects the entry for signs that it is possibly locked, and hence
>> would need to be unlocked. Note that this is not deterministic, and is
>> pessimistic in that even if an entry is not locked but *might* be
>> locked, this will return true.
>> As such, this should only be used to determine whether *unlocking* is
>> necessary, not whether locking is necessary. Unlocking an entry that
>> has not been locked has no effect, so this is just an optimisation. "
>>
>> Still, some assumption seems wrong here as I'm experiencing the
>> following stacktrace :
>>
>> java.lang.IllegalMonitorStateException
>>       at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127)
>>       at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1239)
>>       at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:431)
>>       at org.infinispan.util.concurrent.locks.containers.AbstractStripedLockContainer.releaseLock(AbstractStripedLockContainer.java:97)
>>       at org.infinispan.util.concurrent.locks.LockManagerImpl.unlock(LockManagerImpl.java:111)
>>       at org.infinispan.util.concurrent.locks.LockManagerImpl.releaseLocks(LockManagerImpl.java:183)
>>       at org.infinispan.interceptors.LockingInterceptor.cleanupLocks(LockingInterceptor.java:407)
>>       at org.infinispan.interceptors.LockingInterceptor.cleanLocksAndRethrow(LockingInterceptor.java:412)
>>       at org.infinispan.interceptors.LockingInterceptor.visitReplaceCommand(LockingInterceptor.java:340)
>>       at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
>>       at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
>>       at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:132)
>>       at org.infinispan.commands.AbstractVisitor.visitReplaceCommand(AbstractVisitor.java:66)
>>       at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
>>       at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
>>       at org.infinispan.interceptors.TxInterceptor.enlistWriteAndInvokeNext(TxInterceptor.java:184)
>>       at org.infinispan.interceptors.TxInterceptor.visitReplaceCommand(TxInterceptor.java:142)
>>       at org.infinispan.interceptors.DistTxInterceptor.visitReplaceCommand(DistTxInterceptor.java:90)
>>       at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
>>       at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
>>       at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:87)
>>       at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:58)
>>       at org.infinispan.commands.AbstractVisitor.visitReplaceCommand(AbstractVisitor.java:66)
>>       at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
>>       at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:273)
>>       at org.infinispan.CacheDelegate.replace(CacheDelegate.java:475)
>>       at org.infinispan.CacheSupport.replace(CacheSupport.java:96)
>>       at org.infinispan.lucene.readlocks.DistributedSegmentReadLocker.acquireReadLock(DistributedSegmentReadLocker.java:146)
>>       at org.infinispan.lucene.readlocks.StressTestReadLocksTest$LockUser.run(StressTestReadLocksTest.java:74)
>>       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>       at java.lang.Thread.run(Thread.java:662)
>>
>> It's totally possible that the exception wouldn't happen without my
>> "fix" mentioned above, but then I get the IllegalMonitorStateException
>> earlier.
>> Any hint?
>>
>> I'm sharing my failing testcase on GitHub, branch
>> "IllegalMonitorStateException", forked from 4.2.x :
>> https://github.com/Sanne/infinispan/tree/IllegalMonitorStateException
>>
>> Cheers,
>> Sanne
>> _______________________________________________
>> infinispan-dev mailing list
>> [hidden email]
>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>
> --
> Manik Surtani
> [hidden email]
> twitter.com/maniksurtani
>
> Lead, Infinispan
> http://www.infinispan.org
>
>
>
>
> _______________________________________________
> infinispan-dev mailing list
> [hidden email]
> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>

_______________________________________________
infinispan-dev mailing list
[hidden email]
https://lists.jboss.org/mailman/listinfo/infinispan-dev