/// <summary> /// Schedules batches onto DataProcessingServers. /// </summary> protected void FeedDataProcessingServers() { if (m_ExeList.Count < m_DPSHandlers.Length) { lock (m_Queue) { if (m_Queue.Count > m_ExeList.Count) { DataProcSrvHandler [] l_AvDPSHandlers = (DataProcSrvHandler [])m_DPSHandlers.Clone(); int i, j; for (j = 0; j < m_ExeList.Count; j++) { for (i = 0; i < l_AvDPSHandlers.Length; i++) { if (l_AvDPSHandlers[i] != null && l_AvDPSHandlers[i].Srv == ((ExeBatch)m_ExeList[j]).DPSW) { l_AvDPSHandlers[i] = null; break; } } } for (i = 0; i < m_Queue.Count; i++) { SySal.DAQSystem.DataProcessingBatchDesc desc = (SySal.DAQSystem.DataProcessingBatchDesc)m_Queue[i]; for (j = 0; j < m_ExeList.Count; j++) { if (((ExeBatch)m_ExeList[j]).Desc == desc) { break; } } if (j == m_ExeList.Count) { for (j = 0; j < l_AvDPSHandlers.Length; j++) { try { if (l_AvDPSHandlers[j] != null && l_AvDPSHandlers[j].IsAvailable && l_AvDPSHandlers[j].MachinePowerClass >= desc.MachinePowerClass) { ExeBatch exe = new ExeBatch(); exe.Desc = desc; exe.MappedDesc = (SySal.DAQSystem.DataProcessingBatchDesc)desc.Clone(); exe.MappedDesc.Id = l_AvDPSHandlers[j].Srv.SuggestId; exe.MappedDesc.Description = exe.Desc.Id.ToString("X16") + " _DPS_REMAP_ " + exe.Desc.Description; if (MainForm.ImpersonateBatchUser == false) { exe.MappedDesc.Username = MainForm.OPERAUserName; exe.MappedDesc.Password = MainForm.OPERAPassword; exe.MappedDesc.Token = null; } exe.DPSW = l_AvDPSHandlers[j].Srv; if (exe.DPSW.Enqueue(exe.MappedDesc) == false) { long ticks = System.DateTime.Now.Ticks; if (ticks < 0) { ticks = -ticks; } exe.MappedDesc.Id = (ulong)ticks; exe.MappedDesc.Description = exe.MappedDesc.Id.ToString("X16") + " _OWN_REMAP_ " + exe.Desc.Description; if (l_AvDPSHandlers[j].Srv.Enqueue(exe.MappedDesc) == false) { m_ResultList.Add(new DataProcessingResult(exe.Desc, new Exception("Unknown error!"), MainForm.ResultLiveTime)); } else { m_ExeList.Add(exe); l_AvDPSHandlers[j] = null; break; } } else { m_ExeList.Add(exe); l_AvDPSHandlers[j] = null; break; } } } catch (Exception) { lock (m_DPSHandlers) { l_AvDPSHandlers[j].Srv = null; l_AvDPSHandlers[j].IsAvailable = false; l_AvDPSHandlers[j].MachinePowerClass = 0; } } } } } } } } }
/// <summary> /// The execution method, ran by the execution thread. /// </summary> public void Execute() { SySal.DAQSystem.SyncDataProcessingServerWrapper DPSW = null; int test = 0; string milestone = "A"; try { while (true) { try { if (DPSW == null) { DPSW = new SySal.DAQSystem.SyncDataProcessingServerWrapper((SySal.DAQSystem.IDataProcessingServer)System.Runtime.Remoting.RemotingServices.Connect(typeof(SySal.DAQSystem.IDataProcessingServer), "tcp://" + ServerName + ":" + ((int)SySal.DAQSystem.OperaPort.DataProcessingServer).ToString() + "/DataProcessingServer.rem"), new TimeSpan(0, 1, 0)); if (DPSW.TestComm(++test) != 2 * test - 1) { throw new Exception(); } MachinePowerClass = DPSW.MachinePowerClass; } } catch (Exception) { DPSW = null; continue; } milestone = "B"; try { Desc = null; int i; lock (JobQueue) { for (i = 0; i < JobQueue.Count; i++) { if (((SySal.DAQSystem.DataProcessingBatchDesc)JobQueue[i]).MachinePowerClass <= MachinePowerClass) { KillEvent.Reset(); Desc = (SySal.DAQSystem.DataProcessingBatchDesc)JobQueue[i]; JobQueue.RemoveAt(i); ExeList.Add(Desc); break; } } if (JobQueue.Count == 0) { DataReady.Reset(); } } milestone = "C"; if (Desc == null) { DataReady.WaitOne(); continue; } else { try { SySal.DAQSystem.DataProcessingBatchDesc mbd = (SySal.DAQSystem.DataProcessingBatchDesc)Desc.Clone(); milestone = "D"; mbd.Id = DPSW.SuggestId; milestone = "E"; mbd.Description = Desc.Id.ToString("X16") + " _DPS_REMAP_ " + Desc.Description; if (MainForm.ImpersonateBatchUser == false) { mbd.Username = MainForm.OPERAUserName; mbd.Password = MainForm.OPERAPassword; mbd.Token = null; } milestone = "E1"; if (DPSW.Enqueue(mbd) == false) { lock (JobQueue) { ExeList.Remove(Desc); JobQueue.Add(Desc); Desc = null; continue; } } milestone = "F"; bool killed = false; while (DPSW.DoneWith(mbd.Id) == false) { if (KillEvent.WaitOne(MainForm.DataProcSrvMonitorInterval * 1000)) { milestone = "F1"; lock (JobQueue) { milestone = "F2"; ResultList.Add(new DataProcessingResult(Desc, new Exception("The batch was removed from the queue."), MainForm.ResultLiveTime)); ExeList.Remove(Desc); Desc = null; milestone = "F3"; try { DPSW.Remove(mbd.Id, mbd.Token, mbd.Username, mbd.Password); } catch (Exception) { } milestone = "F4"; killed = true; break; } } } if (killed == false) { milestone = "G"; mbd = DPSW.Result(mbd.Id); milestone = "H"; Desc.PeakVirtualMemorySize = mbd.PeakVirtualMemorySize; Desc.PeakWorkingSet = mbd.PeakWorkingSet; Desc.TotalProcessorTime = mbd.TotalProcessorTime; Desc.Finished = mbd.Finished; lock (JobQueue) { ResultList.Add(new DataProcessingResult(Desc, null, MainForm.ResultLiveTime)); ExeList.Remove(Desc); Desc = null; } } milestone = "I"; } catch (SySal.DAQSystem.DataProcessingException retx) { lock (JobQueue) { ResultList.Add(new DataProcessingResult(Desc, retx, MainForm.ResultLiveTime)); ExeList.Remove(Desc); Desc = null; } } } catch (Exception x) { DPSW = null; MachinePowerClass = 0; try { EventLog.WriteEntry("Error handling batch " + Desc.Id.ToString("X16") + " - DPS: " + ServerName + "\r\nMilestone: " + milestone + "\r\n" + x.ToString(), System.Diagnostics.EventLogEntryType.Warning); } catch (Exception) { } lock (JobQueue) { ExeList.Remove(Desc); JobQueue.Add(Desc); Desc = null; } } } catch (Exception) { Desc = null; DPSW = null; MachinePowerClass = 0; } }