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