private TaskExecutionStatus StartTask(string taskId, long sequenceId) { lock (_lock) { TaskBase task = (TaskBase)submittedTasks[taskId]; if (task != null) { submittedTasks.Remove(taskId); if (SlotAvailable) { if (sequenceId == lastRunningTaskId + 1) { try { if (!runningTasks.ContainsKey(task.TaskId)) { runningTasks.Add(task.TaskId, task); } if (_context.PerfStatsColl != null) { _context.PerfStatsColl.IncrementRunningTasks(); } lastRunningTaskId++; task.StartTask(); } catch (Exception exx) { task.StopTask(); task.Dispose(); if (runningTasks.ContainsKey(task.TaskId)) { runningTasks.Remove(task.TaskId); if (_context.PerfStatsColl != null) { _context.PerfStatsColl.DecrementRunningTasks(); } } throw new OperationFailedException(exx.Message); } while (taskSequenceList.Count != 0 && SlotAvailable) { long seqID = 0; foreach (long key in taskSequenceList.Keys) { seqID = key; break; } if (seqID == lastRunningTaskId + 1) { if (waitingTasks.Count > 0) { TaskBase t = (TaskBase)waitingTasks[taskSequenceList[seqID]]; try { if (!runningTasks.ContainsKey(t.TaskId)) { runningTasks.Add(t.TaskId, t); } if (_context.PerfStatsColl != null) { _context.PerfStatsColl.IncrementRunningTasks(); } lastRunningTaskId++; taskSequenceList.Remove(seqID); waitingTasks.Remove(t.TaskId); if (_context.PerfStatsColl != null) { _context.PerfStatsColl.DecrementWaitingTasks(); } t.StartTask(); } catch (Exception exx) { t.StopTask(); if (runningTasks.ContainsKey(t.TaskId)) { runningTasks.Remove(t.TaskId); if (_context.PerfStatsColl != null) { _context.PerfStatsColl.DecrementRunningTasks(); } } throw new OperationFailedException(exx.Message); } } } else { break; } } return(TaskExecutionStatus.Running); } else { taskSequenceList.Add(sequenceId, task.TaskId); if (!waitingTasks.ContainsKey(task.TaskId)) { waitingTasks.Add(task.TaskId, task); } if (_context.PerfStatsColl != null) { _context.PerfStatsColl.IncrementWaitingTasks(); } if (_context.NCacheLog.IsInfoEnabled) { _context.NCacheLog.Info("TaskTracker.StartTask", "MapReduce task with task ID '" + task.TaskId.ToUpper() + "' is in the waiting queue."); } return(TaskExecutionStatus.Waiting); } } else if (taskSequenceList.Count < _queueSize) { taskSequenceList.Add(sequenceId, task.TaskId); if (!waitingTasks.ContainsKey(task.TaskId)) { waitingTasks.Add(task.TaskId, task); } if (_context.PerfStatsColl != null) { _context.PerfStatsColl.IncrementWaitingTasks(); } if (_context.NCacheLog.IsInfoEnabled) { _context.NCacheLog.Info("TaskTracker.StartTask", "MapReduce task with task ID '" + task.TaskId.ToUpper() + "' is in the waiting queue."); } return(TaskExecutionStatus.Waiting); } else { throw new Exception("No more task can be submitted"); } } } return(TaskExecutionStatus.Failure); }
public void OnTaskCallback(CallbackResult callbackInfo) { if (callbackInfo != null) { TaskBase task = callbackInfo.Task; if (runningTasks.ContainsKey(task.TaskId)) { if (_context.CacheImpl != null && _context.CacheInternal != null) { EventContext eventContext = new EventContext(); eventContext.TaskStatus = callbackInfo.Status; eventContext.TaskFailureReason = callbackInfo.FailureReason; _context.CacheInternal.NotifyTaskCallback(task.TaskId, task.CallbackListeners, false, null, eventContext); } TaskBase runningT = (TaskBase)runningTasks[task.TaskId]; if (runningT != null) { runningT.StopTask(); } runningTasks.Remove(task.TaskId); // decrementing running tasks if (_context.PerfStatsColl != null) { _context.PerfStatsColl.DecrementRunningTasks(); } // Additional set of counter if (runningTasks.Count == 0 && _context.PerfStatsColl != null) { _context.PerfStatsColl.RunningTasksCount(0); } if (taskSequenceList.Count > 0) { KeyValuePair <long, string> entry = new KeyValuePair <long, string>(); try { foreach (KeyValuePair <long, string> kvp in taskSequenceList) { entry = kvp; break; } if (!entry.Key.Equals(null) && !entry.Value.Equals(null)) { TaskBase t = (TaskBase)waitingTasks[entry.Value]; if (t != null) { t.StartTask(); } if (!runningTasks.ContainsKey(t.TaskId)) { runningTasks.Add(t.TaskId, t); } // incrementing running tasks if (_context.PerfStatsColl != null) { _context.PerfStatsColl.IncrementRunningTasks(); } lastRunningTaskId++; // decrementing waiting tasks. if (_context.PerfStatsColl != null) { _context.PerfStatsColl.DecrementWaitingTasks(); } taskSequenceList.Remove(entry.Key); // remove the entry waitingTasks.Remove(t.TaskId); if (waitingTasks.Count == 0) { if (_context.PerfStatsColl != null) { _context.PerfStatsColl.WaitingTasksCount(0); } } } } catch (Exception ex) { } } } } }