safing-portmaster/spn/unit/scheduler_stats.go

87 lines
3 KiB
Go

package unit
// Stats are somewhat racy, as one value of sum or count might already be
// updated with the latest slot data, while the other has been not.
// This is not so much of a problem, as slots are really short and the impact
// is very low.
// cycleStats calculates the new values and cycles the current values.
func (s *Scheduler) cycleStats() {
// Get and reset max pace.
s.stats.current.maxPace.Store(s.stats.progress.maxPace.Load())
s.stats.progress.maxPace.Store(0)
// Get and reset max leveled pace.
s.stats.current.maxLeveledPace.Store(s.stats.progress.maxLeveledPace.Load())
s.stats.progress.maxLeveledPace.Store(0)
// Get and reset avg slot pace.
avgPaceCnt := s.stats.progress.avgPaceCnt.Load()
if avgPaceCnt > 0 {
s.stats.current.avgPace.Store(s.stats.progress.avgPaceSum.Load() / avgPaceCnt)
} else {
s.stats.current.avgPace.Store(0)
}
s.stats.progress.avgPaceCnt.Store(0)
s.stats.progress.avgPaceSum.Store(0)
// Get and reset avg unit life.
avgUnitLifeCnt := s.stats.progress.avgUnitLifeCnt.Load()
if avgUnitLifeCnt > 0 {
s.stats.current.avgUnitLife.Store(s.stats.progress.avgUnitLifeSum.Load() / avgUnitLifeCnt)
} else {
s.stats.current.avgUnitLife.Store(0)
}
s.stats.progress.avgUnitLifeCnt.Store(0)
s.stats.progress.avgUnitLifeSum.Store(0)
// Get and reset avg work slot duration.
avgWorkSlotCnt := s.stats.progress.avgWorkSlotCnt.Load()
if avgWorkSlotCnt > 0 {
s.stats.current.avgWorkSlot.Store(s.stats.progress.avgWorkSlotSum.Load() / avgWorkSlotCnt)
} else {
s.stats.current.avgWorkSlot.Store(0)
}
s.stats.progress.avgWorkSlotCnt.Store(0)
s.stats.progress.avgWorkSlotSum.Store(0)
// Get and reset avg catch up slot duration.
avgCatchUpSlotCnt := s.stats.progress.avgCatchUpSlotCnt.Load()
if avgCatchUpSlotCnt > 0 {
s.stats.current.avgCatchUpSlot.Store(s.stats.progress.avgCatchUpSlotSum.Load() / avgCatchUpSlotCnt)
} else {
s.stats.current.avgCatchUpSlot.Store(0)
}
s.stats.progress.avgCatchUpSlotCnt.Store(0)
s.stats.progress.avgCatchUpSlotSum.Store(0)
}
// GetMaxSlotPace returns the current maximum slot pace.
func (s *Scheduler) GetMaxSlotPace() int64 {
return s.stats.current.maxPace.Load()
}
// GetMaxLeveledSlotPace returns the current maximum leveled slot pace.
func (s *Scheduler) GetMaxLeveledSlotPace() int64 {
return s.stats.current.maxLeveledPace.Load()
}
// GetAvgSlotPace returns the current average slot pace.
func (s *Scheduler) GetAvgSlotPace() int64 {
return s.stats.current.avgPace.Load()
}
// GetAvgUnitLife returns the current average unit lifetime until it is finished.
func (s *Scheduler) GetAvgUnitLife() int64 {
return s.stats.current.avgUnitLife.Load()
}
// GetAvgWorkSlotDuration returns the current average work slot duration.
func (s *Scheduler) GetAvgWorkSlotDuration() int64 {
return s.stats.current.avgWorkSlot.Load()
}
// GetAvgCatchUpSlotDuration returns the current average catch up slot duration.
func (s *Scheduler) GetAvgCatchUpSlotDuration() int64 {
return s.stats.current.avgCatchUpSlot.Load()
}