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)

Reply via email to