You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sh...@apache.org on 2015/08/24 23:30:16 UTC

airavata git commit: Fixed process recovery, fixed job status update and retrieval issues.

Repository: airavata
Updated Branches:
  refs/heads/master b98f65997 -> 1de22283b


Fixed process recovery, fixed job status update and retrieval issues.


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/1de22283
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/1de22283
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/1de22283

Branch: refs/heads/master
Commit: 1de22283bce653c76f111125af429869fc05b60f
Parents: b98f659
Author: Shameera Rathanyaka <sh...@gmail.com>
Authored: Mon Aug 24 17:30:11 2015 -0400
Committer: Shameera Rathanyaka <sh...@gmail.com>
Committed: Mon Aug 24 17:30:11 2015 -0400

----------------------------------------------------------------------
 .../airavata/gfac/impl/GFacEngineImpl.java      | 160 ++++++++++++++-----
 .../apache/airavata/gfac/impl/GFacWorker.java   | 143 +++++------------
 .../gfac/monitor/email/EmailBasedMonitor.java   |   4 +-
 .../catalog/impl/ExperimentRegistry.java        |  19 ++-
 .../experiment/catalog/resources/Utils.java     |   5 +-
 .../utils/ThriftDataModelConversion.java        |   5 +-
 6 files changed, 183 insertions(+), 153 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/1de22283/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
