[ 
https://issues.apache.org/jira/browse/IGNITE-2450?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15134149#comment-15134149
 ] 

Vladimir Ozerov commented on IGNITE-2450:
-----------------------------------------

Patch looks good for me provided that tests are fine.

> 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)

Reply via email to