public ManagerJob() { ID = ""; // newjob.ID = Guid.NewGuid().ToString().Replace("-", "").Substring(0, 10); CallbackUrl = ""; Workers = new List<WorkerInfo>(); State = ManagerJobState.Preparing; JobType = ""; JobArgs = new DefaultJobArgs(); Timeout = 5; Assemblies = new Dictionary<string, byte[]>(); }
public override void InnerRun() { // kör, bara kör! Console.WriteLine("Manager job: Tell all workers to start."); // upload all assemblies foreach (var w in Workers) { StartupWorker(w); } State = ManagerJobState.Working; Console.WriteLine("Manager job: Wait for all to be done..."); bool anyNotDoneAndNotCrashed = true; while (anyNotDoneAndNotCrashed) { anyNotDoneAndNotCrashed = false; int numcrashed = 0; foreach (var w in Workers) { if (w.State != WorkerState.JobDone && w.State != WorkerState.Crashed) anyNotDoneAndNotCrashed = true; else { var dur = DateTime.Now.Subtract(w.StartTime).TotalSeconds; Console.WriteLine("Worker " + w.URL + " is " + w.State + " (runtime: " + dur + " seconds)"); if (dur > Timeout) { // mark as crashed? w.State = WorkerState.Crashed; Console.WriteLine("Crashed? get a new one?"); numcrashed++; } } } if (numcrashed > 0) { var wurls = Controller.ProvisionWorkers(numcrashed); foreach(var wurl in wurls) { var nw = Controller.GetWorkerByUrl(wurl); StartupWorker(nw); Workers.Add(nw); } } Thread.Sleep(1000); } State = ManagerJobState.Done; Console.WriteLine("Manager job: Reset worker states to idle."); foreach (var w in Workers) { if( w.State != WorkerState.Crashed ) w.State = WorkerState.Idle; } Console.WriteLine("Manager job: Done."); }