From 8bd751d0227bfe82d3bf05b28b75bf3283af2f57 Mon Sep 17 00:00:00 2001 From: clawbot <35+clawbot@noreply.example.org> Date: Fri, 2 Oct 2026 12:46:54 +0000 Subject: [PATCH] Seed the retention tests 50 rows per insert, not 500 (closes #198) internal/database was the slowest test package, and three retention tests were nearly all of it. Most of their time went to seeding thousands of rows 500 per INSERT: the SQLite driver finds each parameter's value by scanning all of the statement's arguments, so binding grows with the square of the parameter count, and a 500-row insert carries several thousand. Seeding 50 rows per insert stores the same rows. No test case or assertion changes. The header of script/test records the new figures; its 90s timeout stays. Model: opus-5-5 --- internal/database/totals_test.go | 14 ++++++++++---- script/test | 6 +++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/database/totals_test.go b/internal/database/totals_test.go index 253be5e..9a4b08e 100644 --- a/internal/database/totals_test.go +++ b/internal/database/totals_test.go @@ -102,6 +102,12 @@ 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 all of the +// statement's arguments, 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 +144,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 +154,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 +178,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