[
http://jira.jboss.com/jira/browse/JBCACHE-1103?page=all ]
Manik Surtani updated JBCACHE-1103:
-----------------------------------
Summary: Make cache loader implementations thread safe and remove synchronization in
CacheLoaderInterceptor and CacheStoreInterceptor (was: Potential deadlock with
ClusteredCacheLoader)
The title of this JIRA used to be "Potential deadlock with
ClusteredCacheLoader"
Renaming to be more in line with the solution, which is that CacheLoaderInterceptor and
CacheStoreInterceptor should not attempt to deal with concurrent access to Fqns in the
cche loader - the cache loader implementations themselves should be thread safe.
And as a part of solving the problem in the main description, the ClusteredCacheLoader
does not synchronize on Fqn.
Make cache loader implementations thread safe and remove
synchronization in CacheLoaderInterceptor and CacheStoreInterceptor
----------------------------------------------------------------------------------------------------------------------------
Key: JBCACHE-1103
URL:
http://jira.jboss.com/jira/browse/JBCACHE-1103
Project: JBoss Cache
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: Clustering, Cache loaders
Affects Versions: 1.4.1.SP3
Reporter: Brian Stansberry
Assigned To: Manik Surtani
Fix For: 1.4.1.SP4
Can occur if
1) Thread1 on node1 is trying to get(fqnA) which is not in-VM, so the CCL tries to do a
clustered get. The CacheLoaderInterceptor lock for fqnA is held at this time.
2) Thread1 blocks in FC waiting for credits.
3) Replication message for fqnA arrives from node2.
4) IncomingPacketHandler thread will block waiting for the CacheLoaderInterceptor lock
for fqnA.
5) FC credits cannot arrive, so we deadlock.
Stack traces below show this.
Thread: TP-Processor623 : priority:5, demon:true, threadId:1637,
threadState:TIMED_WAITING,
threadLockName:EDU.oswego.cs.dl.util.concurrent.CondVar@5947cf38
java.lang.Object.wait(Native Method)
EDU.oswego.cs.dl.util.concurrent.CondVar.timedwait(CondVar.java:222)
org.jgroups.protocols.FC.handleDownMessage(FC.java:454)
org.jgroups.protocols.FC.down(FC.java:374)
org.jgroups.stack.Protocol.receiveDownEvent(Protocol.java:499)
org.jgroups.protocols.FC.receiveDownEvent(FC.java:368)
org.jgroups.stack.Protocol.passDown(Protocol.java:533)
org.jgroups.protocols.FRAG2.down(FRAG2.java:167)
org.jgroups.stack.Protocol.receiveDownEvent(Protocol.java:499)
org.jgroups.stack.Protocol.passDown(Protocol.java:533)
org.jgroups.protocols.pbcast.STATE_TRANSFER.down(STATE_TRANSFER.java:294)
org.jgroups.stack.Protocol.receiveDownEvent(Protocol.java:499)
org.jgroups.stack.ProtocolStack.down(ProtocolStack.java:390)
org.jgroups.JChannel.down(JChannel.java:1231)
org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.down(MessageDispatcher.java:790)
org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.passDown(MessageDispatcher.java:767)
org.jgroups.blocks.RequestCorrelator.sendRequest(RequestCorrelator.java:308)
org.jgroups.blocks.GroupRequest.doExecute(GroupRequest.java:444)
org.jgroups.blocks.GroupRequest.execute(GroupRequest.java:193)
org.jgroups.blocks.MessageDispatcher.castMessage(MessageDispatcher.java:431)
org.jgroups.blocks.RpcDispatcher.callRemoteMethods(RpcDispatcher.java:192)
org.jgroups.blocks.RpcDispatcher.callRemoteMethods(RpcDispatcher.java:163)
org.jboss.cache.TreeCache.callRemoteMethodsViaReflection(TreeCache.java:4437)
org.jboss.cache.TreeCache.callRemoteMethods(TreeCache.java:4391)
org.jboss.cache.loader.ClusteredCacheLoader.callRemote(ClusteredCacheLoader.java:75)
org.jboss.cache.loader.ClusteredCacheLoader.get0(ClusteredCacheLoader.java:119)
org.jboss.cache.loader.ClusteredCacheLoader.get(ClusteredCacheLoader.java:113)
org.jboss.cache.interceptors.CacheLoaderInterceptor.loadData(CacheLoaderInterceptor.java:443)
org.jboss.cache.interceptors.CacheLoaderInterceptor.loadNode(CacheLoaderInterceptor.java:353)
org.jboss.cache.interceptors.CacheLoaderInterceptor.invoke(CacheLoaderInterceptor.java:180)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.UnlockInterceptor.invoke(UnlockInterceptor.java:32)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.ReplicationInterceptor.invoke(ReplicationInterceptor.java:39)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.CacheStoreInterceptor.invoke(CacheStoreInterceptor.java:135)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.TxInterceptor.handleNonTxMethod(TxInterceptor.java:365)
org.jboss.cache.interceptors.TxInterceptor.invoke(TxInterceptor.java:160)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.CacheMgmtInterceptor.invoke(CacheMgmtInterceptor.java:138)
org.jboss.cache.TreeCache.invokeMethod(TreeCache.java:5863)
org.jboss.cache.TreeCache.get(TreeCache.java:3627)
org.jboss.cache.TreeCache.get(TreeCache.java:3608)
org.jboss.cache.TreeCache.get(TreeCache.java:3404)
sun.reflect.GeneratedMethodAccessor341.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
$Proxy60.get(Unknown Source)
org.jboss.web.tomcat.tc5.session.JBossCacheWrapper.get(JBossCacheWrapper.java:78)
org.jboss.web.tomcat.tc5.session.JBossCacheService.loadSession(JBossCacheService.java:247)
org.jboss.web.tomcat.tc5.session.JBossCacheManager.loadSession(JBossCacheManager.java:1006)
org.jboss.web.tomcat.tc5.session.JBossCacheManager.findSession(JBossCacheManager.java:778)
org.apache.catalina.connector.Request.doGetSession(Request.java:2196)
org.apache.catalina.connector.Request.getSession(Request.java:2024)
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:97)
org.jboss.web.tomcat.tc5.session.ClusteredSessionValve.invoke(ClusteredSessionValve.java:87)
org.jboss.web.tomcat.tc5.session.JvmRouteValve.invoke(JvmRouteValve.java:84)
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
org.jboss.web.tomcat.tc5.sso.ClusteredSingleSignOn.invoke(ClusteredSingleSignOn.java:637)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199)
org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
java.lang.Thread.run(Thread.java:619)
Thread: IncomingPacketHandler (channel=Tomcat-LAB01) : priority:5, demon:true,
threadId:35, threadState:WAITING,
threadLockName:org.jboss.cache.interceptors.CacheLoaderInterceptor@5778e8ed
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:485)
org.jboss.cache.interceptors.BaseCacheLoaderInterceptor.obtainLoaderLock(BaseCacheLoaderInterceptor.java:49)
org.jboss.cache.interceptors.CacheLoaderInterceptor.invoke(CacheLoaderInterceptor.java:168)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.UnlockInterceptor.invoke(UnlockInterceptor.java:32)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.ReplicationInterceptor.invoke(ReplicationInterceptor.java:39)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.CacheStoreInterceptor.invoke(CacheStoreInterceptor.java:64)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.TxInterceptor.handleNonTxMethod(TxInterceptor.java:365)
org.jboss.cache.interceptors.TxInterceptor.invoke(TxInterceptor.java:160)
org.jboss.cache.interceptors.Interceptor.invoke(Interceptor.java:68)
org.jboss.cache.interceptors.CacheMgmtInterceptor.invoke(CacheMgmtInterceptor.java:167)
org.jboss.cache.TreeCache.invokeMethod(TreeCache.java:5863)
org.jboss.cache.TreeCache._replicate(TreeCache.java:5162)
sun.reflect.GeneratedMethodAccessor344.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.jgroups.blocks.MethodCall.invoke(MethodCall.java:330)
org.jgroups.blocks.RpcDispatcher.handle(RpcDispatcher.java:281)
org.jgroups.blocks.RequestCorrelator.handleRequest(RequestCorrelator.java:654)
org.jgroups.blocks.RequestCorrelator.receiveMessage(RequestCorrelator.java:544)
org.jgroups.blocks.RequestCorrelator.receive(RequestCorrelator.java:367)
org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.up(MessageDispatcher.java:777)
org.jgroups.JChannel.up(JChannel.java:1091)
org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:382)
org.jgroups.stack.ProtocolStack.receiveUpEvent(ProtocolStack.java:398)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.pbcast.STATE_TRANSFER.up(STATE_TRANSFER.java:158)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.FRAG2.up(FRAG2.java:197)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.FC.up(FC.java:422)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.pbcast.GMS.up(GMS.java:768)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.protocols.pbcast.GMS.receiveUpEvent(GMS.java:788)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.pbcast.STABLE.up(STABLE.java:262)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.UNICAST.up(UNICAST.java:259)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.pbcast.NAKACK.handleMessage(NAKACK.java:685)
org.jgroups.protocols.pbcast.NAKACK.up(NAKACK.java:517)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.VERIFY_SUSPECT.up(VERIFY_SUSPECT.java:170)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.FD.up(FD.java:300)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.FD_SOCK.up(FD_SOCK.java:301)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.MERGE2.up(MERGE2.java:162)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.Discovery.up(Discovery.java:225)
org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:470)
org.jgroups.stack.Protocol.passUp(Protocol.java:520)
org.jgroups.protocols.TP.handleIncomingMessage(TP.java:909)
org.jgroups.protocols.TP.handleIncomingPacket(TP.java:851)
org.jgroups.protocols.TP.access$400(TP.java:46)
org.jgroups.protocols.TP$IncomingPacketHandler.run(TP.java:1297)
java.lang.Thread.run(Thread.java:619)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira