Mikhail Pochatkin created IGNITE-19708:
------------------------------------------

             Summary: Check refcounter of unit before undeploy
                 Key: IGNITE-19708
                 URL: https://issues.apache.org/jira/browse/IGNITE-19708
             Project: Ignite
          Issue Type: Improvement
            Reporter: Mikhail Pochatkin


# Change clusterDURecord.status to OBSOLETE value. This operation could fail 
because another process has already changed status to OBSOLETE or REMOVING 
value. It is also impossible to start an undeployment process in case the 
deployment process is still in progress.

After this step the deployment unit is not available for new code execution. 
Code execution in progress still can use this deployment unit.
 # Meta storage event must be fired to all target nodes due to a change of 
clusterDURecord.status.
 # After receiving this event by the target node the system must change 
nodeDURecord.status to OBSOLETE value.
 # The node waits for finishing of all code executions in progress that depend 
on this deployment unit. As soon as all code executions are finished 
nodeDURecord.status must be changed to REMOVING value.

>From this point it is impossible to use the deployment unit for code execution 
>neither for new tasks nor for old tasks (the second is impossible due to the 
>invariant that all old tasks are finished).
 # For each change of nodeDURecord.status to REMOVING value the system is able 
to receive an event from meta storage and check that all nodes have 
nodeDURecord.status == REMOVING. If the condition is met then 
clusterDURecord.status must be changed to REMOVING too.
 # Now the deployment unit can be removed from each target node and, after it, 
remove corresponding status records.
 # For each removal of nodeDURecord record from meta storage the system is able 
to receive an event from meta storage and check that there are no any 
nodeDURecord records for the given deployment unit. Now the system must remove 
the clusterDURecord record for the deployment unit.

 

Note that If the deployment unit was removed then there are no any class 
loaders associated with this deployment unit. Eventually the class loader 
should be collected by GC and all classes must be unloaded from JVM. It is the 
critical requirement in order to avoid memory leaks related to multiple class 
loading/unloading.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to