[ 
https://issues.apache.org/jira/browse/IGNITE-4920?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alexei Scherbakov updated IGNITE-4920:
--------------------------------------
    Fix Version/s:     (was: 2.1)
                   2.0

> LocalDeploymentSpi resources cleanup on spi.register() might clean resources 
> from other tasks using delegating classloader.
> ---------------------------------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-4920
>                 URL: https://issues.apache.org/jira/browse/IGNITE-4920
>             Project: Ignite
>          Issue Type: Bug
>          Components: general
>    Affects Versions: 1.6
>            Reporter: Alexei Scherbakov
>            Assignee: Alexei Scherbakov
>             Fix For: 2.0
>
>
> Culrpit is "if" condition in LocalDelpoymentSpi:
> {noformat}
> if (entry.getKey().equals(entry.getValue()) && isResourceExist(ldr, 
> entry.getKey()) &&
>                         !U.hasParent(clsLdrToIgnore, ldr) && 
> ldrRsrcs.remove(ldr, clsLdrRsrcs)) {
> ...
> }
> {noformat}
> and can be fixed by adding clsLdrRsrcs.containsKey(entry.getKey()):
> {noformat}
> if (entry.getKey().equals(entry.getValue()) && isResourceExist(ldr, 
> entry.getKey()) &&
>                         !U.hasParent(clsLdrToIgnore, ldr) && 
> clsLdrRsrcs.containsKey(entry.getKey()) && ldrRsrcs.remove(ldr, clsLdrRsrcs)) 
> {
> ...
> }
> {noformat}
> Reproducer (might require multiple runs)
> {noformat}
> /** */
> public class Main {
>     public static void main(String args[]) throws MalformedURLException, 
> ClassNotFoundException {
>         System.setProperty("IGNITE_CACHE_REMOVED_ENTRIES_TTL", "1");
>         IgniteConfiguration cfg = new IgniteConfiguration();
>         cfg.setPeerClassLoadingEnabled(true);
>         TcpDiscoverySpi spi = new TcpDiscoverySpi();
>         spi.setIpFinder(new TcpDiscoveryVmIpFinder(true));
>         cfg.setDiscoverySpi(spi);
>         final Ignite ignite = Ignition.start(cfg);
>         final ClassLoader moduleClsLdr = Main.class.getClassLoader();
>         final ClassLoader moduleCLImpl = new DelegateClassLoader(null, 
> moduleClsLdr);
>         for (int i = 0; i < 1000000; i++)
>             try {
>                 Class clazz = moduleCLImpl.loadClass("Main$CallFunction");
>                 ignite.compute().call(
>                     
> (IgniteCallable)clazz.getDeclaredConstructor(ClassLoader.class).newInstance(moduleCLImpl)
>                 );
>             }
>             catch (Exception e) {
>                 e.printStackTrace();
>             }
>         System.out.println("Done");
>     }
>     public static class CallFunction implements IgniteCallable, 
> GridPeerDeployAware {
>         transient ClassLoader classLoader;
>         public CallFunction(ClassLoader cls) {
>             this.classLoader = cls;
>         }
>         public Object call() throws Exception {
>             return null;
>         }
>         public Class<?> deployClass() {
>             return this.getClass();
>         }
>         public ClassLoader classLoader() {
>             return classLoader;
>         }
>     }
>     public static class DelegateClassLoader extends ClassLoader {
>         private ClassLoader delegateCL;
>         public DelegateClassLoader(ClassLoader parent, ClassLoader 
> delegateCL) {
>             super(parent); // Parent doesn't matter.
>             this.delegateCL = delegateCL;
>         }
>         @Override
>         public URL getResource(String name) {
>             return delegateCL.getResource(name);
>         }
>         @Override
>         public Class<?> loadClass(String name) throws ClassNotFoundException {
>             return delegateCL.loadClass(name);
>         }
>     }
> }
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to