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)