From debe588bbab35cdf6bed501a1da011025bec6182 Mon Sep 17 00:00:00 2001 From: clawbot <35+clawbot@noreply.example.org> Date: Fri, 2 Oct 2026 16:27:00 +0200 Subject: [PATCH] Seed the retention tests 50 rows per insert, not 500 (closes #198) Three retention tests made internal/database the slowest test package, mostly by seeding thousands of rows 500 per insert: the SQLite driver finds each parameter's value by scanning the statement's arguments from the first until it reaches that parameter's, so binding grows with the square of the parameter count. They now seed the same rows 50 per insert, about three times faster; no test case or assertion changes. The package drops from 13 to 22s to about 7s. What keeps make test above the 20s target is now mostly the cold -race compile of the tree, which moves with host load. The 90s per-package timeout stays; script/test's header records the new figures. Model: opus-5-5 --- internal/database/totals_test.go | 15 +++++++++++---- script/test | 6 +++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/internal/database/totals_test.go b/internal/database/totals_test.go index 253be5e..12f8720 100644 --- a/internal/database/totals_test.go +++ b/internal/database/totals_test.go @@ -102,6 +102,13 @@ func TestWebhookDBManager_TotalsSurviveReopen(t *testing.T) { // seedExpiredEvents stores count events created at the given time, // each with a delivered delivery to one target and a failed delivery // to the other, and one attempt for each delivery. +// +// It and seedBareEvents insert 50 rows per statement, not more. The +// SQLite driver looks up each parameter's value by scanning the +// statement's arguments from the first until it reaches that +// parameter's, so the time to bind a statement grows with the square of +// its parameter count: at 500 rows, several thousand parameters, the +// seeding took most of these tests' time under -race. func seedExpiredEvents( t *testing.T, db *gorm.DB, @@ -138,8 +145,8 @@ func seedExpiredEvents( ) } - require.NoError(t, db.CreateInBatches(events, 500).Error) - require.NoError(t, db.CreateInBatches(deliveries, 500).Error) + require.NoError(t, db.CreateInBatches(events, 50).Error) + require.NoError(t, db.CreateInBatches(deliveries, 50).Error) results := make([]database.DeliveryResult, len(deliveries)) for i := range deliveries { @@ -148,7 +155,7 @@ func seedExpiredEvents( } } - require.NoError(t, db.CreateInBatches(results, 500).Error) + require.NoError(t, db.CreateInBatches(results, 50).Error) } // seedBareEvents stores count events created at the given time, with @@ -172,7 +179,7 @@ func seedBareEvents( events[i].CreatedAt = createdAt } - require.NoError(t, db.CreateInBatches(events, 500).Error) + require.NoError(t, db.CreateInBatches(events, 50).Error) } // TestRetentionReaper_PrunesMoreThanOneBatch verifies that a prune diff --git a/script/test b/script/test index 5aa6d49..9ba4a8c 100755 --- a/script/test +++ b/script/test @@ -27,7 +27,11 @@ # Those figures predate tests hashing the admin password at 1 MB instead of # 64 MB (https://git.eeqj.de/sneak/webhooker/pulls/404). After that change, in # a cache-defeated build at host load 44-109 (2026-10-02), internal/handlers -# took 8.5s and the slowest package was internal/database at 15.8s. +# took 8.5s and the slowest package was internal/database at 15.8s. Once its +# retention tests seeded 50 rows per insert instead of 500 +# (https://git.eeqj.de/sneak/webhooker/issues/198), internal/database took +# 7.3s and the slowest package was internal/handlers at 8.1s to 10.0s, at host +# load 25-48 (2026-10-02). # # -p 4 -parallel 8 keep the run under 2 GB of memory: at most four test # binaries build or run at once, each with at most eight parallel tests. Under