[ 
https://issues.apache.org/jira/browse/IGNITE-29259?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nikolay Izhikov updated IGNITE-29259:
-------------------------------------
    Attachment: IGNITE-29259-reproducer.patch

> Affinity key field of a type listed in BinaryTypeConfiguration is ignored 
> when the class is visible only through IgniteConfiguration.classLoader
> ------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-29259
>                 URL: https://issues.apache.org/jira/browse/IGNITE-29259
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Nikolay Izhikov
>            Assignee: Nikolay Izhikov
>            Priority: Major
>              Labels: ise
>         Attachments: IGNITE-29259-reproducer.patch
>
>
> {{BinaryContext#configure}} resolves the class of every 
> {{BinaryTypeConfiguration}} entry with 
> {{ClassLoaderUtils.classForName(clsName)}}, i.e. through the class loader 
> Ignite itself was loaded by. The class loader set via 
> {{IgniteConfiguration#setClassLoader}} is not consulted. When the class is 
> visible only through the configured loader the lookup returns {{null}} and 
> the {{@AffinityKeyMapped}} field is not detected.
> {{BinaryContext#registerUserType}}, called right after for the same type, 
> resolves the class through the configured loader, finds it and registers the 
> descriptor and the binary metadata with {{affinityKeyFieldName = null}}. The 
> descriptor is cached in {{predefinedTypes}}/{{descByCls}}, so marshalling an 
> instance later does not fix the metadata.
> Result: for the same key class the affinity key field is {{null}} if the type 
> is listed in {{BinaryConfiguration#setTypeConfigurations}} and is detected 
> correctly if it is not listed (the class is then examined when the first 
> instance is marshalled). Keys of configured types are therefore routed by the 
> whole key instead of the annotated field.
> Reproducer: {{BinaryTypeConfigurationCustomClassLoaderTest}} compiles a key 
> class at runtime into a directory that is not on the test classpath, sets a 
> {{URLClassLoader}} over it as {{IgniteConfiguration#setClassLoader}} and 
> checks {{ignite.binary().type(clsName).affinityKeyFieldName()}} with and 
> without a {{BinaryTypeConfiguration}} for the class. 
> {{testAffinityKeyFieldOfConfiguredType}} fails on master with 
> {{expected:<aff> but was:<null>}}, {{testAffinityKeyFieldOfUnconfiguredType}} 
> passes.
> Fix: resolve the class in {{configure}} through 
> {{BinaryContext#classLoader()}}, the same loader {{registerUserType}} uses.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to