void ITaskQueue.TaskFailed(Task task, ErrorReport errorReport) { Contract.Requires<ArgumentNullException>(task != null); Contract.Requires<ArgumentNullException>(errorReport != null); Contract.Requires<ArgumentException>(task.State == TaskState.Processing); Contract.Ensures(task.State == TaskState.Failed); Contract.Ensures(task.Error == errorReport); throw new NotImplementedException(); }
/// <summary> /// Informs scheduler that task with id = <paramref name="taskId"/> has thrown an exception <paramref name="exception"/>. /// </summary> /// <param name="taskId"> /// Task's unique identifier. /// </param> /// <param name="exception"> /// Error report. /// </param> public void FailTask(Guid taskId, ErrorReport exception) { Contract.Requires<InvalidOperationException>(currentTask != null); Contract.Requires<InvalidOperationException>(taskId == currentTask.Id); Contract.Ensures(currentTask == null); taskQueue.TaskFailed(currentTask, exception); Logger.Write( LogCategories.Information(string.Format("Task {0} failed on {1}", currentTask, RemoteAddress), LogCategories.TaskServices, LogCategories.TaskProviderService)); Trace.WriteLine(string.Format("Task {0} is failed: {1}", currentTask, exception.Error)); DiscardTask(); }
/// <summary> /// Informs task queue that specified <paramref name="task"/> has failed. /// </summary> /// <param name="task"> /// An instance of <see cref="Task"/> that failed. /// </param> /// <param name="errorReport"> /// Error report. /// </param> public void TaskFailed(Task task, ErrorReport errorReport) { lock (task) { FromProcessing(task, terminateProcessing: false); ToFailed(task); task.Error = errorReport; var job = task.Job; lock (job) { Logger.Write( LogCategories.Error( string.Format("Task {0} failed because of {1}. This caused job {2} to fail.", task, errorReport.Error, task.Job), LogCategories.TaskServices, LogCategories.TaskQueue)); job.State = JobState.Failed; foreach (var t in task.Job.Tasks) { lock (t) { switch (t.State) { case TaskState.NotReady: FromNotReady(t); break; case TaskState.Processing: FromProcessing(t); break; case TaskState.Failed: continue; case TaskState.Pending: FromPending(t); break; case TaskState.Completed: FromCompleted(t); break; default: throw new InvalidOperationException( string.Format("Task {0} has unexpected state {1} on TaskQueue::TaskFailed()", task, task.State)); } ToFailed(t); } } } } }