[
https://issues.apache.org/jira/browse/IGNITE-2450?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Valentin Kulichenko closed IGNITE-2450.
---------------------------------------
> 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: platforms
> Affects Versions: ignite-1.4, 1.5.0.final
> 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
> Assignee: Valentin Kulichenko
> Priority: Blocker
> Labels: community, important
> Fix For: 1.6
>
> Attachments: master_500bd3a_ignite-2450.patch
>
>
> 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)