]
Pedro Ruivo updated ISPN-11210:
-------------------------------
Fix Version/s: 9.4.18.Final
Classloading issues when using annotation generated marshallers in
deployed server tasks
----------------------------------------------------------------------------------------
Key: ISPN-11210
URL:
https://issues.redhat.com/browse/ISPN-11210
Project: Infinispan
Issue Type: Bug
Affects Versions: 9.4.0.Final, 10.0.0.Final
Reporter: Nistor Adrian
Assignee: Nistor Adrian
Priority: Major
Fix For: 9.4.18.Final, 10.1.2.Final, 11.0.0.Alpha1
A server task is deployed and the task generates annotation based protostream marshallers
during context init.
A NullPointerException is thrown as seen in this stacktrace, but this is another issue in
javassist which obscures the real reason, a java.lang.NoClassDefFoundError:
org/infinispan/protostream/ImmutableSerializationContext.
The NoClassDefFoundError is caused by the use of the thread context classloader in the
ClassPool of javassist. The TCL is not always suitable. At least it never is for deployed
server tasks. There is no workaround for this, and the only option is to modify
ProtoSchemaBuilder.build signature, or add an overloaded method that also accepts a
ClassLoader so the user can take control.
{code}
18:40:18,528 WARN
[org.infinispan.remoting.inboundhandler.NonTotalOrderPerCacheInboundInvocationHandler]
(remote-thread--p2-t1) ISPN000071: Caught exception when handling command
DistributedExecuteCommand [cache=Cache 'addressbook'@manapakam, keys=[],
callable=org.infinispan.server.infinispan.task.DistributedServerTask@5403bdfd]:
org.infinispan.protostream.annotations.ProtoSchemaBuilderException: Failed to generate
marshaller implementation class
at
org.infinispan.protostream.annotations.impl.ProtoSchemaGenerator.generateAndRegister(ProtoSchemaGenerator.java:144)
at
org.infinispan.protostream.annotations.ProtoSchemaBuilder.build(ProtoSchemaBuilder.java:235)
at test.cacheloader.impl.RemoveObjectsTask.setTaskContext(RemoveObjectsTask.java:57)
at
org.infinispan.server.infinispan.task.ServerTaskWrapper.inject(ServerTaskWrapper.java:43)
at
org.infinispan.server.infinispan.task.DistributedServerTask.call(DistributedServerTask.java:46)
at
org.infinispan.commands.read.DistributedExecuteCommand.invokeAsync(DistributedExecuteCommand.java:99)
at
org.infinispan.remoting.inboundhandler.BasePerCacheInboundInvocationHandler.invokeCommand(BasePerCacheInboundInvocationHandler.java:117)
at
org.infinispan.remoting.inboundhandler.BaseBlockingRunnable.invoke(BaseBlockingRunnable.java:99)
at
org.infinispan.remoting.inboundhandler.BaseBlockingRunnable.runAsync(BaseBlockingRunnable.java:71)
at
org.infinispan.remoting.inboundhandler.BaseBlockingRunnable.run(BaseBlockingRunnable.java:40)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at
protostream.javassist.CannotCompileException.<init>(CannotCompileException.java:77)
at
protostream.javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:249)
at protostream.javassist.ClassPool.toClass(ClassPool.java:1120)
at protostream.javassist.ClassPool.toClass(ClassPool.java:1083)
at protostream.javassist.ClassPool.toClass(ClassPool.java:1041)
at protostream.javassist.CtClass.toClass(CtClass.java:1278)
at
org.infinispan.protostream.annotations.impl.MarshallerCodeGenerator.generateMessageMarshaller(MarshallerCodeGenerator.java:230)
at
org.infinispan.protostream.annotations.impl.ProtoSchemaGenerator.generateMarshallers(ProtoSchemaGenerator.java:172)
at
org.infinispan.protostream.annotations.impl.ProtoSchemaGenerator.generateAndRegister(ProtoSchemaGenerator.java:142)
... 12 more
{code}