diff --git a/engine/stats_queue.go b/engine/stats_queue.go index bfc07356d..d69ffd8dc 100644 --- a/engine/stats_queue.go +++ b/engine/stats_queue.go @@ -184,16 +184,19 @@ func (sq *StatsQueue) purgeObsoleteCdrs() { } } if sq.conf.TimeWindow > 0 { + var index int for i, cdr := range sq.Cdrs { if time.Now().Sub(cdr.SetupTime) > sq.conf.TimeWindow { sq.removeFromMetrics(cdr) continue - } else { - if i > 0 { - sq.Cdrs = sq.Cdrs[i:] - } - break } + index = i + break + } + if index > 0 { + sq.Cdrs = sq.Cdrs[index:] + } else { + sq.Cdrs = make([]*QCdr, 0) } } } diff --git a/engine/stats_test.go b/engine/stats_test.go index def739f13..c08374ee5 100644 --- a/engine/stats_test.go +++ b/engine/stats_test.go @@ -458,3 +458,25 @@ func TestStatsSaveRestoreQeue(t *testing.T) { t.Errorf("Expecting %+v got: %+v", sq.Cdrs[0], recovered.Cdrs[0]) } } + +func TestStatsPurge(t *testing.T) { + sq := NewStatsQueue(&CdrStats{Metrics: []string{ASR, ACD, TCD, ACC, TCC}, TimeWindow: 30 * time.Minute}) + cdr := &CDR{ + AnswerTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + Usage: 10 * time.Second, + Cost: 1, + } + sq.AppendCDR(cdr) + cdr.Cost = 2 + sq.AppendCDR(cdr) + cdr.Cost = 3 + sq.AppendCDR(cdr) + s := sq.GetStats() + if s[ASR] != -1 || + s[ACD] != -1 || + s[TCD] != -1 || + s[ACC] != -1 || + s[TCC] != -1 { + t.Errorf("Error getting stats: %+v", s) + } +}