gridgain / gridgain-old

268 stars 85 forks source link

GridCompute.run()/broadcast() with Java 8 lambda throws GridException: Failed to find class with given class loader for unmarshalling (make sure same version of all classes are available on all nodes or enable peer-class-loading): GridDeploymentClassLoader #74

Open ceefour opened 10 years ago

ceefour commented 10 years ago

Code:

try (Grid grid = GridGain.start("/home/ceefour/gridgain-platform-os-6.1.9-nix/examples/config/example-compute.xml")) {
    grid.compute().broadcast( () -> System.out.println("Hello") ).get();
}

GridGain 6.1.9.

Test project: https://github.com/ceefour/gggettingstarted

Error:

[13:54:44] Topology snapshot [ver=11, nodes=3, CPUs=4, heap=3.7GB]
Hello
[13:54:44,606][SEVERE][gridgain-#18%sys-null%][GridTaskWorker] Failed to obtain remote job result policy for result from GridComputeTask.result(..) method (will fail the whole task): GridJobResultImpl [job=o.g.g.kernal.processors.closure.GridClosureProcessor$10@6cb6decd, sib=GridJobSiblingImpl [sesId=f0e0f920741-57c84b71-1d89-4d8c-be19-d7cf36388595, jobId=41e0f920741-f2f6e9d0-2cf6-464e-bf9e-44b0043879c4, nodeId=f2f6e9d0-2cf6-464e-bf9e-44b0043879c4, isJobDone=false], jobCtx=GridJobContextImpl [jobId=41e0f920741-f2f6e9d0-2cf6-464e-bf9e-44b0043879c4, attrs={}], node=GridTcpDiscoveryNode [id=f2f6e9d0-2cf6-464e-bf9e-44b0043879c4, addrs=[127.0.0.1], sockAddrs=[/127.0.0.1:47500], discPort=47500, order=1, loc=false, ver=GridProductVersion [major=6, minor=1, maintenance=9, revTs=1403872573]], ex=class o.g.g.GridException: Failed to find class with given class loader for unmarshalling (make sure same version of all classes are available on all nodes or enable peer-class-loading): GridDeploymentClassLoader [id=ce96b920741-f2f6e9d0-2cf6-464e-bf9e-44b0043879c4, singleNode=false, nodeLdrMap={57c84b71-1d89-4d8c-be19-d7cf36388595=01e0f920741-57c84b71-1d89-4d8c-be19-d7cf36388595}, p2pTimeout=5000, usrVer=0, depMode=SHARED, quiet=false]
For more information see:
    Troubleshooting:      http://bit.ly/GridGain-Troubleshooting
    Documentation Center: http://bit.ly/GridGain-Documentation
, hasRes=true, isCancelled=false, isOccupied=true]
class org.gridgain.grid.GridException: Remote job threw user exception (override or implement GridComputeTask.result(..) method if you would like to have automatic failover for this exception).
    at org.gridgain.grid.compute.GridComputeTaskAdapter.result(GridComputeTaskAdapter.java:109)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker$3.apply(GridTaskWorker.java:819)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker$3.apply(GridTaskWorker.java:812)
    at org.gridgain.grid.util.GridUtils.wrapThreadLoader(GridUtils.java:5955)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker.result(GridTaskWorker.java:812)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:708)
    at org.gridgain.grid.kernal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:834)
    at org.gridgain.grid.kernal.processors.task.GridTaskProcessor$JobMessageListener.onMessage(GridTaskProcessor.java:1066)
    at org.gridgain.grid.kernal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:654)
    at org.gridgain.grid.kernal.managers.communication.GridIoManager.access$1800(GridIoManager.java:62)
    at org.gridgain.grid.kernal.managers.communication.GridIoManager$6.body(GridIoManager.java:615)
    at org.gridgain.grid.util.worker.GridWorker.run(GridWorker.java:151)
    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.gridgain.grid.GridException: Failed to find class with given class loader for unmarshalling (make sure same version of all classes are available on all nodes or enable peer-class-loading): GridDeploymentClassLoader [id=ce96b920741-f2f6e9d0-2cf6-464e-bf9e-44b0043879c4, singleNode=false, nodeLdrMap={57c84b71-1d89-4d8c-be19-d7cf36388595=01e0f920741-57c84b71-1d89-4d8c-be19-d7cf36388595}, p2pTimeout=5000, usrVer=0, depMode=SHARED, quiet=false]
For more information see:
    Troubleshooting:      http://bit.ly/GridGain-Troubleshooting
    Documentation Center: http://bit.ly/GridGain-Documentation

    at org.gridgain.grid.marshaller.optimized.GridOptimizedMarshaller.unmarshal(GridOptimizedMarshaller.java:369)
    at org.gridgain.grid.kernal.processors.job.GridJobWorker.initialize(GridJobWorker.java:388)
    at org.gridgain.grid.kernal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1048)
    at org.gridgain.grid.kernal.processors.job.GridJobProcessor$JobExecutionListener.onMessage(GridJobProcessor.java:1685)
    ... 7 more
