private void UpdateUnitInfoFromLogData(UnitInfo unitInfo, UnitRun unitRun) { Debug.Assert(unitInfo != null); Debug.Assert(unitRun != null); unitInfo.LogLines = LogLineEnumerable.Create(unitRun).ToList(); unitInfo.FrameData = unitRun.Data.FrameDataDictionary; unitInfo.UnitStartTimeStamp = unitRun.Data.UnitStartTimeStamp ?? TimeSpan.MinValue; unitInfo.FramesObserved = unitRun.Data.FramesObserved; unitInfo.CoreVersion = ParseCoreVersion(unitRun.Data.CoreVersion); unitInfo.UnitResult = WorkUnitResultString.ToWorkUnitResult(unitRun.Data.WorkUnitResult); // there is no finished time available from the client API // since the unit history database won't write the same // result twice, the first time this hits use the local UTC // value for the finished time... not as good as what was // available with v6. if (unitInfo.UnitResult.IsTerminating()) { var finishedTime = DateTime.UtcNow; //string message = String.Format(CultureInfo.CurrentCulture, // "Setting Finished Time {0} for {1}.", finishedTime, unitInfo.ToProjectInfo()); //Logger.Debug(Constants.ClientNameFormat, ClientName, message); unitInfo.FinishedTime = finishedTime; } }
/// <summary> /// Creates a new <see cref="UnitRunData"/> object from the information contained in the <see cref="UnitRun"/> object. /// </summary> protected override UnitRunData OnGetUnitRunData(UnitRun unitRun) { var unitRunData = new FahClientUnitRunData(); var frameDataDictionary = new Dictionary <int, WorkUnitFrameData>(); foreach (var line in unitRun.LogLines) { switch (line.LineType) { case LogLineType.WorkUnitWorking: unitRunData.UnitStartTimeStamp = line.TimeStamp; unitRunData.WorkUnitResult = Internal.WorkUnitResult.None; break; case LogLineType.WorkUnitFrame: if (unitRunData.UnitStartTimeStamp == null) { unitRunData.UnitStartTimeStamp = line.TimeStamp; } if (line.Data != null && !(line.Data is LogLineDataParserError)) { unitRunData.FramesObserved++; if (line.Data is WorkUnitFrameData frameData) { // Make a copy so UnitRunData is not holding a reference to the same // WorkUnitFrameData instance as the LogLine it was sourced from. frameDataDictionary.TryAdd(frameData.ID, new WorkUnitFrameData(frameData)); } } break; case LogLineType.WorkUnitCoreVersion: if (line.Data != null && !(line.Data is LogLineDataParserError)) { unitRunData.CoreVersion = (string)line.Data; } break; case LogLineType.WorkUnitProject: var projectData = (WorkUnitProjectData)line.Data; unitRunData.ProjectID = projectData.ProjectID; unitRunData.ProjectRun = projectData.ProjectRun; unitRunData.ProjectClone = projectData.ProjectClone; unitRunData.ProjectGen = projectData.ProjectGen; break; case LogLineType.WorkUnitCoreReturn: unitRunData.WorkUnitResult = (string)line.Data; if (unitRunData.WorkUnitResult == Internal.WorkUnitResult.INTERRUPTED || unitRunData.WorkUnitResult == Internal.WorkUnitResult.UNKNOWN_ENUM) { unitRunData.FramesObserved = 0; } break; } } Internal.CommonRunDataAggregator.CalculateFrameDataDurations(frameDataDictionary); unitRunData.FrameDataDictionary = frameDataDictionary; return(unitRunData); }
private static WorkUnit BuildWorkUnit(Unit unit, Options options, UnitRun unitRun) { Debug.Assert(unit != null); Debug.Assert(options != null); var workUnit = new WorkUnit(); PopulateWorkUnitFromFahClientData(workUnit, unit, options); if (unitRun != null) { PopulateWorkUnitFromLogData(workUnit, unitRun); } return(workUnit); }
private static void PopulateWorkUnitFromLogData(WorkUnit workUnit, UnitRun unitRun) { Debug.Assert(workUnit != null); Debug.Assert(unitRun != null); workUnit.LogLines = LogLineEnumerable.Create(unitRun).ToList(); workUnit.Frames = unitRun.Data.Frames; workUnit.UnitStartTimeStamp = unitRun.Data.UnitStartTimeStamp ?? TimeSpan.MinValue; workUnit.FramesObserved = unitRun.Data.FramesObserved; workUnit.CoreVersion = ParseCoreVersion(unitRun.Data.CoreVersion); workUnit.UnitResult = WorkUnitResultString.ToWorkUnitResult(unitRun.Data.WorkUnitResult); // there is no finished time available from the client API // since the unit history database won't write the same // result twice, the first time this hits use the local UTC // value for the finished time... not as good as what was // available with v6. if (IsTerminating(workUnit)) { workUnit.Finished = DateTime.UtcNow; } }
private void EnsureUnitRunExists(int lineIndex, int queueIndex) { var slotRun = EnsureSlotRunExists(lineIndex, FoldingSlot); var unitRun = new UnitRun(slotRun, queueIndex, lineIndex); var previousUnitRun = slotRun.UnitRuns.LastOrDefault(); if (previousUnitRun != null) { previousUnitRun.EndIndex = lineIndex - 1; var clientRun = ClientRuns.Last(); foreach (var logLine in _logBuffer.Where(x => x.Index < previousUnitRun.StartIndex)) { clientRun.LogLines.Add(logLine); } foreach (var logLine in _logBuffer.Where(x => x.Index >= previousUnitRun.StartIndex && x.Index <= previousUnitRun.EndIndex)) { previousUnitRun.LogLines.Add(logLine); } _logBuffer.RemoveAll(x => x.Index <= previousUnitRun.EndIndex); } slotRun.UnitRuns.Add(unitRun); }
private UnitInfo BuildUnitInfo(Unit queueEntry, Options options, SlotOptions slotOptions, UnitRun unitRun) { Debug.Assert(queueEntry != null); Debug.Assert(options != null); Debug.Assert(slotOptions != null); var unit = new UnitInfo(); UpdateUnitInfoFromFahClientData(unit, queueEntry, options, slotOptions); if (unitRun != null) { UpdateUnitInfoFromLogData(unit, unitRun); } return(unit); }
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 void UpdateUnitInfoFromLogData(UnitInfo unitInfo, UnitRun unitRun) { Debug.Assert(unitInfo != null); Debug.Assert(unitRun != null); unitInfo.LogLines = unitRun.ToList(); unitInfo.UnitStartTimeStamp = unitRun.Data.UnitStartTimeStamp ?? TimeSpan.MinValue; unitInfo.FramesObserved = unitRun.Data.FramesObserved; unitInfo.CoreVersion = unitRun.Data.CoreVersion; unitInfo.UnitResult = unitRun.Data.WorkUnitResult; // there is no finished time available from the client API // since the unit history database won't write the same // result twice, the first time this hits use the local UTC // value for the finished time... not as good as what was // available with v6. if (unitInfo.UnitResult.IsTerminating()) { var finishedTime = DateTime.UtcNow; //string message = String.Format(CultureInfo.CurrentCulture, // "Setting Finished Time {0} for {1}.", finishedTime, unitInfo.ToProjectInfo()); //Logger.Debug(Constants.ClientNameFormat, ClientName, message); unitInfo.FinishedTime = finishedTime; } }
private UnitInfo BuildUnitInfo(Unit queueEntry, Options options, SlotOptions slotOptions, UnitRun unitRun) { Debug.Assert(queueEntry != null); Debug.Assert(options != null); Debug.Assert(slotOptions != null); var unit = new UnitInfo(); UpdateUnitInfoFromFahClientData(unit, queueEntry, options, slotOptions); if (unitRun != null) { UpdateUnitInfoFromLogData(unit, unitRun); } return unit; }
private static UnitRunData GetUnitRunDataFahClient(UnitRun unitRun) { var unitRunData = new UnitRunData(); foreach (var line in unitRun.LogLines) { switch (line.LineType) { case LogLineType.WorkUnitWorking: unitRunData.UnitStartTimeStamp = line.TimeStamp; break; case LogLineType.WorkUnitFrame: if (unitRunData.UnitStartTimeStamp == null) { unitRunData.UnitStartTimeStamp = line.TimeStamp; } if (line.LineData != null) { unitRunData.FramesObserved++; } break; case LogLineType.WorkUnitCoreVersion: if (Math.Abs(unitRunData.CoreVersion) < Single.Epsilon && line.LineData != null) { unitRunData.CoreVersion = (float)line.LineData; } break; case LogLineType.WorkUnitProject: unitRunData.ProjectInfoList.Add((IProjectInfo)line.LineData); break; case LogLineType.WorkUnitCoreReturn: unitRunData.WorkUnitResult = (WorkUnitResult)line.LineData; break; } } return unitRunData; }
private static UnitRunData GetUnitRunDataLegacy(UnitRun unitRun) { bool clientWasPaused = false; bool lookForProject = true; var unitRunData = new UnitRunData(); foreach (var line in unitRun.LogLines) { #region Unit Start if ((line.LineType == LogLineType.WorkUnitProcessing || line.LineType == LogLineType.WorkUnitWorking || line.LineType == LogLineType.WorkUnitStart || line.LineType == LogLineType.WorkUnitFrame) && unitRunData.UnitStartTimeStamp == null) { unitRunData.UnitStartTimeStamp = LogLineParser.Common.GetTimeStamp(line); } if (line.LineType == LogLineType.WorkUnitPaused || line.LineType == LogLineType.WorkUnitPausedForBattery) { clientWasPaused = true; } else if ((line.LineType == LogLineType.WorkUnitWorking || line.LineType == LogLineType.WorkUnitResumeFromBattery || line.LineType == LogLineType.WorkUnitFrame) && clientWasPaused) { clientWasPaused = false; // Reset the Frames Observed Count // This will cause the Instance to only use frames beyond this point to // set frame times and determine status - Issue 13 (Revised) unitRunData.FramesObserved = 0; // Reset the Unit Start Time unitRunData.UnitStartTimeStamp = LogLineParser.Common.GetTimeStamp(line); } #endregion #region Project if (lookForProject) { // If we encounter a work unit frame, we should have // already seen the Project Information, stop looking if (line.LineType == LogLineType.WorkUnitFrame) { lookForProject = false; } if (line.LineType == LogLineType.WorkUnitProject) { if (line.LineData != null) { unitRunData.ProjectInfoList.Add((IProjectInfo)line.LineData); } } } #endregion switch (line.LineType) { case LogLineType.WorkUnitFrame: if (line.LineData != null) { unitRunData.FramesObserved++; } break; case LogLineType.WorkUnitCoreVersion: if (Math.Abs(unitRunData.CoreVersion) < Single.Epsilon && line.LineData != null) { unitRunData.CoreVersion = (float)line.LineData; } break; case LogLineType.WorkUnitCoreShutdown: case LogLineType.ClientCoreCommunicationsError: unitRunData.WorkUnitResult = (WorkUnitResult)line.LineData; break; case LogLineType.WorkUnitCallingCore: unitRunData.Threads = (int)line.LineData; break; case LogLineType.ClientNumberOfUnitsCompleted: unitRunData.TotalCompletedUnits = (int)line.LineData; break; } } return unitRunData; }
internal static UnitRunData GetUnitRunData(UnitRun unitRun) { switch (unitRun.Parent.Parent.Parent.FahLogType) { case FahLogType.Legacy: return GetUnitRunDataLegacy(unitRun); case FahLogType.FahClient: return GetUnitRunDataFahClient(unitRun); } throw new ArgumentException("UnitRun FahLogType unknown", "unitRun"); }
/// <summary> /// Creates a new <see cref="UnitRunData"/> object from the information contained in the <see cref="UnitRun"/> object. /// </summary> protected override UnitRunData OnGetUnitRunData(UnitRun unitRun) { bool clientWasPaused = false; bool lookForProject = true; var unitRunData = new LegacyUnitRunData(); var frameDataDictionary = new Dictionary <int, WorkUnitFrameData>(); foreach (var line in unitRun.LogLines) { #region Unit Start if ((line.LineType == LogLineType.WorkUnitProcessing || line.LineType == LogLineType.WorkUnitWorking || line.LineType == LogLineType.WorkUnitCoreStart || line.LineType == LogLineType.WorkUnitFrame) && unitRunData.UnitStartTimeStamp == null) { unitRunData.UnitStartTimeStamp = line.TimeStamp; } if (line.LineType == LogLineType.WorkUnitPaused || line.LineType == LogLineType.WorkUnitPausedForBattery) { clientWasPaused = true; } else if ((line.LineType == LogLineType.WorkUnitWorking || line.LineType == LogLineType.WorkUnitResumeFromBattery || line.LineType == LogLineType.WorkUnitFrame) && clientWasPaused) { clientWasPaused = false; // Reset the Frames Observed Count // This will cause the Instance to only use frames beyond this point to // set frame times and determine status - Issue 13 (Revised) unitRunData.FramesObserved = 0; // Reset the Unit Start Time unitRunData.UnitStartTimeStamp = line.TimeStamp; } #endregion #region Project if (lookForProject) { // If we encounter a work unit frame, we should have // already seen the Project Information, stop looking if (line.LineType == LogLineType.WorkUnitFrame) { lookForProject = false; } if (line.LineType == LogLineType.WorkUnitProject) { if (line.Data != null && !(line.Data is LogLineDataParserError)) { var data = (WorkUnitProjectData)line.Data; unitRunData.ProjectID = data.ProjectID; unitRunData.ProjectRun = data.ProjectRun; unitRunData.ProjectClone = data.ProjectClone; unitRunData.ProjectGen = data.ProjectGen; } } } #endregion switch (line.LineType) { case LogLineType.WorkUnitFrame: if (line.Data != null && !(line.Data is LogLineDataParserError)) { unitRunData.FramesObserved++; if (line.Data is WorkUnitFrameData frameData) { // Make a copy so UnitRunData is not holding a reference to the same // WorkUnitFrameData instance as the LogLine it was sourced from. frameDataDictionary.TryAdd(frameData.ID, new WorkUnitFrameData(frameData)); } } break; case LogLineType.WorkUnitCoreVersion: if (line.Data != null && !(line.Data is LogLineDataParserError)) { unitRunData.CoreVersion = (string)line.Data; } break; case LogLineType.WorkUnitCoreShutdown: unitRunData.WorkUnitResult = (string)line.Data; break; case LogLineType.ClientCoreCommunicationsError: unitRunData.ClientCoreCommunicationsError = true; break; case LogLineType.WorkUnitCallingCore: unitRunData.Threads = (int)line.Data; break; case LogLineType.ClientNumberOfUnitsCompleted: unitRunData.TotalCompletedUnits = (int)line.Data; break; } } Internal.CommonRunDataAggregator.CalculateFrameDataDurations(frameDataDictionary); unitRunData.FrameDataDictionary = frameDataDictionary; return(unitRunData); }
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); }