Ilya Kasnacheev created IGNITE-6803:
---------------------------------------
Summary: UriDeploymentSpi affects execution of other tasks,
including Ignite internals
Key: IGNITE-6803
URL: https://issues.apache.org/jira/browse/IGNITE-6803
Project: Ignite
Issue Type: Bug
Security Level: Public (Viewable by anyone)
Affects Versions: 2.2
Reporter: Ilya Kasnacheev
>From the maillist:
http://apache-ignite-users.70518.x6.nabble.com/Code-deployment-throught-UriDeploumentSpi-tt17807.html
In our project we need to deploy custom compute tasks into cluster without
cluster restart and p2p class loading.
I try to use org.apache.ignite.spi.deployment.uri.UriDeploumentSpi for that
purpose, but I have a problem.
I have simple Ignite Service and Ignite Compute Task which use it throught
@ServiceResource.
This ComputeTask located into .gar file which was deployed via UriDeploumentSpi.
If I have service implementation on each node(node singleton service) then it
works great.
But if I deploy service as a cluster singleton then task executes correctly
only on node with this service.
On other nodes @ServiceResource returns ServiceProxy that throws exception on
service remote method invokation (lambda with service call cannot be deployed):
{code}
SEVERE: Failed to execute job
[jobId=68a96d76f51-7919c34c-9a48-4068-bcd6-70dad5595e86, ses=GridJobSessionImpl
[ses=GridTaskSessionImpl [taskName=task-one, dep=GridDeployment
[ts=1509275650885, depMode=SHARED, clsLdr=GridUriDeploymentClassLoader
[urls=[file:/C:/IdeaProjects/dmp_code_deployment/test/out/deployment/gg.uri.deployment.tmp/428ec712-e6d0-4eab-97f9-ce58d7b3e0f5/dirzip_task-one6814855127293591501.gar/]],
clsLdrId=7eb15d76f51-428ec712-e6d0-4eab-97f9-ce58d7b3e0f5, userVer=0,
loc=true, sampleClsName=com.gridfore.tfedyanin.deploy.Task1,
pendingUndeploy=false, undeployed=false, usage=1],
taskClsName=com.gridfore.tfedyanin.deploy.Task1,
sesId=38a96d76f51-7919c34c-9a48-4068-bcd6-70dad5595e86,
startTime=1509275650601, endTime=9223372036854775807,
taskNodeId=7919c34c-9a48-4068-bcd6-70dad5595e86,
clsLdr=GridUriDeploymentClassLoader
[urls=[file:/C:/IdeaProjects/dmp_code_deployment/test/out/deployment/gg.uri.deployment.tmp/428ec712-e6d0-4eab-97f9-ce58d7b3e0f5/dirzip_task-one6814855127293591501.gar/]],
closed=false, cpSpi=null, failSpi=null, loadSpi=null, usage=1, fullSup=false,
internal=false, subjId=7919c34c-9a48-4068-bcd6-70dad5595e86,
mapFut=IgniteFuture [orig=GridFutureAdapter [ignoreInterrupts=false,
state=INIT, res=null, hash=1254296516]], execName=null],
jobId=68a96d76f51-7919c34c-9a48-4068-bcd6-70dad5595e86]]
class org.apache.ignite.IgniteDeploymentException: Failed to auto-deploy task
(was task (re|un)deployed?): class
org.apache.ignite.internal.processors.service.GridServiceProcessor$ServiceTopologyCallable
{code}
Problem works as follows:
- Ignite has to determine which node has deployed service, by name.
- Ignite has to send ServiceTopologyCallable task.
- Ignite tries to deploy ServiceTopologyCallable task using UriDeploymentSpi.
- UriDeploymentSpi doesn't have it obviously, but it also tries to fallback
towards "CLASS" loading from local ClassLoader
- Which fails because it is told that ServiceTopologyCallable comes from its
classloader and not from the local one!
So I'm at loss where it should be fixed properly. It is also sad that we are
using all that deploy pipeline to handle IgniteInternal tasks, but there
obviously are non-internal local tasks which might be affected by same problem.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)