[ https://issues.apache.org/jira/browse/IGNITE-1272?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14936359#comment-14936359 ]
Denis Magda commented on IGNITE-1272: ------------------------------------- Val, thanks for the review. 1) Also why you get the descriptor from the userTypes map, but return it only if was loaded by default loader? Because if it's a custom class loader like {{GridDeploymentClassLoader}} we have to give him a chance to reload a class. It least this is required for compute engine to be fully workable in conjunction with {{PortableMarshaller}}. 2) Why do we need it in this map then? We store class descriptors of custom class loaders in a map for cases when it wasn't possible to load a class from the cache ({{marshCtx.getClass}}). It may happen when during serialization we don't manage to register it in the cache {{registered = marshCtx.registerClass(typeId, cls)}} and write full class name into the serialization form. When it's time to deserialize such a object we won't be able to get its class from {{marshCtx.getClass}} but will be able from {{userTypes}}. 3) I'm not sure I understood the purpose of {{descriptorLoadingFailover(...)}} method. First, it's is needed for the reason described in 2). Second. The user may register types with {{PortableTypeConfiguration}}. Most likely class descriptors registered this way will be bound to default class loader in {{userTypes}}. Then there can be a case when {{CacheClassLoader}} tries to deserialize on object of a type registered with {{PortableTypeConfiguration}}. {{CacheClassLoader}} won't be able to load this class (it seems that it doesn't perform lookup in the classpath) and {{descriptorLoadingFailover(...)}} will try to find class descriptor using the default class loader. > PortableMarshaller: issues when different class loaders are used > ---------------------------------------------------------------- > > Key: IGNITE-1272 > URL: https://issues.apache.org/jira/browse/IGNITE-1272 > Project: Ignite > Issue Type: Bug > Affects Versions: ignite-1.4 > Reporter: Denis Magda > Assignee: Denis Magda > Priority: Blocker > Fix For: ignite-1.5 > > Attachments: ignite-1272.patch > > > The reason is that a loader is not passed to required places when needed. > Reproduced with the following tests: > - {{IgniteCacheAbstractExecutionContextTest.testUserClassLoader()}} fails > with PortableMarshaller enabled. > - {{GridDeploymentMessageCountSelfTest.testCacheValueDeploymentOnPut()}} > Another issue is when {{PortableContext}} returns {{PortableClassDescriptor}} > by type id. Returned descriptor has a constructor which already has been > loaded with another class loader. Fix is not trivial and issue is reproduced > with {{GridP2PRemoteClassLoadersSelfTest}} > Look for corresponding TODOs in the code. > Unmute tests when fixed -- This message was sent by Atlassian JIRA (v6.3.4#6332)