Exemplo n.º 1
0
        private object RegisterTaskNotification(MapReduceOperation operation)
        {
            string taskID = (string)operation.TaskID;

            if (taskID == null || string.IsNullOrEmpty(taskID))
            {
                throw new OperationFailedException("Task can not be null or empty");
            }

            TaskBase t = null;

            if (runningTasks.ContainsKey(taskID))
            {
                t = (TaskBase)runningTasks[taskID];
                t.AddTaskCallbackInfo((TaskCallbackInfo)operation.CallbackInfo);
            }
            else if (waitingTasks.ContainsKey(taskID))
            {
                t = (TaskBase)waitingTasks[taskID];
                t.AddTaskCallbackInfo((TaskCallbackInfo)operation.CallbackInfo);
            }
            else if (taskOutputStore != null && taskOutputStore.TaskOutputExists(taskID))
            {
                //Put listener info into taskoutput and then call notify client async
                TaskOutput output = taskOutputStore.TaskOutput(taskID);
                if (output != null)
                {
                    output.AddToListeners(operation.CallbackInfo);
                }

                if (_context.CacheImpl != null && _context.CacheInternal != null)
                {
                    EventContext eventContext = new EventContext();
                    eventContext.TaskStatus = TaskStatus.Success;

                    IList listeners = new ArrayList();
                    listeners.Add((TaskCallbackInfo)operation.CallbackInfo);

                    _context.CacheInternal.NotifyTaskCallback(taskID, listeners, true, null, eventContext);
                }
            }
            else if (this.cancelledTask.Contains(taskID))
            {
                throw new OperationFailedException("Task with Specified TaskId was cancelled.");
            }
            else
            {
                throw new OperationFailedException("Task with Specified Task id does not exists");
            }

            return(true);
        }
Exemplo n.º 2
0
        private object UnregisterTaskNotification(MapReduceOperation operation)
        {
            String taskID = (String)operation.TaskID;

            if (taskID == null || string.IsNullOrEmpty(taskID))
            {
                throw new OperationFailedException("Task can not be null or empty");
            }

            TaskBase t = null;

            if (runningTasks.ContainsKey(taskID))
            {
                t = (TaskBase)runningTasks[taskID];
                t.RemoveTaskCallbackInfo((TaskCallbackInfo)operation.CallbackInfo);
            }
            else if (waitingTasks.ContainsKey(taskID))
            {
                t = (TaskBase)waitingTasks[taskID];
                t.RemoveTaskCallbackInfo((TaskCallbackInfo)operation.CallbackInfo);
            }
            else if (taskOutputStore != null && taskOutputStore.TaskOutputExists(taskID))
            {
                //remove listener info from taskoutput
                TaskOutput output = taskOutputStore.TaskOutput(taskID);
                if (output != null)
                {
                    output.RemoveFromListeners(operation.CallbackInfo);
                }
            }
            else if (this.cancelledTask.Contains(taskID))
            {
                throw new OperationFailedException("Task with Specified TaskId was cancelled.");
            }
            else
            {
                throw new OperationFailedException("Task with Specified Task id does not exists");
            }

            return(true);
        }
Exemplo n.º 3
0
        private object CancelTask(MapReduceOperation operation)
        {
            string taskID = (string)operation.TaskID;

            lock (_lock)
            {
                if (runningTasks.ContainsKey(taskID))
                {
                    TaskBase t = (TaskBase)runningTasks[taskID];
                    t.StopTask();
                    t.Dispose();

                    this.cancelledTask.Add(taskID);

                    if (_context.CacheImpl != null && _context.CacheInternal != null)
                    {
                        EventContext eventContext = new EventContext();
                        eventContext.TaskStatus        = TaskStatus.Cancelled;
                        eventContext.TaskFailureReason = "Task was Cancelled by user.";
                        _context.CacheInternal.NotifyTaskCallback(t.TaskId, t.CallbackListeners, false, null, eventContext);
                    }
                    runningTasks.Remove(taskID);
                    if (_context.PerfStatsColl != null)
                    {
                        _context.PerfStatsColl.DecrementRunningTasks();
                    }
                    if (_context.NCacheLog.IsInfoEnabled)
                    {
                        _context.NCacheLog.Info("TaskTracker.CancelTask", "Task with task ID '" + taskID.ToUpper() + "' has been cancelled.");
                    }
                }
                else
                {
                    _context.NCacheLog.Error("TaskTracker.CancelTask", "Task with task ID '" + taskID.ToUpper() + "' does not exist.");
                }
            }
            return(true);
        }
Exemplo n.º 4
0
        private TaskExecutionStatus SubmitTask(TaskBase task)
        {
            if (_context.NCacheLog.IsInfoEnabled)
            {
                _context.NCacheLog.Info("TaskTracker.SubmitTask", "Task with TaskId '" + task.TaskId + "' is submitted successfully.");
            }

            lock (_lock)
            {
                if (submittedTasks != null)
                {
                    if (!submittedTasks.ContainsKey(task.TaskId))
                    {
                        submittedTasks.Add(task.TaskId, task);
                    }
                    return(TaskExecutionStatus.Submitted);
                }
                else
                {
                    return(TaskExecutionStatus.Failure);
                }
            }
        }
