From 4743c81038052b9e0ca29ae5f1565021d36ca1ef Mon Sep 17 00:00:00 2001 From: Stanislav Chzhen Date: Wed, 1 Mar 2023 18:14:16 +0300 Subject: [PATCH] all: imp code; fix time conversion --- internal/querylog/http.go | 55 +++++++++++++++++-------------------- internal/stats/http.go | 34 ++++++++++------------- internal/stats/http_test.go | 2 +- internal/stats/stats.go | 6 ++-- 4 files changed, 42 insertions(+), 55 deletions(-) diff --git a/internal/querylog/http.go b/internal/querylog/http.go index 226600f0..ab761307 100644 --- a/internal/querylog/http.go +++ b/internal/querylog/http.go @@ -125,10 +125,10 @@ func (l *queryLog) handleGetQueryLogConfig(w http.ResponseWriter, r *http.Reques ignored := l.conf.Ignored.Values() slices.Sort(ignored) _ = aghhttp.WriteJSONResponse(w, r, getConfigResp{ - Enabled: aghalg.BoolToNullBool(l.conf.Enabled), - Interval: float64(l.conf.RotationIvl.Milliseconds()), - AnonymizeClientIP: aghalg.BoolToNullBool(l.conf.AnonymizeClientIP), Ignored: ignored, + Interval: float64(l.conf.RotationIvl.Milliseconds()), + Enabled: aghalg.BoolToNullBool(l.conf.Enabled), + AnonymizeClientIP: aghalg.BoolToNullBool(l.conf.AnonymizeClientIP), }) } @@ -163,7 +163,7 @@ func (l *queryLog) handleQueryLogConfig(w http.ResponseWriter, r *http.Request) return } - ivl := time.Duration(newConf.Interval) * timeutil.Day + ivl := time.Duration(float64(timeutil.Day) * newConf.Interval) hasIvl := !math.IsNaN(newConf.Interval) if hasIvl && !checkInterval(ivl) { @@ -204,7 +204,6 @@ func (l *queryLog) handleQueryLogConfig(w http.ResponseWriter, r *http.Request) // queries. func (l *queryLog) handlePutQueryLogConfig(w http.ResponseWriter, r *http.Request) { newConf := &getConfigResp{} - err := json.NewDecoder(r.Body).Decode(newConf) if err != nil { aghhttp.Error(r, w, http.StatusBadRequest, "%s", err) @@ -212,8 +211,14 @@ func (l *queryLog) handlePutQueryLogConfig(w http.ResponseWriter, r *http.Reques return } - ivl := time.Duration(float64(time.Millisecond) * newConf.Interval) + set, err := aghnet.NewDomainNameSet(newConf.Ignored) + if err != nil { + aghhttp.Error(r, w, http.StatusUnprocessableEntity, "ignored: %s", err) + return + } + + ivl := time.Duration(newConf.Interval) * time.Millisecond err = validateIvl(ivl) if err != nil { aghhttp.Error(r, w, http.StatusUnprocessableEntity, "unsupported interval: %s", err) @@ -221,6 +226,18 @@ func (l *queryLog) handlePutQueryLogConfig(w http.ResponseWriter, r *http.Reques return } + if newConf.Enabled == aghalg.NBNull { + aghhttp.Error(r, w, http.StatusUnprocessableEntity, "enabled is null") + + return + } + + if newConf.AnonymizeClientIP == aghalg.NBNull { + aghhttp.Error(r, w, http.StatusUnprocessableEntity, "anonymize_client_ip is null") + + return + } + defer l.conf.ConfigModified() l.lock.Lock() @@ -229,21 +246,10 @@ func (l *queryLog) handlePutQueryLogConfig(w http.ResponseWriter, r *http.Reques // Copy data, modify it, then activate. Other threads (readers) don't need // to use this lock. conf := *l.conf - if newConf.Enabled == aghalg.NBNull { - aghhttp.Error(r, w, http.StatusUnprocessableEntity, "enabled is null") - - return - } - - conf.Enabled = newConf.Enabled == aghalg.NBTrue + conf.Ignored = set conf.RotationIvl = ivl - - if newConf.AnonymizeClientIP == aghalg.NBNull { - aghhttp.Error(r, w, http.StatusUnprocessableEntity, "anonymize_client_ip is null") - - return - } + conf.Enabled = newConf.Enabled == aghalg.NBTrue conf.AnonymizeClientIP = newConf.AnonymizeClientIP == aghalg.NBTrue if conf.AnonymizeClientIP { @@ -252,17 +258,6 @@ func (l *queryLog) handlePutQueryLogConfig(w http.ResponseWriter, r *http.Reques l.anonymizer.Store(nil) } - if len(newConf.Ignored) > 0 { - set, serr := aghnet.NewDomainNameSet(newConf.Ignored) - if serr != nil { - aghhttp.Error(r, w, http.StatusUnprocessableEntity, "ignored: %s", serr) - - return - } - - conf.Ignored = set - } - l.conf = &conf } diff --git a/internal/stats/http.go b/internal/stats/http.go index 5686193a..38ab5bba 100644 --- a/internal/stats/http.go +++ b/internal/stats/http.go @@ -87,8 +87,7 @@ func (s *StatsCtx) handleStatsInfo(w http.ResponseWriter, r *http.Request) { s.lock.Lock() defer s.lock.Unlock() - days := uint32(s.limit.Hours() / 24) - + days := uint32(s.limit / timeutil.Day) ok := checkInterval(days) if !ok || (s.enabled && days == 0) { // NOTE: If interval is custom we set it to 90 days for compatibility @@ -113,9 +112,9 @@ func (s *StatsCtx) handleGetStatsConfig(w http.ResponseWriter, r *http.Request) slices.Sort(ignored) resp := getConfigResp{ - Enabled: aghalg.BoolToNullBool(s.enabled), - Interval: float64(s.limit.Milliseconds()), Ignored: ignored, + Interval: float64(s.limit.Milliseconds()), + Enabled: aghalg.BoolToNullBool(s.enabled), } _ = aghhttp.WriteJSONResponse(w, r, resp) } @@ -159,8 +158,14 @@ func (s *StatsCtx) handlePutStatsConfig(w http.ResponseWriter, r *http.Request) return } - ivl := time.Duration(float64(time.Millisecond) * reqData.Interval) + set, err := aghnet.NewDomainNameSet(reqData.Ignored) + if err != nil { + aghhttp.Error(r, w, http.StatusUnprocessableEntity, "ignored: %s", err) + return + } + + ivl := time.Duration(reqData.Interval) * time.Millisecond err = validateIvl(ivl) if err != nil { aghhttp.Error(r, w, http.StatusUnprocessableEntity, "unsupported interval: %s", err) @@ -168,31 +173,20 @@ func (s *StatsCtx) handlePutStatsConfig(w http.ResponseWriter, r *http.Request) return } - defer s.configModified() - if reqData.Enabled == aghalg.NBNull { aghhttp.Error(r, w, http.StatusUnprocessableEntity, "enabled is null") return } + defer s.configModified() + s.lock.Lock() defer s.lock.Unlock() - s.enabled = reqData.Enabled == aghalg.NBTrue - + s.ignored = set s.limit = ivl - - if len(reqData.Ignored) > 0 { - set, serr := aghnet.NewDomainNameSet(reqData.Ignored) - if serr != nil { - aghhttp.Error(r, w, http.StatusUnprocessableEntity, "ignored: %s", serr) - - return - } - - s.ignored = set - } + s.enabled = reqData.Enabled == aghalg.NBTrue } // handleStatsReset handles requests to the POST /control/stats_reset endpoint. diff --git a/internal/stats/http_test.go b/internal/stats/http_test.go index 916168dc..c950105f 100644 --- a/internal/stats/http_test.go +++ b/internal/stats/http_test.go @@ -41,7 +41,7 @@ func TestHandleStatsConfig(t *testing.T) { body: getConfigResp{ Enabled: aghalg.NBTrue, Interval: float64(minIvl.Milliseconds()), - Ignored: nil, + Ignored: []string{}, }, wantCode: http.StatusOK, wantErr: "", diff --git a/internal/stats/stats.go b/internal/stats/stats.go index 16226bff..fb5b8685 100644 --- a/internal/stats/stats.go +++ b/internal/stats/stats.go @@ -119,8 +119,7 @@ type StatsCtx struct { // enabled tells if the statistics are enabled. enabled bool - // limit is an upper limit for collecting statistics into the - // current unit. + // limit is an upper limit for collecting statistics. limit time.Duration // ignored is the list of host names, which should not be counted. @@ -460,7 +459,7 @@ func (s *StatsCtx) setLimitLocked(limit time.Duration) { if limit != 0 { s.enabled = true s.limit = limit - log.Debug("stats: set limit: %d days", int(limit.Hours()/24)) + log.Debug("stats: set limit: %d days", int(limit/timeutil.Day)) return } @@ -550,7 +549,6 @@ func (s *StatsCtx) loadUnits(limit uint32) (units []*unitDB, firstID uint32) { // Per-hour units. units = make([]*unitDB, 0, limit) firstID = curID - limit + 1 - for i := firstID; i != curID; i++ { u := loadUnitFromDB(tx, i) if u == nil {