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

dimuthuupe pushed a commit to branch param-sweep
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/param-sweep by this push:
     new e643cf0  Refactoring the post workflow manager
e643cf0 is described below

commit e643cf02dde076c12d1b7c72ca2e3ca32729ec6d
Author: Dimuthu Wannipurage <[email protected]>
AuthorDate: Wed Aug 26 12:43:24 2020 -0400

    Refactoring the post workflow manager
---
 .../helix/impl/workflow/PostWorkflowManager.java   | 184 ++++++++++++++++-----
 1 file changed, 143 insertions(+), 41 deletions(-)

diff --git 
a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
 
b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
index 29dc834..ada783a 100644
--- 
a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
+++ 
b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
@@ -31,9 +31,7 @@ import 
org.apache.airavata.helix.impl.task.parsing.ParsingTriggeringTask;
 import org.apache.airavata.helix.impl.task.staging.*;
 import org.apache.airavata.model.job.ChildJobModel;
 import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.status.ProcessState;
-import org.apache.airavata.model.status.ProcessStatus;
-import org.apache.airavata.monitor.JobStateValidator;
+import org.apache.airavata.model.status.*;
 import org.apache.airavata.monitor.JobStatusResult;
 import org.apache.airavata.monitor.kafka.JobStatusResultDeserializer;
 import org.apache.airavata.messaging.core.MessageContext;
@@ -42,8 +40,6 @@ import 
org.apache.airavata.model.messaging.event.JobIdentifier;
 import org.apache.airavata.model.messaging.event.JobStatusChangeEvent;
 import org.apache.airavata.model.messaging.event.MessageType;
 import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
 import org.apache.airavata.model.task.DataStagingTaskModel;
 import org.apache.airavata.model.task.TaskModel;
 import org.apache.airavata.model.task.TaskTypes;
