You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by "Denis Magda (JIRA)" <ji...@apache.org> on 2016/09/20 07:11:20 UTC
[jira] [Created] (IGNITE-3935) ClassLoaders are not switched during
object deserialization
Denis Magda created IGNITE-3935:
-----------------------------------
Summary: ClassLoaders are not switched during object deserialization
Key: IGNITE-3935
URL: https://issues.apache.org/jira/browse/IGNITE-3935
Project: Ignite
Issue Type: Bug
Components: binary
Affects Versions: 1.6
Reporter: Denis Magda
If an object is being deserialized with ClassLoader A then this ClassLoader A will be used for the deserialization of the whole object's state, i.e., including all its fields that can be custom objects loaded by ClassLoader B.
In a basic scenario we can have an object of some Ignite class that is presented in the classpath. That Ignite class may enclose an object that is loaded by peer-class-loading class loader. The deserialization will fail because Ignite won't switch to the peer-class-loading loader when it's needed.
To reproduce the issue do the following:
1. Start a remote ignite node using {{./ignite.sh ../examples/config/example-ignite.xml}}
2. Run the code below
{code}
public class StreamingExample {`
public static class StreamingExampleCacheEntryProcessor implements CacheEntryProcessor<String, Long, Object> {
@Override
public Object process(MutableEntry<String, Long> e, Object... arg) throws EntryProcessorException {
Long val = e.getValue();
e.setValue(val == null ? 1L : val + 1);
return null;
}
}
public static void main(String[] args) throws IgniteException, IOException {
Ignition.setClientMode(true);
try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
IgniteCache<String, Long> stmCache = ignite.getOrCreateCache("mycache");
try (IgniteDataStreamer<String, Long> stmr = ignite.dataStreamer(stmCache.getName())) {
stmr.allowOverwrite(true);
stmr.receiver(StreamTransformer.from(new StreamingExampleCacheEntryProcessor()));
stmr.addData("word", 1L);
System.out.println("Finished");
}
}
}
{code}
However if to modify this code to the following everything will work fine
{code}
public class StreamingExample {
public static class StreamingExampleCacheEntryProcessor extends StreamTransformer<String, Long> {
@Override
public Object process(MutableEntry<String, Long> e, Object... arg) throws EntryProcessorException {
System.out.println("Executed!");
Long val = e.getValue();
e.setValue(val == null ? 1L : val + 1);
return null;
}
}
public static void main(String[] args) throws IgniteException, IOException {
Ignition.setClientMode(true);
try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
IgniteCache<String, Long> stmCache = ignite.getOrCreateCache("mycache");
try (IgniteDataStreamer<String, Long> stmr = ignite.dataStreamer(stmCache.getName())) {
stmr.allowOverwrite(true);
stmr.receiver(new StreamingExampleCacheEntryProcessor());
stmr.addData("word", 1L);
System.out.println("Finished");
}
}
}
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)