From 187eee52f14cc0d0377d26bc81d88e482a5e4b13 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Mon, 30 Dec 2019 18:20:11 +0100 Subject: Simplify log pruning --- log/logger.go | 40 ++++++++-------------------------------- log/logger_test.go | 10 ++++++---- 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/log/logger.go b/log/logger.go index 1a5b2d0..d8dc4af 100644 --- a/log/logger.go +++ b/log/logger.go @@ -26,7 +26,6 @@ type Logger struct { queue chan Entry db *sql.Client wg sync.WaitGroup - done chan bool now func() time.Time } @@ -50,10 +49,6 @@ type Entry struct { // New creates a new logger, writing log output to writer w prefixed with prefix. Persisted logging behaviour is // controller by options. func New(w io.Writer, prefix string, options RecordOptions) (*Logger, error) { - return newLogger(w, prefix, options, time.Minute) -} - -func newLogger(w io.Writer, prefix string, options RecordOptions, interval time.Duration) (*Logger, error) { logger := &Logger{ Logger: log.New(w, prefix, 0), queue: make(chan Entry, 100), @@ -68,38 +63,13 @@ func newLogger(w io.Writer, prefix string, options RecordOptions, interval time. } } logger.wg.Add(1) - go logger.readQueue() - if options.TTL > 0 { - logger.wg.Add(1) - logger.done = make(chan bool) - go maintain(logger, options.TTL, interval) - } + go logger.readQueue(options.TTL) return logger, nil } -func maintain(logger *Logger, ttl, interval time.Duration) { - defer logger.wg.Done() - ticker := time.NewTicker(interval) - for { - select { - case <-logger.done: - ticker.Stop() - return - case <-ticker.C: - t := logger.now().Add(-ttl) - if err := logger.db.DeleteLogBefore(t); err != nil { - logger.Printf("error deleting log entries before %v: %s", t, err) - } - } - } -} - // Close consumes any outstanding log requests and closes the logger. func (l *Logger) Close() error { close(l.queue) - if l.done != nil { - l.done <- true - } l.wg.Wait() return nil } @@ -154,11 +124,17 @@ func (l *Logger) Get(n int) ([]Entry, error) { return entries, nil } -func (l *Logger) readQueue() { +func (l *Logger) readQueue(ttl time.Duration) { defer l.wg.Done() for e := range l.queue { if err := l.db.WriteLog(e.Time, e.RemoteAddr, e.Hijacked, e.Qtype, e.Question, e.Answers...); err != nil { l.Printf("write failed: %+v: %s", e, err) } + if ttl > 0 { + t := l.now().Add(-ttl) + if err := l.db.DeleteLogBefore(t); err != nil { + l.Printf("deleting log entries before %v failed: %s", t, err) + } + } } } diff --git a/log/logger_test.go b/log/logger_test.go index 9a58292..f3a91f1 100644 --- a/log/logger_test.go +++ b/log/logger_test.go @@ -104,11 +104,11 @@ func TestAnswerMerging(t *testing.T) { } func TestLogPruning(t *testing.T) { - logger, err := newLogger(os.Stderr, "test: ", RecordOptions{ + logger, err := New(os.Stderr, "test: ", RecordOptions{ Mode: ModeAll, Database: ":memory:", TTL: time.Hour, - }, 10*time.Millisecond) + }) if err != nil { t.Fatal(err) } @@ -133,8 +133,10 @@ func TestLogPruning(t *testing.T) { // Advance time beyond log TTL tt = tt.Add(time.Hour).Add(time.Second) - for len(entries) > 0 { - entries, err = logger.Get(1) + // Trigger pruning by recording another entry + logger.Record(net.IPv4(192, 0, 2, 100), false, 1, "2.example.com.", "192.0.2.2") + for len(entries) > 1 { + entries, err = logger.Get(2) if err != nil { t.Fatal(err) } -- cgit v1.2.3