index 1f5526a..b97915c 100644
--- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
+++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacEngineImpl.java
@@ -133,27 +133,48 @@ public class GFacEngineImpl implements GFacEngine {
 		if (processContext.isHandOver()) {
 			return;
 		}
-		TaskContext taskCtx = null;
-		List<TaskContext> taskChain = new ArrayList<>();
-		processContext.setProcessStatus(new ProcessStatus(ProcessState.CONFIGURING_WORKSPACE));
+//		List<TaskContext> taskChain = new ArrayList<>();
+		if (configureWorkspace(processContext, false)) return;
+
+		// exit if process is handed over to another instance while input staging
+		if (inputDataStaging(processContext, false)) return;
+
+		// exit if process is handed orver to another instance while job submission.
+		if (executeJobSubmission(processContext)) return;
+//		processContext.setTaskChain(taskChain);
+		if (processContext.isHandOver()) {
+			return;
+		}
+	}
+
+	private boolean executeJobSubmission(ProcessContext processContext) throws GFacException {
+		if (processContext.isHandOver()) {
+			return true;
+		}
+		TaskContext taskCtx;
+		TaskStatus taskStatus;
+		processContext.setProcessStatus(new ProcessStatus(ProcessState.EXECUTING));
+		JobSubmissionTask jobSubmissionTask = Factory.getJobSubmissionTask(processContext.getJobSubmissionProtocol());
+		if (processContext.isHandOver()) {
+			return true;
+		}
 		GFacUtils.saveAndPublishProcessStatus(processContext);
-		// Run all environment setup tasks
-		taskCtx = getEnvSetupTaskContext(processContext);
+		taskCtx = getJobSubmissionTaskContext(processContext);
 		saveTaskModel(taskCtx);
 		GFacUtils.saveAndPublishTaskStatus(taskCtx);
-		SSHEnvironmentSetupTask envSetupTask = new SSHEnvironmentSetupTask();
-		TaskStatus taskStatus = executeTask(taskCtx, envSetupTask);
+		taskStatus = executeTask(taskCtx, jobSubmissionTask, false);
 		if (taskStatus.getState() == TaskState.FAILED) {
-			log.error("expId: {}, processId: {}, taskId: {} type: {},:- Input statging failed, " +
-					"reason:" + " {}", taskCtx.getParentProcessContext().getExperimentId(), taskCtx
-					.getParentProcessContext().getProcessId(), taskCtx.getTaskId(), envSetupTask.getType
-					().name(), taskStatus.getReason());
-			throw new GFacException("Error while environment setup");
+			throw new GFacException("Job submission task failed");
 		}
+		return processContext.isHandOver();
+	}
+
+	private boolean inputDataStaging(ProcessContext processContext, boolean recover) throws GFacException {
 		if (processContext.isHandOver()) {
-			return;
+			return true;
 		}
-		// execute process inputs
+		TaskContext taskCtx;
+		TaskStatus taskStatus;// execute process inputs
 		processContext.setProcessStatus(new ProcessStatus(ProcessState.INPUT_DATA_STAGING));
 		GFacUtils.saveAndPublishProcessStatus(processContext);
 		List<InputDataObjectType> processInputs = processContext.getProcessModel().getProcessInputs();
@@ -161,7 +182,7 @@ public class GFacEngineImpl implements GFacEngine {
 		if (processInputs != null) {
 			for (InputDataObjectType processInput : processInputs) {
 				if (processContext.isHandOver()) {
-					return;
+					return true;
 				}
 				DataType type = processInput.getType();
 				switch (type) {
@@ -178,7 +199,7 @@ public class GFacEngineImpl implements GFacEngine {
 						saveTaskModel(taskCtx);
 						GFacUtils.saveAndPublishTaskStatus(taskCtx);
 						Task dMoveTask = Factory.getDataMovementTask(processContext.getDataMovementProtocol());
-						taskStatus = executeTask(taskCtx, dMoveTask);
+						taskStatus = executeTask(taskCtx, dMoveTask, false);
 						if (taskStatus.getState() == TaskState.FAILED) {
 							log.error("expId: {}, processId: {}, taskId: {} type: {},:- Input statging failed, " +
 									"reason:" + " {}", taskCtx.getParentProcessContext().getExperimentId(), taskCtx
@@ -193,32 +214,57 @@ public class GFacEngineImpl implements GFacEngine {
 				}
 			}
 		}
+		return processContext.isHandOver();
+	}
+
+	private boolean configureWorkspace(ProcessContext processContext, boolean recover) throws GFacException {
 		if (processContext.isHandOver()) {
-			return;
+			return true;
 		}
-		processContext.setProcessStatus(new ProcessStatus(ProcessState.EXECUTING));
+		TaskContext taskCtx;
+		processContext.setProcessStatus(new ProcessStatus(ProcessState.CONFIGURING_WORKSPACE));
 		GFacUtils.saveAndPublishProcessStatus(processContext);
-		taskCtx = getJobSubmissionTaskContext(processContext);
+		// Run all environment setup tasks
+		taskCtx = getEnvSetupTaskContext(processContext);
 		saveTaskModel(taskCtx);
 		GFacUtils.saveAndPublishTaskStatus(taskCtx);
-		JobSubmissionTask jobSubmissionTask = Factory.getJobSubmissionTask(processContext.getJobSubmissionProtocol());
-		if (processContext.isHandOver()) {
-			return;
-		}
-		taskStatus = executeTask(taskCtx, jobSubmissionTask);
+		SSHEnvironmentSetupTask envSetupTask = new SSHEnvironmentSetupTask();
+		TaskStatus taskStatus = executeTask(taskCtx, envSetupTask, recover);
 		if (taskStatus.getState() == TaskState.FAILED) {
-			throw new GFacException("Job submission task failed");
-		}
-		processContext.setTaskChain(taskChain);
-		if (processContext.isHandOver()) {
-			return;
+			log.error("expId: {}, processId: {}, taskId: {} type: {},:- Input statging failed, " +
+					"reason:" + " {}", taskCtx.getParentProcessContext().getExperimentId(), taskCtx
+					.getParentProcessContext().getProcessId(), taskCtx.getTaskId(), envSetupTask.getType
+					().name(), taskStatus.getReason());
+			throw new GFacException("Error while environment setup");
 		}
+		return processContext.isHandOver();
 	}
 
 
 	@Override
 	public void recoverProcess(ProcessContext processContext) throws GFacException {
-
+		ProcessState state = processContext.getProcessStatus().getState();
+		switch (state) {
+			case CREATED:
+			case VALIDATED:
+				executeProcess(processContext);
+				break;
+			case PRE_PROCESSING:
+			case CONFIGURING_WORKSPACE:
+				if (configureWorkspace(processContext, true)) return;
+				if (inputDataStaging(processContext, false))  return;
+				if (executeJobSubmission(processContext))  return;
+				break;
+			case INPUT_DATA_STAGING:
+				if (inputDataStaging(processContext, true))  return;
+				if (executeJobSubmission(processContext))  return;
+				break;
+			case EXECUTING:
+				if (executeJobSubmission(processContext))  return;
+				break;
+			default:
+				throw new GFacException("Invalid process recovery invocation");
+		}
 	}
 
 	@Override
@@ -226,13 +272,35 @@ public class GFacEngineImpl implements GFacEngine {
 		if (processContext.isHandOver()) {
 			return;
 		}
-		TaskContext taskCtx = null;
+		// exit if process is handed over to another instance while output staging.
+		if (outpuDataStaging(processContext, false)) return;
+
+		if (processContext.isHandOver()) {
+			return;
+		}
+
+		postProcessing(processContext,false);
+
+		if (processContext.isHandOver()) {
+			return;
+		}
+	}
+
+	private boolean postProcessing(ProcessContext processContext, boolean recovery) throws GFacException {
+		processContext.setProcessStatus(new ProcessStatus(ProcessState.POST_PROCESSING));
+		GFacUtils.saveAndPublishProcessStatus(processContext);
+//		taskCtx = getEnvCleanupTaskContext(processContext);
+		return processContext.isHandOver();
+	}
+
+	private boolean outpuDataStaging(ProcessContext processContext, boolean recovery) throws GFacException {
+		TaskContext taskCtx;
 		processContext.setProcessStatus(new ProcessStatus(ProcessState.OUTPUT_DATA_STAGING));
 		GFacUtils.saveAndPublishProcessStatus(processContext);
 		List<OutputDataObjectType> processOutputs = processContext.getProcessModel().getProcessOutputs();
 		for (OutputDataObjectType processOutput : processOutputs) {
 			if (processContext.isHandOver()) {
-				return;
+				return true;
 			}
 			DataType type = processOutput.getType();
 			switch (type) {
@@ -251,7 +319,7 @@ public class GFacEngineImpl implements GFacEngine {
 					saveTaskModel(taskCtx);
 					GFacUtils.saveAndPublishTaskStatus(taskCtx);
 					Task dMoveTask = Factory.getDataMovementTask(processContext.getDataMovementProtocol());
-					TaskStatus taskStatus = executeTask(taskCtx, dMoveTask);
+					TaskStatus taskStatus = executeTask(taskCtx, dMoveTask, recovery);
 					if (taskStatus.getState() == TaskState.FAILED) {
 						log.error("expId: {}, processId: {}, taskId: {} type: {},:- Input statging failed, " +
 								"reason:" + " {}", taskCtx.getParentProcessContext().getExperimentId(), taskCtx
@@ -265,17 +333,20 @@ public class GFacEngineImpl implements GFacEngine {
 					break;
 			}
 		}
-		if (processContext.isHandOver()) {
-			return;
-		}
-		processContext.setProcessStatus(new ProcessStatus(ProcessState.POST_PROCESSING));
-		GFacUtils.saveAndPublishProcessStatus(processContext);
-//		taskCtx = getEnvCleanupTaskContext(processContext);
-
+		return false;
 	}
 
 	@Override
 	public void recoverProcessOutflow(ProcessContext processContext) throws GFacException {
+		ProcessState processState = processContext.getProcessStatus().getState();
+		switch (processState) {
+			case OUTPUT_DATA_STAGING:
+				if (outpuDataStaging(processContext, true)) return;
+				if (postProcessing(processContext, false)) return;
+			case POST_PROCESSING:
+				postProcessing(processContext, true);
+				break;
+		}
 		runProcessOutflow(processContext); // TODO implement recover steps
 	}
 
@@ -284,10 +355,15 @@ public class GFacEngineImpl implements GFacEngine {
 
 	}
 
-	private TaskStatus executeTask(TaskContext taskCtx, Task task) throws GFacException {
+	private TaskStatus executeTask(TaskContext taskCtx, Task task, boolean recover) throws GFacException {
 		taskCtx.setTaskStatus(new TaskStatus(TaskState.EXECUTING));
 		GFacUtils.saveAndPublishTaskStatus(taskCtx);
-		TaskStatus taskStatus = task.execute(taskCtx);
+		TaskStatus taskStatus = null;
+		if (recover) {
+			taskStatus = task.recover(taskCtx);
+		} else {
+			taskStatus = task.execute(taskCtx);
+		}
 		taskCtx.setTaskStatus(taskStatus);
 		GFacUtils.saveAndPublishTaskStatus(taskCtx);
 		return taskCtx.getTaskStatus();

http://git-wip-us.apache.org/repos/asf/airavata/blob/1de22283/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacWorker.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacWorker.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacWorker.java
index 35b0ed6..8d3c5e0 100644
--- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacWorker.java
+++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/GFacWorker.java
@@ -78,68 +78,46 @@ public class GFacWorker implements Runnable {
 			return;
 		}
 		try {
-			ProcessType type = getProcessType(processContext);
-			try {
-				switch (type) {
-					case NEW:
-						executeProcess();
-						break;
-					case RECOVER:
-						recoverProcess();
-						break;
-					case RECOVER_MONITORING:
-						monitorProcess();
-						// TODO get monitor mode from process and get correct monitor service instead default service.
-						break;
-					case RUN_OUTFLOW:
-						// run the outflow task
+			ProcessState processState = processContext.getProcessStatus().getState();
+			switch (processState) {
+				case CREATED:
+				case VALIDATED:
+					executeProcess();
+					break;
+				case PRE_PROCESSING:
+				case CONFIGURING_WORKSPACE:
+				case INPUT_DATA_STAGING:
+				case EXECUTING:
+					recoverProcess();
+					break;
+				case MONITORING:
+					if (runOutflow) {
 						runProcessOutflow();
-						break;
-					case RECOVER_OUTFLOW:
-						// recover  outflow task;
-						recoverProcessOutflow();
-						break;
-					case COMPLETED:
-						completeProcess();
-						break;
-					case CANCELED:
-						// TODO - implement cancel scenario
-						break;
-					case FAILED:
-						// TODO - implement failed scenario
-						break;
-					default:
-						throw new GFacException("process Id : " + processId + " Couldn't identify process type");
-				}
-			} catch (GFacException e) {
-				switch (type) {
-					case NEW:
-						log.error("Process execution error", e);
-						break;
-					case RECOVER:
-						log.error("Process recover error ", e);
-						break;
-					case RECOVER_MONITORING:
-						log.error("Process monitoring recovery error", e);
-						break;
-					case RUN_OUTFLOW:
-						log.error("Process outflow execution error", e);
-						break;
-					case RECOVER_OUTFLOW:
-						log.error("Process outflow recover error", e);
-						break;
-					case COMPLETED:
-						log.error("Process completion error", e);
-						break;
-					case CANCELED: // TODO - implement cancel scenario
-					case FAILED: // TODO - implement failed scenario
-						break;
-				}
-				throw e;
+					} else {
+						monitorProcess();
+					}
+					break;
+				case OUTPUT_DATA_STAGING:
+				case POST_PROCESSING:
+					recoverProcessOutflow();
+					break;
+				case COMPLETED:
+					completeProcess();
+					break;
+				case CANCELED:
+					// TODO - implement cancel scenario
+					break;
+				case FAILED:
+					// TODO - implement failed scenario
+					break;
+				default:
+					throw new GFacException("process Id : " + processId + " Couldn't identify process type");
 			}
 		} catch (GFacException e) {
 			log.error("GFac Worker throws an exception", e);
-			processContext.setProcessStatus(new ProcessStatus(ProcessState.FAILED));
+			ProcessStatus status = new ProcessStatus(ProcessState.FAILED);
+			status.setReason(e.getMessage());
+			processContext.setProcessStatus(status);
 			try {
 				GFacUtils.saveAndPublishProcessStatus(processContext);
 			} catch (GFacException e1) {
@@ -168,9 +146,8 @@ public class GFacWorker implements Runnable {
 	}
 
 	private void recoverProcess() throws GFacException {
-		// recover the process
-		//	engine.recoverProcess(processContext);
-		executeProcess(); // TODO - implement recover process.
+		engine.recoverProcess(processContext);
+		monitorProcess();
 	}
 
 	private void executeProcess() throws GFacException {
@@ -210,48 +187,4 @@ public class GFacWorker implements Runnable {
 		}
 	}
 
-	private ProcessType getProcessType(ProcessContext processContext) {
-		// check the status and return correct type of process.
-		switch (processContext.getProcessState()) {
-			case CREATED:
-			case VALIDATED:
-				return ProcessType.NEW;
-			case PRE_PROCESSING:
-			case CONFIGURING_WORKSPACE:
-			case INPUT_DATA_STAGING:
-			case EXECUTING:
-				return ProcessType.RECOVER;
-			case MONITORING:
-				if (runOutflow) {
-					return ProcessType.RUN_OUTFLOW; // execute outflow
-				} else {
-					return ProcessType.RECOVER_MONITORING; // hand over to monitor task
-				}
-			case OUTPUT_DATA_STAGING:
-			case POST_PROCESSING:
-				return ProcessType.RECOVER_OUTFLOW;
-			case COMPLETED:
-				return ProcessType.COMPLETED;
-			case CANCELED:
-				return ProcessType.CANCELED;
-			case FAILED:
-				return ProcessType.FAILED;
-			//case CANCELLING: // TODO: handle this
-			default:
-				// this will never hit as we have handle all states in cases.
-				return ProcessType.NEW;
-		}
-	}
-
-
-	private enum ProcessType {
-		NEW,
-		RECOVER,
-		RECOVER_MONITORING,
-		RUN_OUTFLOW,
-		RECOVER_OUTFLOW,
-		CANCELED,
-		FAILED,
-		COMPLETED
-	}
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/1de22283/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
index efa0641..bd0b541 100644
--- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
+++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/monitor/email/EmailBasedMonitor.java
@@ -274,8 +274,8 @@ public class EmailBasedMonitor implements JobMonitor, Runnable{
             log.info("[EJM]: Job Queued email received, " + jobDetails);
         }else if (resultState == JobState.ACTIVE) {
             // nothing special thing to do, update the status change to rabbit mq at the end of this method.
-	        jobStatus.setJobState(JobState.QUEUED);
-	        jobStatus.setReason("Queued email received");
+	        jobStatus.setJobState(JobState.ACTIVE);
+	        jobStatus.setReason("Active email received");
             log.info("[EJM]: Job Active email received, " + jobDetails);
         }else if (resultState == JobState.FAILED) {
             jobMonitorMap.remove(jobStatusResult.getJobId());

http://git-wip-us.apache.org/repos/asf/airavata/blob/1de22283/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
index ae3d73b..5030846 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/impl/ExperimentRegistry.java
@@ -35,6 +35,7 @@ import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel
 import org.apache.airavata.model.status.*;
 import org.apache.airavata.model.task.TaskModel;
 import org.apache.airavata.registry.core.experiment.catalog.ExpCatResourceUtils;
+import org.apache.airavata.registry.core.experiment.catalog.ExperimentCatResource;
 import org.apache.airavata.registry.core.experiment.catalog.ResourceType;
 import org.apache.airavata.registry.core.experiment.catalog.resources.*;
 import org.apache.airavata.registry.core.experiment.catalog.utils.ThriftDataModelConversion;
@@ -1175,7 +1176,23 @@ public class ExperimentRegistry {
                 List<JobResource> resources = processResource.getJobList();
                 for (JobResource jobResource : resources) {
                     JobModel jobModel = ThriftDataModelConversion.getJobModel(jobResource);
-                    jobs.add(jobModel);
+	                List<ExperimentCatResource> jobStatuses = jobResource.get(ResourceType.JOB_STATUS);
+	                JobStatusResource latestSR  = null;
+	                for (ExperimentCatResource jobStatuse : jobStatuses) {
+		                JobStatusResource jobSR = (JobStatusResource) jobStatuse;
+		                if (latestSR == null) {
+			                latestSR = jobSR;
+		                } else {
+			                latestSR = (jobSR.getTimeOfStateChange().after(latestSR.getTimeOfStateChange()) ? jobSR :
+					                latestSR);
+		                }
+	                }
+	                if (latestSR != null) {
+		                JobStatus jobStatus = new JobStatus(JobState.valueOf(latestSR.getState()));
+		                jobStatus.setReason(latestSR.getReason());
+		                jobModel.setJobStatus(jobStatus);
+	                }
+	                jobs.add(jobModel);
                 }
                 return jobs;
             } else {

http://git-wip-us.apache.org/repos/asf/airavata/blob/1de22283/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/resources/Utils.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/resources/Utils.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/resources/Utils.java
index d7def01..8fba449 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/resources/Utils.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/resources/Utils.java
@@ -648,6 +648,7 @@ public class Utils {
         JobResource jobResource = new JobResource();
         if (o != null){
             jobResource.setJobId(o.getJobId());
+	        jobResource.setProcessId(o.getProcessId());
             jobResource.setTaskId(o.getTaskId());
             jobResource.setCreationTime(o.getCreationTime());
             jobResource.setJobDescription(o.getJobDescription());
@@ -662,7 +663,9 @@ public class Utils {
         JobStatusResource jobStatusResource = new JobStatusResource();
         if (o != null){
             jobStatusResource.setJobId(o.getJobId());
-            jobStatusResource.setState(o.getState());
+	        jobStatusResource.setStatusId(o.getStatusId());
+	        jobStatusResource.setProcessId(o.getProcessId());
+	        jobStatusResource.setState(o.getState());
             jobStatusResource.setTimeOfStateChange(o.getTimeOfStateChange());
             jobStatusResource.setReason(o.getReason());
         }

http://git-wip-us.apache.org/repos/asf/airavata/blob/1de22283/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/utils/ThriftDataModelConversion.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/utils/ThriftDataModelConversion.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/utils/ThriftDataModelConversion.java
index e1ebdeb..0c954f7 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/utils/ThriftDataModelConversion.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/experiment/catalog/utils/ThriftDataModelConversion.java
@@ -394,8 +394,9 @@ public class ThriftDataModelConversion {
 
     public static JobModel getJobModel (JobResource jobResource) throws RegistryException {
         JobModel model = new JobModel();
-        model.setJobId(jobResource.getJobId());
-        model.setTaskId(jobResource.getTaskId());
+	    model.setJobId(jobResource.getJobId());
+	    model.setProcessId(jobResource.getProcessId());
+	    model.setTaskId(jobResource.getTaskId());
         model.setJobDescription(jobResource.getJobDescription());
         model.setCreationTime(jobResource.getCreationTime().getTime());
         model.setComputeResourceConsumed(jobResource.getComputeResourceConsumed());