Exemplo n.º 5
0
        public void RemoveDeadClientsTasks(ArrayList clients)
        {
            //Locking with starttask
            lock (_lock) {
                //Removing callback entries of dead clients from waiting tasks
                ICollection waitingTaskList = waitingTasks.Keys;
                for (IEnumerator it = clients.GetEnumerator(); it.MoveNext();)
                {
                    string client = (string)it.Current;
                    if (_context.NCacheLog.IsInfoEnabled)
                    {
                        _context.NCacheLog.Info("TaskTracker.RemoveDeadClients", "Removing waiting task listeners for client " + client);
                    }
                    foreach (string taskId in waitingTaskList)
                    {
                        TaskBase t = (TaskBase)waitingTasks[taskId];
                        if (t != null && t.CallbackListeners.Count != 0)
                        {
                            for (IEnumerator cbit = t.CallbackListeners.GetEnumerator(); cbit.MoveNext();)
                            {
                                TaskCallbackInfo taskCallbackInfo = (TaskCallbackInfo)cbit.Current;
                                if (taskCallbackInfo.Client.Equals(client))
                                {
                                    t.CallbackListeners.Remove(taskCallbackInfo);
                                }
                            }
                            if (t.CallbackListeners.Count == 0)
                            {
                                if (_context.NCacheLog.IsInfoEnabled)
                                {
                                    _context.NCacheLog.Info("TaskTracker.RemoveDeadClients", "No listeners remaining therefore removing waiting task " + t.TaskId);
                                }
                                waitingTasks.Remove(t.TaskId);
                                if (_context.PerfStatsColl != null)
                                {
                                    _context.PerfStatsColl.DecrementWaitingTasks();
                                }
                            }
                        }
                    }
                }
                //Removing callback entries of dead clients from running tasks
                ICollection runningTaskList = runningTasks.Keys;

                for (IEnumerator it = clients.GetEnumerator(); it.MoveNext();)
                {
                    string client = (string)it.Current;
                    if (_context.NCacheLog.IsInfoEnabled)
                    {
                        _context.NCacheLog.Info("TaskTracker.RemoveDeadClients", "Removing running task listeners for client " + client);
                    }
                    foreach (string taskId in runningTaskList)
                    {
                        TaskBase t = (TaskBase)runningTasks[taskId];
                        if (t != null && t.CallbackListeners.Count != 0)
                        {
                            for (IEnumerator cbit = t.CallbackListeners.GetEnumerator(); cbit.MoveNext();)
                            {
                                TaskCallbackInfo taskCallbackInfo = (TaskCallbackInfo)cbit.Current;
                                if (taskCallbackInfo.Client.Equals(client))
                                {
                                    t.CallbackListeners.Remove(taskCallbackInfo);
                                }
                            }
                            if (t.CallbackListeners.Count == 0)
                            {
                                if (_context.NCacheLog.IsInfoEnabled)
                                {
                                    _context.NCacheLog.Info("TaskTracker.RemoveDeadClients", "No listeners remaining therefore removing running task " + t.TaskId);
                                }
                                waitingTasks.Remove(t.TaskId);
                                if (_context.PerfStatsColl != null)
                                {
                                    _context.PerfStatsColl.DecrementWaitingTasks();
                                }
                            }
                        }
                    }
                }
            }
            //Remove Iterators from the task output list
            //Remove Listeners for these clients
        }
Exemplo n.º 6
0
        private object CancelAllTasks(bool topologyChanged)
        {
            //Stop and Remove all running/waiting tasks
            lock (_lock)
            {
                foreach (object taskID in runningTasks.Keys)
                {
                    TaskBase t = (TaskBase)runningTasks[taskID];
                    if (t != null)
                    {
                        t.StopTask();
                        t.Dispose();

                        this.cancelledTask.Add(taskID.ToString());

                        if (_context.CacheImpl != null && _context.CacheInternal != null)
                        {
                            EventContext eventContext = new EventContext();
                            eventContext.TaskStatus = TaskStatus.Cancelled;
                            if (topologyChanged)
                            {
                                eventContext.TaskFailureReason = "Task was cancelled because Toplogy has been change.";
                            }
                            _context.CacheInternal.NotifyTaskCallback(t.TaskId, t.CallbackListeners, false, null, eventContext);
                        }
                    }
                }
            }

            runningTasks.Clear();
            if (_context.PerfStatsColl != null)
            {
                _context.PerfStatsColl.RunningTasksCount(0);
            }

            lock (_lock)
            {
                foreach (object taskID in waitingTasks.Keys)
                {
                    TaskBase t = (TaskBase)waitingTasks[taskID];
                    if (t != null)
                    {
                        t.StopTask();
                        t.Dispose();

                        if (_context.CacheImpl != null && _context.CacheInternal != null)
                        {
                            EventContext eventContext = new EventContext();
                            eventContext.TaskStatus = TaskStatus.Cancelled;
                            if (topologyChanged)
                            {
                                eventContext.TaskFailureReason = "Task was cancelled because of Toplogy change.";
                            }
                            _context.CacheInternal.NotifyTaskCallback(t.TaskId, t.CallbackListeners, false, null, eventContext);
                        }
                    }
                }
            }
            waitingTasks.Clear();

            if (_context.PerfStatsColl != null)
            {
                _context.PerfStatsColl.WaitingTasksCount(0);
            }
            //Reset the sequenceID and lastRunningID

            sequenceId        = 0;
            lastRunningTaskId = 0;

            if (taskOutputStore != null)
            {
                taskOutputStore.Dispose();
            }

            return(true);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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) { }
                    }
                }
            }
        }