Пример #1
0
        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);
                        }
                    }
                }
            }
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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;
            //   }
            //}
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }