From 63fc840d6380e315b8ced1ebd425db1da91deb93 Mon Sep 17 00:00:00 2001 From: Jun He Date: Wed, 4 Nov 2020 17:14:08 -0800 Subject: [PATCH] Avoid creating subworkflow object every time when handling subworkflow task --- .../core/execution/WorkflowExecutor.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java b/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java index 1d28727aff..e165586be4 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java @@ -1686,15 +1686,7 @@ protected boolean updateParentWorkflow(Task subWorkflowTask, Workflow subWorkflo } else if (subWorkflowTask.getStatus().equals(IN_PROGRESS)) { LOGGER.debug("Subworkflow: {} is {}, updating parent workflow: {}", subWorkflow.getWorkflowId(), subWorkflow.getStatus().name(), parentWorkflow.getWorkflowId()); - SubWorkflow subWorkflowSystemTask = new SubWorkflow(); - subWorkflowSystemTask.execute(subWorkflow, subWorkflowTask, this); - // Keep Subworkflow task's data consistent with Subworkflow's. - if (subWorkflowTask.getStatus().isTerminal() && subWorkflowTask.getExternalOutputPayloadStoragePath() != null && !subWorkflowTask.getOutputData().isEmpty()) { - Map parentWorkflowTaskOutputData = subWorkflowTask.getOutputData(); - deciderService.populateTaskData(subWorkflowTask); - subWorkflowTask.getOutputData().putAll(parentWorkflowTaskOutputData); - deciderService.externalizeTaskData(subWorkflowTask); - } + executeSubworkflowTaskAndSyncData(subWorkflow, subWorkflowTask); return true; } else { LOGGER.warn("Unable to evaluate parent workflow: {} in status: {}, and subworkflow: {} in status: {}", @@ -1733,15 +1725,20 @@ protected boolean updateParentWorkflow(Task subWorkflowTask, Workflow subWorkflo @VisibleForTesting void updateParentWorkflowTask(Workflow subWorkflow) { - SubWorkflow subWorkflowSystemTask = new SubWorkflow(); Task subWorkflowTask = executionDAOFacade.getTaskById(subWorkflow.getParentWorkflowTaskId()); + executeSubworkflowTaskAndSyncData(subWorkflow, subWorkflowTask); + executionDAOFacade.updateTask(subWorkflowTask); + } + + private void executeSubworkflowTaskAndSyncData(Workflow subWorkflow, Task subWorkflowTask) { + WorkflowSystemTask subWorkflowSystemTask = WorkflowSystemTask.get(SubWorkflow.NAME); subWorkflowSystemTask.execute(subWorkflow, subWorkflowTask, this); + // Keep Subworkflow task's data consistent with Subworkflow's. if (subWorkflowTask.getStatus().isTerminal() && subWorkflowTask.getExternalOutputPayloadStoragePath() != null && !subWorkflowTask.getOutputData().isEmpty()) { Map parentWorkflowTaskOutputData = subWorkflowTask.getOutputData(); deciderService.populateTaskData(subWorkflowTask); subWorkflowTask.getOutputData().putAll(parentWorkflowTaskOutputData); deciderService.externalizeTaskData(subWorkflowTask); } - executionDAOFacade.updateTask(subWorkflowTask); } }