@@ -146,6 +142,8 @@ public class PostWorkflowManager extends WorkflowManager {
 
                 if (!jobStatusResult.isChildJob()) {
                     saveAndPublishJobStatus(jobStatusResult.getJobId(), task, 
processId, experimentId, gateway, jobStatusResult.getState());
+                } else {
+                    saveAndPublishChildJobStatus(jobStatusResult.getJobId(), 
jobStatusResult.getState());
                 }
 
                 // TODO get cluster lock before that
@@ -177,15 +175,15 @@ public class PostWorkflowManager extends WorkflowManager {
                         logger.info("Job " + jobStatusResult.getJobId() + " 
was completed");
 
                         if 
("one_pass".equals(experimentModel.getExecutionType())) {
-                            executePostWorkflow(processId, gateway, false, 0, 
false, false);
+                            executePostWorkflowForProcess(processId, false);
                         } else {
 
                             if (jobStatusResult.isChildJob()) {
                                 logger.info("Running post workflow for child 
job index {} in job {} and task {}",
                                     jobStatusResult.getJobIndex(), 
jobStatusResult.getJobId(), task);
-                                executePostWorkflow(processId, gateway, true, 
jobStatusResult.getJobIndex(), true, false);
-
+                                executePostWorkflowForChildJob(processId, 
jobStatusResult.getJobIndex(), true);
                             } else {
+                                // Main job was completed. Check for all child 
job statuses and run missing ones.
                                 List<ChildJobModel> childJobsOfJob = 
registryClient.getChildJobsOfJob(jobStatusResult.getJobId(), task);
                                 Map<Integer, ChildJobModel> childMap = new 
HashMap<>();
                                 childJobsOfJob.forEach(child -> 
childMap.put(child.getJobIndex(), child));
@@ -197,12 +195,13 @@ public class PostWorkflowManager extends WorkflowManager {
                                                     .noneMatch(st -> 
(st.getJobState() == JobState.COMPLETE) || (st.getJobState() == 
JobState.FAILED))) {
                                         logger.info("Running post workflow for 
job {} index {} and task {}",
                                                 jobModel.getJobId(), i, 
jobModel.getTaskId());
-                                        executePostWorkflow(processId, 
gateway, false, i, false, true);
+                                        
executePostWorkflowForChildJob(processId, i, true);
                                     } else {
                                         logger.info("Ignoring post workflow 
for job {} index {} in task {}",
                                                 jobModel.getJobId(), i, 
jobModel.getTaskId());
                                     }
                                 }
+                                executePostWorkflowForProcess(processId, true);
                             }
                         }
                     } else if (jobStatusResult.getState() == 
JobState.CANCELED) {
@@ -227,8 +226,7 @@ public class PostWorkflowManager extends WorkflowManager {
         }
     }
 
-    private void executePostWorkflow(String processId, String gateway, boolean 
forceRun, int jobIndex, boolean isChildJob, boolean excludeDataStage) throws 
Exception {
-
+    private void executePostWorkflowForChildJob(String processId, int 
jobIndex, boolean forceRun) throws Exception {
         RegistryService.Client registryClient = 
getRegistryClientPool().getResource();
 
         ProcessModel processModel;
@@ -270,22 +268,16 @@ public class PostWorkflowManager extends WorkflowManager {
                 AiravataTask airavataTask = null;
                 if (taskModel.getTaskType() == TaskTypes.JOB_SUBMISSION) {
                     jobSubmissionFound = true;
-                } else if (taskModel.getTaskType() == TaskTypes.DATA_STAGING 
&& !excludeDataStage) {
+                } else if (taskModel.getTaskType() == TaskTypes.DATA_STAGING) {
                     if (jobSubmissionFound) {
                         DataStagingTaskModel subTaskModel = 
(DataStagingTaskModel) ThriftUtils.getSubTaskModel(taskModel);
                         assert subTaskModel != null;
                         switch (subTaskModel.getType()) {
                             case OUPUT:
-                                if 
("one_pass".equals(experimentModel.getExecutionType())) {
-                                    airavataTask = new OutputDataStagingTask();
-                                    airavataTask.setForceRunTask(true);
-                                }
-                                if 
("param_sweep".equals(experimentModel.getExecutionType())) {
-                                    SweepingOutputDataStagingTask sweepTask = 
new SweepingOutputDataStagingTask();
-                                    sweepTask.setJobIndex(jobIndex);
-                                    sweepTask.setForceRunTask(true);
-                                    airavataTask = sweepTask;
-                                }
+                                SweepingOutputDataStagingTask sweepTask = new 
SweepingOutputDataStagingTask();
+                                sweepTask.setJobIndex(jobIndex);
+                                sweepTask.setForceRunTask(true);
+                                airavataTask = sweepTask;
                                 break;
                             case ARCHIVE_OUTPUT:
                                 airavataTask = new ArchiveTask();
@@ -309,27 +301,118 @@ public class PostWorkflowManager extends WorkflowManager 
{
             }
         }
 
-        if (!isChildJob) {
-            CompletingTask completingTask = new CompletingTask();
-            completingTask.setGatewayId(experimentModel.getGatewayId());
-            completingTask.setExperimentId(experimentModel.getExperimentId());
-            completingTask.setProcessId(processModel.getProcessId());
-            completingTask.setTaskId("Completing-Task-" + 
UUID.randomUUID().toString() + "-");
-            completingTask.setForceRunTask(forceRun);
-            completingTask.setSkipTaskStatusPublish(true);
-            if (allTasks.size() > 0) {
-                allTasks.get(allTasks.size() - 1).setNextTask(new 
OutPort(completingTask.getTaskId(), completingTask));
+        ParsingTriggeringTask parsingTriggeringTask = new 
ParsingTriggeringTask();
+        parsingTriggeringTask.setGatewayId(experimentModel.getGatewayId());
+        
parsingTriggeringTask.setExperimentId(experimentModel.getExperimentId());
+        parsingTriggeringTask.setProcessId(processModel.getProcessId());
+        parsingTriggeringTask.setTaskId("Parsing-Triggering-Task-" + 
UUID.randomUUID().toString() + "-");
+        parsingTriggeringTask.setSkipTaskStatusPublish(true);
+        parsingTriggeringTask.setOutputVersion(jobIndex);
+
+        if (allTasks.size() > 0) {
+            allTasks.get(allTasks.size() - 1).setNextTask(new 
OutPort(parsingTriggeringTask.getTaskId(), parsingTriggeringTask));
+        }
+        allTasks.add(parsingTriggeringTask);
+
+        String workflowName = getWorkflowOperator().launchWorkflow(processId + 
"-POST-" + UUID.randomUUID().toString(),
+                new ArrayList<>(allTasks), true, false);
+
+        registerWorkflowForProcess(processId, workflowName, "POST");
+
+    }
+
+    private void executePostWorkflowForProcess(String processId, boolean 
forceRun) throws Exception {
+        RegistryService.Client registryClient = 
getRegistryClientPool().getResource();
+
+        ProcessModel processModel;
+        ExperimentModel experimentModel;
+        try {
+            processModel = registryClient.getProcess(processId);
+            experimentModel = 
registryClient.getExperiment(processModel.getExperimentId());
+            getRegistryClientPool().returnResource(registryClient);
+
+        } catch (Exception e) {
+            logger.error("Failed to fetch experiment or process from registry 
associated with process id " + processId, e);
+            getRegistryClientPool().returnResource(registryClient);
+            throw new Exception("Failed to fetch experiment or process from 
registry associated with process id " + processId, e);
+        }
+
+        String taskDag = processModel.getTaskDag();
+        List<TaskModel> taskList = processModel.getTasks();
+
+        String[] taskIds = taskDag.split(",");
+        final List<AiravataTask> allTasks = new ArrayList<>();
+
+        JobVerificationTask jobVerificationTask = new JobVerificationTask();
+        jobVerificationTask.setGatewayId(experimentModel.getGatewayId());
+        jobVerificationTask.setExperimentId(experimentModel.getExperimentId());
+        jobVerificationTask.setProcessId(processModel.getProcessId());
+        jobVerificationTask.setTaskId("Job-Verification-Task-" + 
UUID.randomUUID().toString() +"-");
+        jobVerificationTask.setForceRunTask(forceRun);
+        jobVerificationTask.setSkipTaskStatusPublish(true);
+
+        allTasks.add(jobVerificationTask);
+
+        boolean jobSubmissionFound = false;
+
+        for (String taskId : taskIds) {
+            Optional<TaskModel> model = taskList.stream().filter(taskModel -> 
taskModel.getTaskId().equals(taskId)).findFirst();
+
+            if (model.isPresent()) {
+                TaskModel taskModel = model.get();
+                AiravataTask airavataTask = null;
+                if (taskModel.getTaskType() == TaskTypes.JOB_SUBMISSION) {
+                    jobSubmissionFound = true;
+                } else if (taskModel.getTaskType() == TaskTypes.DATA_STAGING) {
+                    if (jobSubmissionFound) {
+                        DataStagingTaskModel subTaskModel = 
(DataStagingTaskModel) ThriftUtils.getSubTaskModel(taskModel);
+                        assert subTaskModel != null;
+                        switch (subTaskModel.getType()) {
+                            case OUPUT:
+                                airavataTask = new OutputDataStagingTask();
+                                airavataTask.setForceRunTask(true);
+                                break;
+                            case ARCHIVE_OUTPUT:
+                                airavataTask = new ArchiveTask();
+                                airavataTask.setForceRunTask(true);
+                                break;
+                        }
+                    }
+                }
+
+                if (airavataTask != null) {
+                    airavataTask.setGatewayId(experimentModel.getGatewayId());
+                    
airavataTask.setExperimentId(experimentModel.getExperimentId());
+                    airavataTask.setProcessId(processModel.getProcessId());
+                    airavataTask.setTaskId(taskModel.getTaskId());
+                    airavataTask.setRetryCount(taskModel.getMaxRetry());
+                    if (allTasks.size() > 0) {
+                        allTasks.get(allTasks.size() - 1).setNextTask(new 
OutPort(airavataTask.getTaskId(), airavataTask));
+                    }
+                    allTasks.add(airavataTask);
+                }
             }
-            allTasks.add(completingTask);
         }
 
+        CompletingTask completingTask = new CompletingTask();
+        completingTask.setGatewayId(experimentModel.getGatewayId());
+        completingTask.setExperimentId(experimentModel.getExperimentId());
+        completingTask.setProcessId(processModel.getProcessId());
+        completingTask.setTaskId("Completing-Task-" + 
UUID.randomUUID().toString() + "-");
+        completingTask.setForceRunTask(forceRun);
+        completingTask.setSkipTaskStatusPublish(true);
+        if (allTasks.size() > 0) {
+            allTasks.get(allTasks.size() - 1).setNextTask(new 
OutPort(completingTask.getTaskId(), completingTask));
+        }
+        allTasks.add(completingTask);
+
         ParsingTriggeringTask parsingTriggeringTask = new 
ParsingTriggeringTask();
         parsingTriggeringTask.setGatewayId(experimentModel.getGatewayId());
         
parsingTriggeringTask.setExperimentId(experimentModel.getExperimentId());
         parsingTriggeringTask.setProcessId(processModel.getProcessId());
-        parsingTriggeringTask.setTaskId("Parsing-Triggering-Task");
+        parsingTriggeringTask.setTaskId("Parsing-Triggering-Task-" + 
UUID.randomUUID().toString() + "-");
         parsingTriggeringTask.setSkipTaskStatusPublish(true);
-        parsingTriggeringTask.setOutputVersion(jobIndex);
+        parsingTriggeringTask.setOutputVersion(-1);
 
         if (allTasks.size() > 0) {
             allTasks.get(allTasks.size() - 1).setNextTask(new 
OutPort(parsingTriggeringTask.getTaskId(), parsingTriggeringTask));
@@ -386,6 +469,31 @@ public class PostWorkflowManager extends WorkflowManager {
         }).start();
     }
 
+    private void saveAndPublishChildJobStatus(String jobId, JobState jobState) 
throws Exception {
+
+        try {
+            RegistryService.Client registryClient = 
getRegistryClientPool().getResource();
+
+            ChildJobStatus childJobStatus = new ChildJobStatus();
+            childJobStatus.setJobState(jobState);
+            childJobStatus.setReason(jobState.name());
+            
childJobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
+
+            try {
+                registryClient.addChildJobStatus(childJobStatus, jobId);
+                getRegistryClientPool().returnResource(registryClient);
+
+            } catch (Exception e) {
+                logger.error("Failed to add child job status " + jobId, e);
+                getRegistryClientPool().returnBrokenResource(registryClient);
+            }
+
+        } catch (Exception e) {
+            logger.error("Error persisting child job status {}", jobId, e);
+            throw e;
+        }
+    }
+
     private void saveAndPublishJobStatus(String jobId, String taskId, String 
processId, String experimentId, String gateway,
                                         JobState jobState) throws Exception {
         try {
@@ -395,12 +503,6 @@ public class PostWorkflowManager extends WorkflowManager {
             
jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
             jobStatus.setJobState(jobState);
 
-            if (jobStatus.getTimeOfStateChange() == 0 || 
jobStatus.getTimeOfStateChange() > 0 ) {
-                
jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-            } else {
-                
jobStatus.setTimeOfStateChange(jobStatus.getTimeOfStateChange());
-            }
-
             RegistryService.Client registryClient = 
getRegistryClientPool().getResource();
 
             try {

Reply via email to