From 4165688f25936897bbedd596f4dcfe7998e9d432 Mon Sep 17 00:00:00 2001 From: Simon Zolin Date: Mon, 7 Oct 2019 15:55:09 +0300 Subject: [PATCH] * stats: refactor --- stats/stats_unit.go | 66 ++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/stats/stats_unit.go b/stats/stats_unit.go index 3f7e49a0..9cbd67d0 100644 --- a/stats/stats_unit.go +++ b/stats/stats_unit.go @@ -455,6 +455,41 @@ func (s *statsCtx) Update(e Entry) { s.unitLock.Unlock() } +func (s *statsCtx) loadUnits(lastID uint32) []*unitDB { + tx := s.beginTxn(false) + if tx == nil { + return nil + } + + units := []*unitDB{} //per-hour units + firstID := lastID - s.limit + 1 + for i := firstID; i != lastID; i++ { + u := s.loadUnitFromDB(tx, i) + if u == nil { + u = &unitDB{} + u.NResult = make([]uint64, rLast) + } + units = append(units, u) + } + + _ = tx.Rollback() + + s.unitLock.Lock() + cu := serialize(s.unit) + cuID := s.unit.id + s.unitLock.Unlock() + if cuID != lastID { + units = units[1:] + } + units = append(units, cu) + + if len(units) != int(s.limit) { + log.Fatalf("len(units) != s.limit: %d %d", len(units), s.limit) + } + + return units +} + /* Algorithm: . Prepare array of N units, where N is the value of "limit" configuration setting . Load data for the most recent units from file @@ -486,36 +521,11 @@ func (s *statsCtx) Update(e Entry) { func (s *statsCtx) getData(timeUnit TimeUnit) map[string]interface{} { d := map[string]interface{}{} - tx := s.beginTxn(false) - if tx == nil { - return nil - } - - units := []*unitDB{} //per-hour units lastID := s.conf.UnitID() firstID := lastID - s.limit + 1 - for i := firstID; i != lastID; i++ { - u := s.loadUnitFromDB(tx, i) - if u == nil { - u = &unitDB{} - u.NResult = make([]uint64, rLast) - } - units = append(units, u) - } - - _ = tx.Rollback() - - s.unitLock.Lock() - cu := serialize(s.unit) - cuID := s.unit.id - s.unitLock.Unlock() - if cuID != lastID { - units = units[1:] - } - units = append(units, cu) - - if len(units) != int(s.limit) { - log.Fatalf("len(units) != s.limit: %d %d", len(units), s.limit) + units := s.loadUnits(lastID) + if units == nil { + return nil } // per time unit counters: