private void GenerateUnitInfoDataFromQueue(DataAggregatorResult result, QueueData q, FahLog fahLog, UnitInfoLogData unitInfo) { Debug.Assert(q != null); result.UnitInfos = new Dictionary <int, UnitInfo>(10); for (int i = 0; i < 10; i++) { result.UnitInfos[i] = null; } var clientRun = GetCurrentClientRun(fahLog); for (int queueIndex = 0; queueIndex < result.UnitInfos.Count; queueIndex++) { var unitRun = GetUnitRunForQueueIndex(fahLog, queueIndex); UnitInfoLogData unitInfoLogData = null; // On the Current Queue Index if (queueIndex == q.CurrentIndex) { // Get the UnitInfo Log Data unitInfoLogData = unitInfo; } var queueEntry = q.GetQueueEntry((uint)queueIndex); result.UnitInfos[queueIndex] = BuildUnitInfo(queueEntry, clientRun, unitRun, unitInfoLogData); if (result.UnitInfos[queueIndex] == null) { if (queueIndex == q.CurrentIndex) { string message = String.Format(CultureInfo.CurrentCulture, "Could not verify log section for current queue index {0} {1}.", queueIndex, queueEntry.ToProjectInfo()); Logger.WarnFormat(Constants.ClientNameFormat, ClientName, message); unitRun = GetCurrentUnitRun(fahLog); var slotRun = GetCurrentSlotRun(fahLog); if (slotRun != null && slotRun.Data.Status == SlotStatus.GettingWorkPacket) { unitRun = null; unitInfoLogData = new UnitInfoLogData(); } result.UnitInfos[queueIndex] = BuildUnitInfo(queueEntry, clientRun, unitRun, unitInfoLogData, true); } else if (Logger.IsDebugEnabled) { // Write debug info and skip this unit var projectInfo = queueEntry.ToProjectInfo(); if (!projectInfo.ProjectIsUnknown()) { string message = String.Format(CultureInfo.CurrentCulture, "Could not find log section for queue index {0} {1}.", queueIndex, queueEntry.ToProjectInfo()); Logger.DebugFormat(Constants.ClientNameFormat, ClientName, message); } } } } }
/// <summary> /// Aggregate Data and return UnitInfo List /// </summary> public DataAggregatorResult AggregateData(FahLog fahLog, QueueData queueData, UnitInfoLogData unitInfo) { if (Logger.IsDebugEnabled) { foreach (var s in fahLog.Where(x => x.LineType == LogLineType.Error)) { Logger.DebugFormat(Constants.ClientNameFormat, ClientName, String.Format("Failed to parse log line: {0}", s)); } } var currentClientRun = GetCurrentClientRun(fahLog); if (currentClientRun == null) { return(null); } var result = new DataAggregatorResult(); result.StartTime = currentClientRun.Data.StartTime; result.Arguments = currentClientRun.Data.Arguments; result.ClientVersion = currentClientRun.Data.ClientVersion; result.UserID = currentClientRun.Data.UserID; result.MachineID = currentClientRun.Data.MachineID; result.Status = currentClientRun.SlotRuns[0].Data.Status; // Decision Time: If Queue Read fails parse from logs only if (queueData != null) { GenerateUnitInfoDataFromQueue(result, queueData, fahLog, unitInfo); result.Queue = BuildQueueDictionary(queueData); result.CurrentUnitIndex = result.Queue.CurrentIndex; } else { Logger.WarnFormat(Constants.ClientNameFormat, ClientName, "Queue unavailable or failed read. Parsing logs without queue."); GenerateUnitInfoDataFromLogs(result, fahLog, unitInfo); // default Unit Index if only parsing logs result.CurrentUnitIndex = 1; } if (result.UnitInfos == null || result.UnitInfos[result.CurrentUnitIndex] == null || result.UnitInfos[result.CurrentUnitIndex].LogLines == null) { result.CurrentLogLines = currentClientRun.ToList(); } else { result.CurrentLogLines = result.UnitInfos[result.CurrentUnitIndex].LogLines; } return(result); }
private static void UpdateUnitInfoFromLogData(UnitInfo unitInfo, ClientRunData clientRunData, UnitRunData unitRunData, UnitInfoLogData unitInfoLogData) { Debug.Assert(unitInfo != null); Debug.Assert(clientRunData != null); Debug.Assert(unitRunData != null); // unitInfoLogData can be null /* Project (R/C/G) (Could have already been read through Queue) */ if (unitInfo.ProjectIsUnknown()) { unitInfo.ProjectID = unitRunData.ProjectID; unitInfo.ProjectRun = unitRunData.ProjectRun; unitInfo.ProjectClone = unitRunData.ProjectClone; unitInfo.ProjectGen = unitRunData.ProjectGen; } if (unitRunData.Threads > 1) { unitInfo.SlotType = SlotType.CPU; } if (unitInfoLogData != null) { unitInfo.ProteinName = unitInfoLogData.ProteinName; /* Tag (Could have already been read through Queue) */ if (unitInfo.ProteinTag.Length == 0) { unitInfo.ProteinTag = unitInfoLogData.ProteinTag; } /* DownloadTime (Could have already been read through Queue) */ if (unitInfo.DownloadTime.IsUnknown()) { unitInfo.DownloadTime = unitInfoLogData.DownloadTime; } /* DueTime (Could have already been read through Queue) */ if (unitInfo.DueTime.IsUnknown()) { unitInfo.DueTime = unitInfoLogData.DueTime; } /* FinishedTime (Not available in unitinfo log) */ /* Project (R/C/G) (Could have already been read through Queue) */ if (unitInfo.ProjectIsUnknown()) { unitInfo.ProjectID = unitInfoLogData.ProjectID; unitInfo.ProjectRun = unitInfoLogData.ProjectRun; unitInfo.ProjectClone = unitInfoLogData.ProjectClone; unitInfo.ProjectGen = unitInfoLogData.ProjectGen; } } /* FoldingID and Team from last ClientRun (Could have already been read through Queue) */ if (unitInfo.FoldingID == Constants.DefaultFoldingID && unitInfo.Team == Constants.DefaultTeam) { if (!String.IsNullOrEmpty(clientRunData.FoldingID)) { unitInfo.FoldingID = clientRunData.FoldingID; unitInfo.Team = clientRunData.Team; } } // The queue will have the FoldingID and Team that was set in the client when the work unit was assigned. // If the user subsequently changed their FoldingID and Team before this unit was completed the // FoldingID and Team read from the queue will NOT reflect that change. //if (unitInfo.FoldingID != clientRunData.FoldingID || unitInfo.Team != clientRunData.Team) //{ // if (!String.IsNullOrEmpty(clientRunData.FoldingID)) // { // unitInfo.FoldingID = clientRunData.FoldingID; // unitInfo.Team = clientRunData.Team; // } //} }
private static UnitInfo BuildUnitInfo(QueueEntry queueEntry, ClientRun clientRun, UnitRun unitRun, UnitInfoLogData unitInfoLogData, bool matchOverride = false) { // queueEntry can be null Debug.Assert(clientRun != null); // unitInfoLogData can be null var unit = new UnitInfo(); UnitRunData unitRunData; if (unitRun == null) { if (matchOverride) { unitRunData = new UnitRunData(); } else { return(null); } } else { unit.LogLines = unitRun.ToList(); unitRunData = unitRun.Data; } unit.UnitStartTimeStamp = unitRunData.UnitStartTimeStamp ?? TimeSpan.MinValue; unit.FramesObserved = unitRunData.FramesObserved; unit.CoreVersion = unitRunData.CoreVersion; unit.UnitResult = unitRunData.WorkUnitResult; if (queueEntry != null) { UpdateUnitInfoFromQueueData(unit, queueEntry); SearchFahLogUnitDataProjects(unit, unitRunData); UpdateUnitInfoFromLogData(unit, clientRun.Data, unitRunData, unitInfoLogData); if (!ProjectsMatch(unit, unitRunData) && !ProjectsMatch(unit, unitInfoLogData) && !matchOverride) { return(null); } } else { UpdateUnitInfoFromLogData(unit, clientRun.Data, unitRunData, unitInfoLogData); } return(unit); }
private static void GenerateUnitInfoDataFromLogs(DataAggregatorResult result, FahLog fahLog, UnitInfoLogData unitInfo) { result.UnitInfos = new Dictionary <int, UnitInfo>(2); for (int i = 0; i < 2; i++) { result.UnitInfos[i] = null; } var currentClientRun = GetCurrentClientRun(fahLog); var previousUnitRun = GetPreviousUnitRun(fahLog); if (previousUnitRun != null) { result.UnitInfos[0] = BuildUnitInfo(null, currentClientRun, previousUnitRun, null); } var currentUnitRun = GetCurrentUnitRun(fahLog); result.UnitInfos[1] = BuildUnitInfo(null, currentClientRun, currentUnitRun, unitInfo, currentUnitRun == null); }