You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Denis Magda (JIRA)" <ji...@apache.org> on 2016/05/12 09:12:12 UTC

[jira] [Updated] (IGNITE-1823) Peer class loading can produce ClassCastException with DeploymentMode.SHARED (default)

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

Denis Magda updated IGNITE-1823:
--------------------------------
    Fix Version/s:     (was: 1.6)
                   1.7

> Peer class loading can produce ClassCastException with DeploymentMode.SHARED (default)
> --------------------------------------------------------------------------------------
>
>                 Key: IGNITE-1823
>                 URL: https://issues.apache.org/jira/browse/IGNITE-1823
>             Project: Ignite
>          Issue Type: Bug
>          Components: 1.4
>    Affects Versions: ignite-1.4, 1.5.0.final
>            Reporter: Artem Shutak
>            Assignee: Denis Magda
>            Priority: Blocker
>              Labels: community
>             Fix For: 1.7
>
>         Attachments: client-run-1.log, client-run-2.log, server.log
>
>
> Peer class loading can produce ClassCastException with DeploymentMode.SHARED (default).
> Steps to reproduce (tested with 1.4 and 1.5-SNAPSHOT).
> - Build Ignite under java 7. 
> - Run ignite.sh with default configuration and enabled peer class loading under Java 8
> - Run Test class under java8
> - Run Test class under java8 again. On second run you will get ClassCastException.
> Looks like the issue is Ignite use different classloaders for first and second run of Test (Task class deployed and undeployed each time).
> Workarounds:
> - Use another DeploymentMode. For example in this case Ignite works fine with CONTINUOUS deployment mode.
> - Don't use peer class loading and add jars with custom tasks to classpath of server nodes.
> Exception:
> {noformat}
> [19:56:03,013][SEVERE][ignite-#18%sys-null%][GridTaskWorker] Failed to obtain remote job result policy for result from ComputeTask.result(..) method (will fail the whole task): GridJobResultImpl [job=C2 [], sib=GridJobSiblingImpl [sesId=37a6da9b051-7d576228-e0e4-492c-a325-35ce4fc40ea0, jobId=47a6da9b051-cadb35ba-9bc8-4f05-b9ce-03344883743f, nodeId=cadb35ba-9bc8-4f05-b9ce-03344883743f, isJobDone=false], jobCtx=GridJobContextImpl [jobId=47a6da9b051-cadb35ba-9bc8-4f05-b9ce-03344883743f, timeoutObj=null, attrs={}], node=TcpDiscoveryNode [id=cadb35ba-9bc8-4f05-b9ce-03344883743f, addrs=[0:0:0:0:0:0:0:1%lo, 127.0.0.1, 192.168.1.159], sockAddrs=[/192.168.1.159:47500, /0:0:0:0:0:0:0:1%lo:47500, /127.0.0.1:47500, /192.168.1.159:47500], discPort=47500, order=1, intOrder=1, lastExchangeTime=1446224162137, loc=false, ver=1.5.0#20151029-sha1:91059ba8, isClient=false], ex=class o.a.i.IgniteException: mypackage.Task cannot be cast to mypackage.Task, hasRes=true, isCancelled=false, isOccupied=true]
> class org.apache.ignite.IgniteException: Remote job threw user exception (override or implement ComputeTask.result(..) method if you would like to have automatic failover for this exception).
> 	at org.apache.ignite.compute.ComputeTaskAdapter.result(ComputeTaskAdapter.java:101)
> 	at org.apache.ignite.internal.processors.task.GridTaskWorker$3.apply(GridTaskWorker.java:903)
> 	at org.apache.ignite.internal.processors.task.GridTaskWorker$3.apply(GridTaskWorker.java:896)
> 	at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6403)
> 	at org.apache.ignite.internal.processors.task.GridTaskWorker.result(GridTaskWorker.java:896)
> 	at org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:792)
> 	at org.apache.ignite.internal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:995)
> 	at org.apache.ignite.internal.processors.task.GridTaskProcessor$JobMessageListener.onMessage(GridTaskProcessor.java:1219)
> 	at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> 	at org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> 	at org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> 	at java.lang.Thread.run(Thread.java:745)
> Caused by: class org.apache.ignite.IgniteException: mypackage.Task cannot be cast to mypackage.Task
> 	at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2.execute(GridClosureProcessor.java:1792)
> 	at org.apache.ignite.internal.processors.job.GridJobWorker$2.call(GridJobWorker.java:509)
> 	at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6371)
> 	at org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:503)
> 	at org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:456)
> 	at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
> 	at org.apache.ignite.internal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1166)
> 	at org.apache.ignite.internal.processors.job.GridJobProcessor$JobExecutionListener.onMessage(GridJobProcessor.java:1776)
> 	... 6 more
> Caused by: java.lang.ClassCastException: mypackage.Task cannot be cast to mypackage.Task
> 	at mypackage.Test.lambda$main$cea8297e$1(Test.java:40)
> 	at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2.execute(GridClosureProcessor.java:1789)
> 	... 13 more
> [19:56:03] Ignite node stopped OK [uptime=00:00:00:371]
> Exception in thread "main" class org.apache.ignite.IgniteException: mypackage.Task cannot be cast to mypackage.Task
> 	at org.apache.ignite.internal.util.IgniteUtils.convertException(IgniteUtils.java:881)
> 	at org.apache.ignite.internal.IgniteComputeImpl.broadcast(IgniteComputeImpl.java:270)
> 	at mypackage.Test.main(Test.java:28)
> Caused by: class org.apache.ignite.IgniteCheckedException: mypackage.Task cannot be cast to mypackage.Task
> 	at org.apache.ignite.internal.util.IgniteUtils.cast(IgniteUtils.java:6979)
> 	at org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:166)
> 	at org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:115)
> 	at org.apache.ignite.internal.AsyncSupportAdapter.saveOrGet(AsyncSupportAdapter.java:112)
> 	at org.apache.ignite.internal.IgniteComputeImpl.broadcast(IgniteComputeImpl.java:267)
> 	... 1 more
> Caused by: java.lang.ClassCastException: mypackage.Task cannot be cast to mypackage.Task
> 	at mypackage.Test.lambda$main$cea8297e$1(Test.java:40)
> 	at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2.execute(GridClosureProcessor.java:1789)
> 	at org.apache.ignite.internal.processors.job.GridJobWorker$2.call(GridJobWorker.java:509)
> 	at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6371)
> 	at org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:503)
> 	at org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:456)
> 	at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
> 	at org.apache.ignite.internal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1166)
> 	at org.apache.ignite.internal.processors.job.GridJobProcessor$JobExecutionListener.onMessage(GridJobProcessor.java:1776)
> 	at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> 	at org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> 	at org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> 	at java.lang.Thread.run(Thread.java:745)
> {noformat}
>  
> Code of Test.
> {code}
> public class Task implements IgniteCallable<String> {
>     private static final long serialVersionUID = 1L;
>     @Override
>     public String call() throws Exception {
>         System.err.println("task called");
>         return InetAddress.getLocalHost().getHostName();
>     }
> }
> {code}
> {code}
> public class Test {
>     public static void main(String[] args) {
>         final IgniteConfiguration cfg = new IgniteConfiguration();
>         cfg.setPeerClassLoadingEnabled(true);
>         try (final Ignite ignite = Ignition.start(cfg)) {
>             final IgniteQueue<Task> queue = ignite.queue("myTaskQueue", 0, new CollectionConfiguration());
>             queue.clear();
>             queue.addAll(Collections.nCopies(100, new Task()));
>             final IgniteCompute compute = ignite.compute();
>             final Collection<Collection<String>> res = compute.broadcast(() -> {
>                 Ignite ign = Ignition.ignite();
>                 final IgniteQueue<Task> q = ign.queue("myTaskQueue", 0, null);
>                 final Collection<String> results = new ArrayList<>();
>                 Object task = q.poll();
>                 ign.log().info(">>>>> Class of task: " + task.getClass());
>                 for (; task != null; ) {
>                     results.add(((Task)task).call());
>                     task = q.poll();
>                 }
>                 return results;
>             });
>             System.out.println(res);
>         }
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)