From 011a9b703f90731318a4a4ddb7010a2bd849e532 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 the statement's arguments from the first until it reaches that parameter's, 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 | 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 -- 2.54.0