use of org.ow2.proactive.scheduler.common.NotificationData in project scheduling by ow2-proactive.
the class InternalJob method replicateForNextLoopIteration.
public boolean replicateForNextLoopIteration(InternalTask initiator, InternalTask target, ChangedTasksInfo changesInfo, SchedulerStateUpdate frontend, FlowAction action) {
LOGGER.info("LOOP (init:" + initiator.getId() + "; target:" + target.getId() + ")");
// accumulates the tasks between the initiator and the target
Map<TaskId, InternalTask> dup = new HashMap<>();
// replicate the tasks between the initiator and the target
try {
initiator.replicateTree(dup, target.getId(), true, initiator.getReplicationIndex(), initiator.getIterationIndex());
} catch (ExecutableCreationException e) {
LOGGER.error("", e);
return false;
}
((JobInfoImpl) this.getJobInfo()).setNumberOfPendingTasks(this.getJobInfo().getNumberOfPendingTasks() + dup.size());
// time-consuming but safe
for (InternalTask nt : dup.values()) {
boolean ok;
do {
ok = true;
for (InternalTask task : tasks.values()) {
if (nt.getName().equals(task.getName())) {
nt.setIterationIndex(nt.getIterationIndex() + 1);
ok = false;
}
}
} while (!ok);
}
// configure the new tasks
InternalTask newTarget = null;
InternalTask newInit = null;
for (Entry<TaskId, InternalTask> it : dup.entrySet()) {
InternalTask nt = it.getValue();
if (target.getId().equals(it.getKey())) {
newTarget = nt;
}
if (initiator.getId().equals(it.getKey())) {
newInit = nt;
}
nt.setJobInfo(getJobInfo());
this.addTask(nt);
assignReplicationTag(nt, initiator, true, action);
}
changesInfo.newTasksAdded(dup.values());
// connect replicated tree
newTarget.addDependence(initiator);
changesInfo.taskUpdated(newTarget);
// connect mergers
List<InternalTask> mergers = new ArrayList<>();
for (InternalTask t : this.tasks.values()) {
if (t.getIDependences() != null) {
for (InternalTask p : t.getIDependences()) {
if (p.getId().equals(initiator.getId())) {
if (!t.equals(newTarget)) {
mergers.add(t);
}
}
}
}
}
for (InternalTask t : mergers) {
t.getIDependences().remove(initiator);
t.addDependence(newInit);
changesInfo.taskUpdated(t);
}
// propagate the changes in the job descriptor
getJobDescriptor().doLoop(initiator.getId(), dup, newTarget, newInit);
this.jobInfo.setTasksChanges(changesInfo, this);
// notify frontend that tasks were added and modified
frontend.jobStateUpdated(this.getOwner(), new NotificationData<JobInfo>(SchedulerEvent.TASK_REPLICATED, new JobInfoImpl(jobInfo)));
frontend.jobUpdatedFullData(this);
this.jobInfo.clearTasksChanges();
return true;
}
use of org.ow2.proactive.scheduler.common.NotificationData in project scheduling by ow2-proactive.
the class TerminateReplicateTaskHandler method terminateReplicateTask.
public boolean terminateReplicateTask(FlowAction action, InternalTask initiator, ChangedTasksInfo changesInfo, SchedulerStateUpdate frontend, TaskId taskId) {
int runs = action.getDupNumber();
logger.info("Control Flow Action REPLICATE (runs:" + runs + ")");
List<InternalTask> toReplicate = new ArrayList<>();
// find the tasks that need to be replicated
for (InternalTask internalTask : internalJob.getIHMTasks().values()) {
List<InternalTask> internalTaskDependencies = internalTask.getIDependences() == null ? new ArrayList<InternalTask>() : internalTask.getIDependences();
for (InternalTask internalTaskDependency : internalTaskDependencies) {
if (isTheInitiatorTask(initiator, toReplicate, internalTask, internalTaskDependency)) {
if (runs < 1) {
skipReplication(initiator, changesInfo, internalTask);
break;
} else {
toReplicate.add(internalTask);
}
}
}
}
// for each initial task to replicate
for (InternalTask internalTaskToReplicate : toReplicate) {
// determine the target of the replication whether it is a block or
// a single task
InternalTask target = null;
// target is a task block start : replication of the block
if (internalTaskToReplicate.getFlowBlock().equals(FlowBlock.START)) {
String tg = internalTaskToReplicate.getMatchingBlock();
for (InternalTask internalTask : internalJob.getIHMTasks().values()) {
if (tg.equals(internalTask.getName()) && !(internalTask.getStatus().equals(TaskStatus.FINISHED) || internalTask.getStatus().equals(TaskStatus.SKIPPED)) && internalTask.dependsOn(internalTaskToReplicate)) {
target = internalTask;
break;
}
}
if (target == null) {
logger.error("REPLICATE: could not find matching block '" + tg + "'");
continue;
}
} else // target is not a block : replication of the task
{
target = internalTaskToReplicate;
}
// for each number of parallel run
for (int i = 1; i < runs; i++) {
// accumulates the tasks between the initiator and the target
Map<TaskId, InternalTask> tasksBetweenInitiatorAndTarget = new HashMap<>();
// replicate the tasks between the initiator and the target
try {
target.replicateTree(tasksBetweenInitiatorAndTarget, internalTaskToReplicate.getId(), false, initiator.getReplicationIndex() * runs, 0);
} catch (Exception e) {
logger.error("REPLICATE: could not replicate tree", e);
break;
}
((JobInfoImpl) internalJob.getJobInfo()).setNumberOfPendingTasks(((JobInfoImpl) internalJob.getJobInfo()).getNumberOfPendingTasks() + tasksBetweenInitiatorAndTarget.size());
// pointers to the new replicated tasks corresponding the begin
// and
// the end of the block ; can be the same
InternalTask newTarget = null;
InternalTask newEnd = null;
// configure the new tasks
for (InternalTask internalTask : tasksBetweenInitiatorAndTarget.values()) {
internalTask.setJobInfo(((JobInfoImpl) internalJob.getJobInfo()));
int dupIndex = getNextReplicationIndex(InternalTask.getInitialName(internalTask.getName()), internalTask.getIterationIndex());
internalJob.addTask(internalTask);
internalTask.setReplicationIndex(dupIndex);
assignReplicationTag(internalTask, initiator, false, action);
}
changesInfo.newTasksAdded(tasksBetweenInitiatorAndTarget.values());
// find the beginning and the ending of the replicated block
for (Entry<TaskId, InternalTask> tasksBetweenInitiatorAndTargetEntry : tasksBetweenInitiatorAndTarget.entrySet()) {
InternalTask internalBlockTask = tasksBetweenInitiatorAndTargetEntry.getValue();
// initiator
if (internalTaskToReplicate.getId().equals(tasksBetweenInitiatorAndTargetEntry.getKey())) {
newTarget = internalBlockTask;
newTarget.addDependence(initiator);
// no need to add newTarget to modifiedTasks
// because newTarget is among dup.values(), and we
// have added them all
}
// connect the last task of the block with the merge task(s)
if (target.getId().equals(tasksBetweenInitiatorAndTargetEntry.getKey())) {
newEnd = internalBlockTask;
List<InternalTask> toAdd = new ArrayList<>();
// find the merge tasks ; can be multiple
for (InternalTask internalTask : internalJob.getIHMTasks().values()) {
List<InternalTask> pdeps = internalTask.getIDependences();
if (pdeps != null) {
for (InternalTask parent : pdeps) {
if (parent.getId().equals(target.getId())) {
toAdd.add(internalTask);
}
}
}
}
// connect the merge tasks
for (InternalTask internalTask : toAdd) {
internalTask.addDependence(newEnd);
changesInfo.taskUpdated(internalTask);
}
}
}
// propagate the changes on the JobDescriptor
internalJob.getJobDescriptor().doReplicate(taskId, tasksBetweenInitiatorAndTarget, newTarget, target.getId(), newEnd.getId());
}
}
// notify frontend that tasks were added to the job
((JobInfoImpl) internalJob.getJobInfo()).setTasksChanges(changesInfo, internalJob);
if (frontend != null) {
frontend.jobStateUpdated(internalJob.getOwner(), new NotificationData<>(SchedulerEvent.TASK_REPLICATED, internalJob.getJobInfo()));
frontend.jobStateUpdated(internalJob.getOwner(), new NotificationData<>(SchedulerEvent.TASK_SKIPPED, internalJob.getJobInfo()));
frontend.jobUpdatedFullData(internalJob);
}
((JobInfoImpl) internalJob.getJobInfo()).clearTasksChanges();
// no jump is performed ; now that the tasks have been replicated and
// configured, the flow can continue its normal operation
internalJob.getJobDescriptor().terminate(taskId);
return true;
}
use of org.ow2.proactive.scheduler.common.NotificationData in project scheduling by ow2-proactive.
the class SubmitJob method jobStateUpdatedEvent.
// get the running to finished event of my job
public void jobStateUpdatedEvent(NotificationData<JobInfo> notification) {
if (myJobId.equals(notification.getData().getJobId())) {
// test if it is my job
System.out.print("Job " + myJobId + " terminated in ");
// get the job result
try {
// 1. get the job result
JobResult result = user.getJobResult(myJobId);
System.out.println(result.getJobInfo().getFinishedTime() - result.getJobInfo().getStartTime() + "ms");
// notify the test that it is terminated
user.removeJob(notification.getData().getJobId());
} catch (Throwable e) {
e.printStackTrace();
}
}
}
use of org.ow2.proactive.scheduler.common.NotificationData in project scheduling by ow2-proactive.
the class SubmitJob method taskStateUpdatedEvent.
public void taskStateUpdatedEvent(NotificationData<TaskInfo> notif) {
try {
System.out.println("Task '" + notif.getData().getTaskId() + "' result received !!");
TaskResult result = user.getTaskResult(notif.getData().getJobId(), notif.getData().getTaskId().getReadableName());
terminated++;
System.out.println("(" + terminated + ")Result value = " + result.value());
} catch (Throwable t) {
t.printStackTrace();
}
}
use of org.ow2.proactive.scheduler.common.NotificationData in project scheduling by ow2-proactive.
the class JobResultSchedulerListener method jobRunningToFinishedEvent.
private void jobRunningToFinishedEvent(NotificationData<JobInfo> jobNotification) {
JobId jobId = jobNotification.getData().getJobId();
logger.trace("Trying to get the job result for job " + jobId);
try {
logger.info("The result for job with ID " + jobId + " is " + this.daddy.getJobResult(jobId));
} catch (SchedulerException e) {
logger.error("Cannot get the job result for job with id " + jobId + " from the scheduler", e);
}
}
Aggregations