[infinispan-issues] [JBoss JIRA] Commented: (ISPN-908) ClassCastException at high load

Galder Zamarreño (JIRA) jira-events at lists.jboss.org
Wed Feb 2 08:35:39 EST 2011


    [ https://issues.jboss.org/browse/ISPN-908?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12579564#comment-12579564 ] 

Galder Zamarreño commented on ISPN-908:
---------------------------------------

This can reproduced with a much simpler test case such as:

{code}
@Test(groups = "functional", testName = "distribution.DistRandomReplaceTest")
public class DistRandomReplaceTest extends BaseDistFunctionalTest {

   public DistRandomReplaceTest() {
      tx = true;
      l1CacheEnabled = false;
      numOwners = 1;
      INIT_CLUSTER_SIZE = 2;
   }

   public void testRandomReplace(Method m) {
      final String k = k(m);
      final String v = v(m);
      Cache<Object, String> ownerCache = getOwners(k, 1)[0];
      ownerCache.put(k, v);
      Cache<Object, String> nonOwnerCache = getNonOwners(k, 1)[0];
      nonOwnerCache.replace(k, v(m, 1));
   }

}
{code}

The problem is that when a ClusteredGet is sent to the owner node, it does not wrap it around an MVCC entry. So, when the ImmortalCacheEntry arrives at the node that requested it, it doesn't do any further wrapping, so it ends up trying to operate on the ImmortalCacheEntry rather than MVCC entry.

Clearly, the owner node cannot do anything else here. When the ClusteredGet is received by the owner node, it does not node that this is due to a write op or not. So, at first glance, the solution might involve wrapping the value on the non-owner node so that it's passed correctly to the the actual replace command.

> ClassCastException at high load
> -------------------------------
>
>                 Key: ISPN-908
>                 URL: https://issues.jboss.org/browse/ISPN-908
>             Project: Infinispan
>          Issue Type: Bug
>          Components: Core API
>    Affects Versions: 4.2.1.CR1
>            Reporter: Changgeng Li
>            Assignee: Galder Zamarreño
>             Fix For: 4.2.1.Final, 5.0.0.ALPHA3, 5.0.0.Final
>
>         Attachments: classcast.tgz
>
>
> Following exception can be seen from log file occasionally when the system is at high load.
> 2011-02-01 00:52:14,845 ERROR [org.infinispan.interceptors.InvocationContextInterceptor] Execution error: 
> java.lang.ClassCastException: org.infinispan.container.entries.ImmortalCacheEntry cannot be cast to org.infinispan.container.entries.MVCCEntry
> 	at org.infinispan.commands.write.ReplaceCommand.perform(ReplaceCommand.java:63)
> 	at org.infinispan.interceptors.CallInterceptor.handleDefault(CallInterceptor.java:71)
> 	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.DistributionInterceptor.handleWriteCommand(DistributionInterceptor.java:336)
> 	at org.infinispan.interceptors.DistributionInterceptor.visitReplaceCommand(DistributionInterceptor.java:209)
> 	at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
> 	at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> 	at org.infinispan.interceptors.LockingInterceptor.visitReplaceCommand(LockingInterceptor.java:338)
> 	at org.infinispan.commands.write.ReplaceCommand.acceptVisitor(ReplaceCommand.java:59)
> 	at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> 	at org.infinispan.interceptors.DeadlockDetectingInterceptor.handleDataCommand(DeadlockDetectingInterceptor.java:91)
> 	at org.infinispan.interceptors.DeadlockDetectingInterceptor.visitReplaceCommand(DeadlockDetectingInterceptor.java:59)
> 	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 net.beaumaris.common.persistence.cache.GenericInfinispanCache.replace(GenericInfinispanCache.java:339)
> 	at net.beaumaris.dht.session.catv.service.impl.AccountIdToSessionIdCacheImpl.removeSessionFromAccount(AccountIdToSessionIdCacheImpl.java:72)
> 	at net.beaumaris.dht.session.catv.service.impl.SessionCacheImpl.removeSessionFromAccount(SessionCacheImpl.java:111)
> 	at net.beaumaris.dht.session.catv.service.impl.SessionCacheImpl.remove(SessionCacheImpl.java:77)
> 	at net.beaumaris.dht.session.catv.service.impl.SessionCacheImpl.remove(SessionCacheImpl.java:45)
> 	at net.beaumaris.dht.session.catv.facade.CATVSessionServiceFacade.delete(CATVSessionServiceFacade.java:153)
> 	at sun.reflect.GeneratedMethodAccessor745.invoke(Unknown Source)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:597)
> 	at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$VoidOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:132)
> 	at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
> 	at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:259)
> 	at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
> 	at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
> 	at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
> 	at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71)
> 	at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:990)
> 	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:941)
> 	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:932)
> 	at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:384)
> 	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:451)
> 	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:632)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> 	at net.beaumaris.common.servlet.TraceRequestResponseServletFilter.traceFilter(TraceRequestResponseServletFilter.java:195)
> 	at net.beaumaris.common.servlet.TraceRequestResponseServletFilter.doFilter(TraceRequestResponseServletFilter.java:139)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> 	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
> 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
> 	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
> 	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
> 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
> 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> 	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
> 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
> 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
> 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
> 	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
> 	at java.lang.Thread.run(Thread.java:619)
> This happens occasionally.
> The cache configuration:
>   <default>
>     <locking isolationLevel="READ_COMMITTED" lockAcquisitionTimeout="30000" useLockStriping="false"/>
>     <!--
>       This element specifies that the cache is clustered. modes supported:
>       distribution (d), replication (r) or invalidation (i). default is
>       local, non-clustered mode
>     -->
>     <clustering mode="d">
>       <l1 enabled="false" />
>       <hash numOwners="2"/>
>       <!--
>         Defines whether to retrieve state on startup
>       -->
>       <stateRetrieval timeout="3000" fetchInMemoryState="false" />
>       <sync replTimeout="3000" />
>       <!--
>         Uncomment this for async replication.
>         <async useReplQueue="true" replQueueInterval="10000" replQueueMaxElements="500" />
>       -->
>     </clustering>
>     <lazyDeserialization enabled="false"/>
>     <transaction useEagerLocking="false"
>       transactionManagerLookupClass="org.infinispan.transaction.lookup.GenericTransactionManagerLookup" />
>     <deadlockDetection enabled="true" spinDuration="1000" />
>   </default>
>  <namedCache name="session">
>     <clustering mode="d">
>         <l1 enabled="false"/>
>         <hash numOwners="2"/>
>         <sync/>
>     </clustering>
>     <transaction useEagerLocking="false" syncCommitPhase="false" syncRollbackPhase="false"
>         transactionManagerLookupClass="org.infinispan.transaction.lookup.DummyTransactionManagerLookup"/>
>     <indexing enabled="false" indexLocalOnly="false"/>
>   </namedCache>

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       



More information about the infinispan-issues mailing list