public TaskProcess(string nodeName, string taskName, Connection masterConnect, string workDir, Dictionary<string, ulong> mainFileList, bool haltOnException, int maxThreadsCount) { _nodeName = nodeName; _taskName = taskName; _masterConnect = masterConnect; _storage = new FileStorage(workDir, taskName, masterConnect); _mainFileList = mainFileList; _haltOnException = haltOnException; _maxThreadsCount = maxThreadsCount; _status = NodeTaskStatus.Unknown; }
public void Event(string taskName, string nodeName, NodeTaskStatus status) { _tasks[taskName].Event(nodeName, status); }
public void Event(NodeTaskStatus status) { LastActiveDate = DateTime.Now; Status = status; }
//oneway public void Event(string nodeName, NodeTaskStatus status) { _inProgress[nodeName].Event(status); _schedulerLocker.Set(); }
public void Dispose() { Stop(); if (_execDomain.HasValue) { try { _execDomain.Value.Value.CleanUp(); }catch{} AppDomain.Unload(_execDomain.Value.Key); _execDomain = null; } _keys.Clear(); _results.Clear(); _subTasks.Clear(); _storage.Clear(); _schedulerLocker.Close(); _status = NodeTaskStatus.Halt; }
private void SchedulerThread() { try { while (_schedulerLocker.WaitOne()) { if (!_isStarted) return; if (_keys.Count != 0) { Trace.TraceInformation("Рабочая нода " + _nodeName + " начала " + _keys.Count + " подзадач для задачи " + _taskName); _status = NodeTaskStatus.Working; // выполним все имеющиеся подзадачи if(_maxThreadsCount>1) Parallel.ForEach(_keys.DequeueRange(), new ParallelOptions{MaxDegreeOfParallelism = _maxThreadsCount}, SchedulerTaskExecute); else foreach (var key in _keys.DequeueRange()) SchedulerTaskExecute(key); if (!_isStarted) return; Trace.TraceInformation("Рабочая нода " + _nodeName + " закончила обработку подзадач. Осталось " + _keys.Count + " штук"); // вернём результаты руту if (_keys.Count == 0) { Trace.TraceInformation("Рабочая нода " + _nodeName + " посылает сообщение о завершении работы над всем переданными подзадачами"); _status = NodeTaskStatus.Complete; SendStatus(); } } } } catch (ThreadAbortException) { Trace.TraceError("SchedulerThread: shutting down by user"); } catch (Exception ex) { Trace.TraceError("SchedulerThread.CriticalError: " + ex); Stop(); } }
private void Init() { _status = NodeTaskStatus.Initing; _storage.Precache(_mainFileList); _execDomain = null; _status = NodeTaskStatus.Ready; _execDomain = ExecProxy.StartDomain(_storage.WorkDir, _taskName, null, _mainFileList.Keys); _mainFileList.Clear(); }
public void Stop() { // Остановим текущие подзадачи. Вернём их в очередь. lock (this) { _status = NodeTaskStatus.Stop; _isStarted = false; if (Thread.CurrentThread != _schedulerThread) { if (_schedulerThread != null && _schedulerThread.IsAlive) { _schedulerLocker.Set(); Thread.Sleep(100); if (_schedulerThread.IsAlive) _schedulerThread.Abort(); } } //_schedulerThread = null; foreach (var kst in _subTasks) { kst.Value.Thread.Abort(); _keys.Enqueue(kst.Key); } _subTasks.Clear(); SendStatus(); } }
public void Start() { if (_isStarted) return; lock(this) { if (_isStarted) return; if (_mainFileList.Count > 0) Init(); _schedulerThread = new Thread(SchedulerThread) {Name = "scheduletThread." + _taskName}; _schedulerLocker.Set(); _isStarted = true; _schedulerThread.Start(); _status = NodeTaskStatus.Ready; SendStatus(); } }
public SubTaskResult[] ReturnCompletedResults() { var ret = _results.DequeueRange(Constants.MaxWCFArrayLength).ToArray(); if(_status == NodeTaskStatus.Complete) _status = NodeTaskStatus.Ready; #if DEBUG foreach (var r1 in ret) { if (r1 == null) throw new Exception("logic error!"); } #endif return ret; }