public void GenerateStatistics() { using (var pm = new PersistenceManager()) { pm.UseTransaction(() => { UpdateDimProjectTable(pm); pm.SubmitChanges(); }); pm.UseTransaction(() => { UpdateDimUserTable(pm); UpdateDimJobTable(pm); UpdateDimClientsTable(pm); pm.SubmitChanges(); }); DimTime time = null; pm.UseTransaction(() => { time = UpdateDimTimeTable(pm); pm.SubmitChanges(); }); if (time != null) { pm.UseTransaction(() => { UpdateFactClientInfoTable(time, pm); pm.SubmitChanges(); UpdateFactProjectInfoTable(time, pm); pm.SubmitChanges(); }); pm.UseTransaction(() => { try { UpdateFactTaskTable(pm); UpdateExistingDimJobs(pm); FlagJobsForDeletion(pm); pm.SubmitChanges(); } catch (DuplicateKeyException e) { var logger = LogFactory.GetLogger(typeof(HiveStatisticsGenerator).Namespace); logger.Log(string.Format( @"Propable change from summertime to wintertime, resulting in overlapping times. On wintertime to summertime change, slave timeouts and a fact gap will occur. Exception Details: {0}", e)); } }); } } }
private DimTime UpdateDimTimeTable(PersistenceManager pm) { var dimTimeDao = pm.DimTimeDao; var now = DateTime.Now; var timeEntry = new DimTime { Time = now, Minute = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0), Hour = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0), Day = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0), Month = new DateTime(now.Year, now.Month, 1, 0, 0, 0), Year = new DateTime(now.Year, 1, 1, 0, 0, 0) }; return(dimTimeDao.Save(timeEntry)); }
private void UpdateFactClientInfoTable(DimTime newTime, PersistenceManager pm) { var factClientInfoDao = pm.FactClientInfoDao; var slaveDao = pm.SlaveDao; var dimClientDao = pm.DimClientDao; var newRawFactInfos = from s in slaveDao.GetAll() join c in dimClientDao.GetActiveClients() on s.ResourceId equals c.ResourceId join lcf in factClientInfoDao.GetLastUpdateTimestamps() on c.ResourceId equals lcf.ResourceId into joinCf from cf in joinCf.DefaultIfEmpty() select new { ClientId = c.Id, UserId = s.OwnerUserId ?? Guid.Empty, TotalCores = s.Cores ?? 0, FreeCores = s.FreeCores ?? 0, TotalMemory = s.Memory ?? 0, FreeMemory = s.FreeMemory ?? 0, CpuUtilization = s.CpuUtilization, SlaveState = s.SlaveState, IsAllowedToCalculate = s.IsAllowedToCalculate, LastFactTimestamp = cf.Timestamp }; factClientInfoDao.Save( from x in newRawFactInfos.ToList() let duration = x.LastFactTimestamp != null ? (int)(newTime.Time - (DateTime)x.LastFactTimestamp).TotalSeconds : (int)SmallestTimeSpan.TotalSeconds select new FactClientInfo { ClientId = x.ClientId, DimTime = newTime, UserId = x.UserId, NumUsedCores = x.TotalCores - x.FreeCores, NumTotalCores = x.TotalCores, UsedMemory = x.TotalMemory - x.FreeMemory, TotalMemory = x.TotalMemory, CpuUtilization = Math.Round(x.CpuUtilization, 2), SlaveState = x.SlaveState, IdleTime = x.SlaveState == SlaveState.Idle && x.IsAllowedToCalculate ? duration : 0, UnavailableTime = x.SlaveState == SlaveState.Idle && !x.IsAllowedToCalculate ? duration : 0, OfflineTime = x.SlaveState == SlaveState.Offline ? duration : 0, IsAllowedToCalculate = x.IsAllowedToCalculate } ); }
private void UpdateFactProjectInfoTable(DimTime newTime, PersistenceManager pm) { var factProjectInfoDao = pm.FactProjectInfoDao; var dimProjectDao = pm.DimProjectDao; var projectDao = pm.ProjectDao; var projectAvailabilityStats = projectDao.GetAvailabilityStatsPerProject(); var projectUsageStats = projectDao.GetUsageStatsPerProject(); var dimProjects = dimProjectDao.GetAllOnlineProjects().ToList(); factProjectInfoDao.Save( from dimp in dimProjects let aStats = projectAvailabilityStats.Where(x => x.ProjectId == dimp.ProjectId).SingleOrDefault() let uStats = projectUsageStats.Where(x => x.ProjectId == dimp.ProjectId).SingleOrDefault() select new FactProjectInfo { ProjectId = dimp.Id, DimTime = newTime, NumTotalCores = aStats != null ? aStats.Cores : 0, TotalMemory = aStats != null ? aStats.Memory : 0, NumUsedCores = uStats != null ? uStats.Cores : 0, UsedMemory = uStats != null ? uStats.Memory : 0 } ); }