[ https://issues.apache.org/jira/browse/IGNITE-19519?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Vadim Pakhnushev updated IGNITE-19519: -------------------------------------- Summary: Deployment unit removal (was: Add remove verification after restart ) > Deployment unit removal > ----------------------- > > Key: IGNITE-19519 > URL: https://issues.apache.org/jira/browse/IGNITE-19519 > Project: Ignite > Issue Type: New Feature > Reporter: Mikhail Pochatkin > Assignee: Vadim Pakhnushev > Priority: Major > Labels: iep-103, ignite-3 > > h3. Deployment unit removal process > The deployment unit must be removed from all cluster nodes. In order to > achieve this the following must be implemented: > # 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. > h3. Node restart during unit removal process > If a target node was restarted during deployment unit removal process then > the node must find all deployment units with clusterDURecord.status == > OBSOLETE or clusterDURecord.status == REMOVING for restarted node and finish > deployment unit removal process as described in the previous section. -- This message was sent by Atlassian Jira (v8.20.10#820010)