Details
-
Bug
-
Resolution: Done
-
Critical
-
4.0.0.Final, 4.1.0.CR2
-
None
Description
When using SKIP_LOCKING and removing from Cache with a cache loader a ClassCaseException is thrown
java.lang.ClassCastException: org.infinispan.container.entries.ImmortalCacheEntry cannot be cast to org.infinispan.container.entries.MVCCEntry
at org.infinispan.commands.write.RemoveCommand.perform(RemoveCommand.java:74)
at org.infinispan.interceptors.CallInterceptor.handleDefault(CallInterceptor.java:72)
at org.infinispan.commands.AbstractVisitor.visitRemoveCommand(AbstractVisitor.java:61)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:70)
at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
at org.infinispan.interceptors.LockingInterceptor.visitRemoveCommand(LockingInterceptor.java:221)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:70)
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.visitRemoveCommand(AbstractVisitor.java:61)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:70)
at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
at org.infinispan.interceptors.CacheLoaderInterceptor.visitRemoveCommand(CacheLoaderInterceptor.java:103)
at org.infinispan.interceptors.ActivationInterceptor.visitRemoveCommand(ActivationInterceptor.java:44)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:70)
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.visitRemoveCommand(AbstractVisitor.java:61)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:70)
at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
at org.infinispan.interceptors.TxInterceptor.enlistWriteAndInvokeNext(TxInterceptor.java:183)
at org.infinispan.interceptors.TxInterceptor.visitRemoveCommand(TxInterceptor.java:137)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:70)
at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:58)
at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:39)
at org.infinispan.commands.AbstractVisitor.visitRemoveCommand(AbstractVisitor.java:61)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:70)
at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:271)
at org.infinispan.CacheDelegate.remove(CacheDelegate.java:207)
at uk.co.cosmic_solutions.mdtest2.infinispan.test.InfinispanTest3.runTest(InfinispanTest3.java:87)
This issue was first encountered while using Infinispan as a Lucene store via the InfinispanDirectory as that module makes extensive use of Flag.SKIP_LOCKING, attempting to use Directory.copy on cache with cacheloader produced this error
The issue appears to relate to org.infinispan.container.EntryFactoryImpl#wrapEntryForWriting which doesn't appear to wrap the entry if it exists in the context when locking is skipped, this results in an ImmortalCacheEntry being returned in the org.infinispan.commands.write.RemoveCommand#perform
Test case attached