[
https://issues.apache.org/jira/browse/IGNITE-29259?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Nikolay Izhikov updated IGNITE-29259:
-------------------------------------
Attachment: (was: 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
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> {{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)