Hello 

 

I'm running Ignite node (v. 2.7.0) inside Karaf 4.2.0 as part of my
application. 

 

The problem that I discovered that I'm unable to  join multiple such nodes
into a cluster. 

 

When a new node is joining an existing node it sends its node data which is
supposed to be unmarshalled and validated in
org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.vali
dateNode(). The thing is that existing node cannot unmarshal the data and
therefore rejects join request from new node. Error is:

 

Error on unmarshalling discovery data from node
10.0.2.15,127.0.0.1,172.17.0.1:47501: Failed to find class with given class
loader for unmarshalling (make sure same versions of all classes are
available on all nodes or enable peer-class-loading)
[clsLdr=jdk.internal.loader.ClassLoaders$AppClassLoader@5c0369c4,
cls=org.apache.ignite.internal.processors.cluster.DiscoveryDataClusterState]
; node is not allowed to join

 

This is the code that does unmarshalling:

 

joiningNodeState = marsh.unmarshal((byte[]) discoData.joiningNodeData(),
Thread.currentThread().getContextClassLoader());

 

(link to line
https://github.com/apache/ignite/blob/924139d0a8929e46634f91c5be87c9b9dc2cbb
11/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/
GridClusterStateProcessor.java#L967)

 

Apparently jdk.internal.loader.ClassLoaders$AppClassLoader@ is returned from
Thread.currentThread().getContextClassLoader(). 

 

But this won't work for OSGI because classes of ignite-osgi are only
available in bundle classloader and none of them are available in any other
classloader!

 

There's special classloader created for Ignite in ignite-osgi module in
IgniteAbstractOsgiContextActivator.start() and propagated to
IgniteConfiguration  object ( line
https://github.com/apache/ignite/blob/924139d0a8929e46634f91c5be87c9b9dc2cbb
11/modules/osgi/src/main/java/org/apache/ignite/osgi/IgniteAbstractOsgiConte
xtActivator.java#L102)

 

Question is what this special classloader is used for and why it doesn't
appear in output from Thread.currentThread().getContextClassLoader()in
GridClusterStateProcessor.validateNode().

 

Just in case, here is link to my project on GitHub:
https://github.com/leshkm/karaf-ignite-test

 

Best regards,

Oleksii

Reply via email to