This is an automated email from the ASF dual-hosted git repository.

pefernan pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 2971253843 [incubator-kie-issues-2000] Memory leak in 
LightWorkItemManager.workItems (#3954)
2971253843 is described below

commit 2971253843fedd6489e599d7823d1b0edf11e6ed
Author: Enrique <[email protected]>
AuthorDate: Fri Jun 13 16:48:02 2025 +0200

    [incubator-kie-issues-2000] Memory leak in LightWorkItemManager.workItems 
(#3954)
    
    * [incubator-kie-issues-2000] Memory leak in LightWorkItemManager.workItems
    
    * fix internalunloadprocessstate
    
    * remove process instance from in memory manager
    
    * only clean up during error and buble the error
---
 .../process/impl/AbstractProcessInstance.java      | 38 +++++++++++++++-------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
index 13c9aac1c5..edfff66d24 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
@@ -239,19 +239,23 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
             processError = buildProcessError();
         }
         if (processInstance.getKnowledgeRuntime() != null) {
-            processInstance.getMetaData().remove(KOGITO_PROCESS_INSTANCE);
             disconnect();
         }
         internalUnloadState();
     }
 
     public void internalUnloadState() {
-        // we left the instance in read only mode once it is completed
-        if (status == STATE_COMPLETED || status == STATE_ABORTED) {
-            this.rt = null;
-        } else if (status != STATE_PENDING) {
-            // already persisted. PENDING means that it has not started yet
-            processInstance = null;
+        switch (status) {
+            case STATE_COMPLETED, STATE_ABORTED:
+                // we left the instance in read only mode once it is completed
+                this.rt = null;
+                break;
+            case STATE_PENDING:
+                break;
+            default:
+                // already persisted. PENDING means that it has not started yet
+                processInstance = null;
+                break;
         }
     }
 
@@ -261,7 +265,7 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
         }
         LOG.debug("disconnect process instance state {}", 
processInstance.getId());
         processInstance.disconnect();
-        processInstance.setMetaData(KOGITO_PROCESS_INSTANCE, null);
+        processInstance.getMetaData().remove(KOGITO_PROCESS_INSTANCE);
     }
 
     private void setCorrelationKey(String businessKey) {
@@ -575,7 +579,6 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
         return processInstanceLockStrategy.executeOperation(id, () -> {
             WorkflowProcessInstanceImpl workflowProcessInstance = 
internalLoadProcessInstanceState();
             R outcome = execution.apply(workflowProcessInstance);
-            syncWorkflowInstanceState(workflowProcessInstance);
             internalUnloadProcessInstanceState();
             return outcome;
         });
@@ -587,8 +590,21 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
             if (isProcessInstanceConnected()) {
                 
getProcessRuntime().getProcessInstanceManager().addProcessInstance(workflowProcessInstance);
             }
-            R outcome = execution.apply(workflowProcessInstance);
-            syncWorkflowInstanceState(workflowProcessInstance);
+            R outcome = null;
+            try {
+                outcome = execution.apply(workflowProcessInstance);
+            } catch (Throwable th) {
+                // clean up after non expected error
+                if (isProcessInstanceConnected()) {
+                    
getProcessRuntime().getProcessInstanceManager().removeProcessInstance(workflowProcessInstance);
+                }
+                if (workflowProcessInstance.getKnowledgeRuntime() != null) {
+                    disconnect();
+                }
+                internalUnloadState();
+                throw th;
+            }
+
             if (isProcessInstanceConnected()) {
                 syncPersistence(workflowProcessInstance);
                 
getProcessRuntime().getProcessInstanceManager().removeProcessInstance(workflowProcessInstance);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to