Bound the WHOIS fetcher's success and error time lists (closes #118)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
recordSuccess and recordFailure appended a time on every fetch, and only GetStats, run when a stats endpoint is requested, dropped the times older than statsWindow, so a daemon nobody polled kept every one. Each now drops those times before it appends. The drop takes them off the front of the list instead of copying the rest: the times are in the order they were recorded, and it now runs on every fetch. The fetcher reads the time through a now field so a test can set the clock. The test records 100,000 successes and failures a second apart without asking for the stats and finds one hour's worth of each kept. Model: opus-5-5
This commit was merged in pull request #143.
This commit is contained in:
@@ -203,3 +203,35 @@ func TestASNFetcherStopReturnsByItsDeadline(t *testing.T) {
|
||||
t.Fatal("the fetcher goroutine did not return after the lookup ended")
|
||||
}
|
||||
}
|
||||
|
||||
// TestRecordKeepsOnlyTheStatsWindow records a success and a failure every
|
||||
// second, by a clock the test sets, far longer than statsWindow, and never
|
||||
// asks for the stats. The fetcher must keep only the times within the last
|
||||
// statsWindow.
|
||||
func TestRecordKeepsOnlyTheStatsWindow(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
const (
|
||||
records = 100_000
|
||||
step = time.Second
|
||||
want = int(statsWindow / step)
|
||||
)
|
||||
|
||||
clock := time.Now()
|
||||
|
||||
f := NewASNFetcher(newMockStore(), logger.New().Logger)
|
||||
f.now = func() time.Time { return clock }
|
||||
|
||||
for range records {
|
||||
clock = clock.Add(step)
|
||||
|
||||
f.recordSuccess()
|
||||
f.recordFailure()
|
||||
}
|
||||
|
||||
if len(f.successTimes) != want || len(f.errorTimes) != want {
|
||||
t.Errorf("%d success and %d error times kept, want %d of each, "+
|
||||
"those of the last %s", len(f.successTimes), len(f.errorTimes),
|
||||
want, statsWindow)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user