ignite-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Denis Magda (JIRA)" <j...@apache.org>
Subject [jira] [Created] (IGNITE-3935) ClassLoaders are not switched during object deserialization
Date Tue, 20 Sep 2016 07:11:20 GMT
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)

Mime
View raw message