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