Caused by: java.lang.ClassNotFoundException: com.hendyirawan.gggettingstarted.simple.HelloWorld$$Lambda$1/1390913202
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:340)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedMarshallerUtils.forName(GridOptimizedMarshallerUtils.java:105)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedClassResolver.forName(GridOptimizedClassResolver.java:447)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedClassResolver.readClass(GridOptimizedClassResolver.java:355)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readObjectOverride(GridOptimizedObjectInputStream.java:140)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readFields(GridOptimizedObjectInputStream.java:274)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readSerializable(GridOptimizedObjectInputStream.java:359)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.read(GridOptimizedClassDescriptor.java:959)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readObjectOverride(GridOptimizedObjectInputStream.java:144)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedMarshaller.unmarshal(GridOptimizedMarshaller.java:363)
    ... 10 more
[13:54:44] GridGain node stopped OK [uptime=00:00:00:312]
Exception in thread "main" class org.gridgain.grid.GridException: Remote job threw user exception (override or implement GridComputeTask.result(..) method if you would like to have automatic failover for this exception).
    at org.gridgain.grid.compute.GridComputeTaskAdapter.result(GridComputeTaskAdapter.java:109)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker$3.apply(GridTaskWorker.java:819)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker$3.apply(GridTaskWorker.java:812)
    at org.gridgain.grid.util.GridUtils.wrapThreadLoader(GridUtils.java:5955)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker.result(GridTaskWorker.java:812)
    at org.gridgain.grid.kernal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:708)
    at org.gridgain.grid.kernal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:834)
    at org.gridgain.grid.kernal.processors.task.GridTaskProcessor$JobMessageListener.onMessage(GridTaskProcessor.java:1066)
    at org.gridgain.grid.kernal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:654)
    at org.gridgain.grid.kernal.managers.communication.GridIoManager.access$1800(GridIoManager.java:62)
    at org.gridgain.grid.kernal.managers.communication.GridIoManager$6.body(GridIoManager.java:615)
    at org.gridgain.grid.util.worker.GridWorker.run(GridWorker.java:151)
    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.gridgain.grid.GridException: Failed to find class with given class loader for unmarshalling (make sure same version of all classes are available on all nodes or enable peer-class-loading): GridDeploymentClassLoader [id=ce96b920741-f2f6e9d0-2cf6-464e-bf9e-44b0043879c4, singleNode=false, nodeLdrMap={57c84b71-1d89-4d8c-be19-d7cf36388595=01e0f920741-57c84b71-1d89-4d8c-be19-d7cf36388595}, p2pTimeout=5000, usrVer=0, depMode=SHARED, quiet=false]
For more information see:
    Troubleshooting:      http://bit.ly/GridGain-Troubleshooting
    Documentation Center: http://bit.ly/GridGain-Documentation

    at org.gridgain.grid.marshaller.optimized.GridOptimizedMarshaller.unmarshal(GridOptimizedMarshaller.java:369)
    at org.gridgain.grid.kernal.processors.job.GridJobWorker.initialize(GridJobWorker.java:388)
    at org.gridgain.grid.kernal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1048)
    at org.gridgain.grid.kernal.processors.job.GridJobProcessor$JobExecutionListener.onMessage(GridJobProcessor.java:1685)
    ... 7 more
Caused by: java.lang.ClassNotFoundException: com.hendyirawan.gggettingstarted.simple.HelloWorld$$Lambda$1/1390913202
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:340)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedMarshallerUtils.forName(GridOptimizedMarshallerUtils.java:105)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedClassResolver.forName(GridOptimizedClassResolver.java:447)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedClassResolver.readClass(GridOptimizedClassResolver.java:355)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readObjectOverride(GridOptimizedObjectInputStream.java:140)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readFields(GridOptimizedObjectInputStream.java:274)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readSerializable(GridOptimizedObjectInputStream.java:359)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.read(GridOptimizedClassDescriptor.java:959)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectInputStream.readObjectOverride(GridOptimizedObjectInputStream.java:144)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedMarshaller.unmarshal(GridOptimizedMarshaller.java:363)
    ... 10 more
ceefour commented 10 years ago

The error happens for remote nodes. The local node can execute the closure.

dsetrakyan commented 10 years ago

Please take a look at Java8 examples under "examples/java8". Here is a sample code from there:

grid.compute().run((GridRunnable)() -> System.out.println("Hello World")).get()

ceefour commented 10 years ago

Thanks, this works:

grid.forRemotes().compute().run((GridRunnable) () -> System.out.println("Hello") ).get();

Is there any reason why (GridRunnable) cast is mandatory?

The strange thing is new Runnable() { ... } works, while plain lambda doesn't, even if the lambda returns a Runnable.

ceefour commented 10 years ago

IMHO if GridGain doesn't handle a specific Runnable implementation like given by Java8 lambda, the error message needs to mention this fact and provide assistance error message: "Please cast your job to GridRunnable"

dsetrakyan commented 10 years ago

Agree on the message, will fix.