Pin the close before the reopen in the archive sweep (closes #103)
check / check (push) Successful in 3m21s

Add a test that keeps the archive's connection from before a sweep
and checks that the sweep closed it. Without the close before the
reopen, the reopen replaced the handle without closing it and one
connection leaked per archive per sweep, yet every test passed.

The sweeper's listing query now takes the sweep's context, and a
comment on its cancel function says why it needs no lock.

The handlers' type-filtered count of a webhook's remaining targets
no longer exists: since each database target has its own archive
file, deleting a target evicts that target's writer alone.

Model: opus-5-5
This commit is contained in:
2026-10-02 14:29:46 +00:00
parent debe588bba
commit 3e302f72ce
2 changed files with 35 additions and 2 deletions
+7 -2
View File
@@ -45,8 +45,12 @@ type ArchiveSweeper struct {
eng *Engine
log *slog.Logger
interval time.Duration
cancel context.CancelFunc
wg sync.WaitGroup
// cancel needs no lock: fx runs start and then stop on the one
// goroutine that runs the app, so they never overlap.
cancel context.CancelFunc
wg sync.WaitGroup
}
// NewArchiveSweeper creates the archive sweeper and registers
@@ -163,6 +167,7 @@ func (s *ArchiveSweeper) sweep(ctx context.Context) {
var targets []database.Target
err := s.db.DB().
WithContext(ctx).
Model(&database.Target{}).
Where("type = ?", database.TargetTypeDatabase).
Find(&targets).Error