Avihai Berkovitz created IGNITE-2450:
----------------------------------------
Summary: Proxy classes are not serialized properly using
OptimizedMarshaller and BinaryMarshaller
Key: IGNITE-2450
URL: https://issues.apache.org/jira/browse/IGNITE-2450
Project: Ignite
Issue Type: Bug
Components: interop
Affects Versions: 1.5.0.final, ignite-1.4
Environment: Ubuntu 12.04 64 bit
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
Ignite 1.4.0
Reporter: Avihai Berkovitz
I tried to deploy several services using Java's Proxy class, to dynamically
define the needed interfaces. When using a single process (even with several
nodes running in the same JVM) everything worked. But when working with a large
cluster of several machines I got the following error:
{noformat}
Error when executing service: ServicePluginsDeployer
org.apache.ignite.IgniteException: Failed to unmarshall object.
at
org.apache.ignite.internal.processors.cache.CacheObjectImpl.value(CacheObjectImpl.java:84)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.cache.CacheObjectContext.unwrapBinary(CacheObjectContext.java:280)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.cache.CacheObjectContext.unwrapBinaryIfNeeded(CacheObjectContext.java:145)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.cache.CacheObjectContext.unwrapBinaryIfNeeded(CacheObjectContext.java:132)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.cache.GridCacheMapEntry$LazyValueEntry.getValue(GridCacheMapEntry.java:4339)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.service.GridServiceProcessor$TopologyListener$1.run0(GridServiceProcessor.java:1214)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.service.GridServiceProcessor$BusyRunnable.run(GridServiceProcessor.java:1399)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[na:1.8.0_60]
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[na:1.8.0_60]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[na:1.8.0_60]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[na:1.8.0_60]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
Caused by: org.apache.ignite.IgniteCheckedException: Failed to find class with
given class loader for unmarshalling (make sure same version of all classes are
available on all nodes or enable peer-class-loading): null
at
org.apache.ignite.marshaller.optimized.OptimizedMarshaller.unmarshal(OptimizedMarshaller.java:254)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessorImpl.unmarshal(IgniteCacheObjectProcessorImpl.java:110)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl.unmarshal(CacheObjectBinaryProcessorImpl.java:700)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.processors.cache.CacheObjectImpl.value(CacheObjectImpl.java:76)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
... 11 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.sun.proxy.$Proxy55
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
~[na:1.8.0_60]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_60]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
~[na:1.8.0_60]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_60]
at java.lang.Class.forName0(Native Method) ~[na:1.8.0_60]
at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_60]
at
org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8172)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.internal.MarshallerContextAdapter.getClass(MarshallerContextAdapter.java:185)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.classDescriptor(OptimizedMarshallerUtils.java:267)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readObjectOverride(OptimizedObjectInputStream.java:309)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
~[na:1.8.0_60]
at
org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readFields(OptimizedObjectInputStream.java:482)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readSerializable(OptimizedObjectInputStream.java:570)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedClassDescriptor.read(OptimizedClassDescriptor.java:808)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readObjectOverride(OptimizedObjectInputStream.java:315)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
~[na:1.8.0_60]
at
org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readFields(OptimizedObjectInputStream.java:482)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readSerializable(OptimizedObjectInputStream.java:570)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedClassDescriptor.read(OptimizedClassDescriptor.java:808)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at
org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readObjectOverride(OptimizedObjectInputStream.java:315)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
~[na:1.8.0_60]
at
org.apache.ignite.marshaller.optimized.OptimizedMarshaller.unmarshal(OptimizedMarshaller.java:248)
~[ignite-core-1.5.0.final.jar:1.5.0.final]
... 14 common frames omitted
{noformat}
I think the problem is that the marshaller tries to reference the proxy class
by name, but deserialization of proxy classes should be special
([https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html#serial])
and create the classes on the fly. When using the JdkMarshaller the problem
doesn't happen.
This problem doesn't show up in existing tests (IGNITE-2098) because they all
run in the same JVM, where the same proxy classes exist before and after
serialization. You must have nodes in two different processes, and create
several proxy classes, for the problem to manifest.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)