[jboss-jira] [JBoss JIRA] Commented: (JBCACHE-1103) Make cache loader implementations thread safe and remove synchronization in CacheLoaderInterceptor and CacheStoreInterceptor
Manik Surtani (JIRA)
jira-events at lists.jboss.org
Wed Jul 18 15:42:47 EDT 2007
[ http://jira.jboss.com/jira/browse/JBCACHE-1103?page=comments#action_12369367 ]
Manik Surtani commented on JBCACHE-1103:
----------------------------------------
See discussion thread on the jbosscache-dev mail list to see how we arrived at this solution:
http://lists.jboss.org/pipermail/jbosscache-dev/2007-June/001657.html
> 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 at 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 at 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
More information about the jboss-jira
mailing list