public synchronized void updateTaskStatuses(TaskTrackerStatus taskTrackerStatus) {
		for (TaskStatus taskStatus : taskTrackerStatus.getTaskStatusList()) {
			TaskAttemptID taskAttemptID = taskStatus.getTaskAttemptID();
			JobInProgress jobInProgress = jobMap.get(taskStatus.getTaskAttemptID().getTaskInProgressID().getJobID());

			if (jobInProgress == null) {
				Log.warn("Get states for unknown job in progress");
				return;
			}

			TaskInProgress taskInProgress = taskAttemptToTaskInProgressMap.get(taskAttemptID);
			if (taskInProgress != null) {
				State oldJobInProgressState = jobInProgress.getState().clone();
				jobInProgress.updateTaskStatus(taskInProgress, taskStatus);
				State newJobInProgressState = jobInProgress.getState().clone();
				// State changed, update updateJobInProgressListeners
				if (!oldJobInProgressState.equals(newJobInProgressState)) {
					if (newJobInProgressState.isFinish()) {
						// Job finished
						taskScheduler.updateJob(jobInProgress, JobScheduleEvent.JOB_FINISHED);
					} else if (newJobInProgressState.isFailed()) {
						// Job failed
						taskScheduler.updateJob(jobInProgress, JobScheduleEvent.JOB_FAILED);
					}
				}
			} else {
				Log.warn("Get states for unknown task in progress");
			}
		}
		return;
	}