Stop now counts the origin changes inside a running write, in a new writingOriginChanges field, and adds them to the count it logs. The prune test checks which rows survive, including a prefix with rows on both sides of 72 hours. The prefix page tests cover 5,000 and 5,001 rows and a row's time and peer count. New tests cover the dropped-rows warning and the dropped count's reset. The prune floor is named minOriginChangesPerPrefix. The README, TODO, package doc and doc comments are corrected to match. Model: deepseek-v4-pro
This commit is contained in:
@@ -1,12 +1,16 @@
|
||||
package routewatch
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"log/slog"
|
||||
"net/netip"
|
||||
"slices"
|
||||
"testing"
|
||||
|
||||
"git.eeqj.de/sneak/routewatch/internal/database"
|
||||
"git.eeqj.de/sneak/routewatch/internal/logger"
|
||||
"git.eeqj.de/sneak/routewatch/internal/routetable"
|
||||
)
|
||||
|
||||
@@ -125,3 +129,53 @@ func TestPrefixHandlerWritesManyOriginChangesOverSeveralFlushes(t *testing.T) {
|
||||
t.Errorf("WriteOriginChanges held %v changes, want %v", store.counts, want)
|
||||
}
|
||||
}
|
||||
|
||||
// TestPrefixHandlerLogsTheDroppedOriginChanges fills the routing table with
|
||||
// one origin change more than it keeps, then flushes. The warning the flush
|
||||
// logs must carry the dropped count.
|
||||
func TestPrefixHandlerLogsTheDroppedOriginChanges(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var logs bytes.Buffer
|
||||
|
||||
db := newTestDatabase(t)
|
||||
h := prefixHandlerWithoutTimer(db)
|
||||
h.logger = &logger.Logger{
|
||||
Logger: slog.New(slog.NewJSONHandler(&logs,
|
||||
&slog.HandlerOptions{Level: slog.LevelWarn})),
|
||||
}
|
||||
|
||||
announceManyPrefixes(h.table, 100001)
|
||||
|
||||
h.flushBatch()
|
||||
|
||||
var warning struct {
|
||||
Msg string `json:"msg"`
|
||||
Dropped *int `json:"dropped"`
|
||||
}
|
||||
|
||||
found := false
|
||||
|
||||
for line := range bytes.SplitSeq(bytes.TrimSpace(logs.Bytes()), []byte("\n")) {
|
||||
warning.Dropped = nil
|
||||
|
||||
err := json.Unmarshal(line, &warning)
|
||||
if err != nil {
|
||||
t.Fatalf("want a JSON log line, got %q: %v", line, err)
|
||||
}
|
||||
|
||||
if warning.Msg != "Origin changes dropped" {
|
||||
continue
|
||||
}
|
||||
|
||||
found = true
|
||||
|
||||
if warning.Dropped == nil || *warning.Dropped != 1 {
|
||||
t.Errorf("the warning's dropped = %v, want 1", warning.Dropped)
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
t.Errorf("no warning logged the dropped origin changes")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user