logtail: the sweep closes only queued rows, with reason "reconcile" (audit H3)
reconcile() closed a row through UpdateStatus (WHERE queue_id AND to_addr), which could overwrite a "sent" the tailer wrote between the listing and the close, and rewrite an old row of a reused queue id. store.CloseUnreported sets status bounced and reason "reconcile" (store.ReasonReconcile; the 0006 column, no schema change) WHERE ... AND status = 'queued'; the sweep counts rows actually closed. Tests: store - a queued row is closed with the reason, a sent row is left alone (0 rows); logtail - the sweep's close goes through CloseUnreported. CHANGELOG [Unreleased], audit plan line ticked, roadmap 9/61. Evidence: go vet ./... clean; go test ./internal/store ok, ./internal/logtail ok but for TestFollowTailsAndRotates (Windows rename of an open file, fails here always); the server run of the stage follows before the push. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -15,6 +15,12 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version
|
||||
marked `bounced`. A listing over the cap now tells the sweep nothing, as it
|
||||
already did for the notification about mail waiting too long; the Mail
|
||||
queue page still shows the cut listing with its note (audit 2026-10-12, H3).
|
||||
- **The sweep closes only what is still queued, and says it did.** Its close
|
||||
was the tailer's plain status update, so a `sent` the log wrote an instant
|
||||
earlier could be overwritten with `bounced`, and a reused queue id could
|
||||
rewrite an old row of the same recipient. The close is now conditional on
|
||||
the row still being `queued`, and the row it closes carries the reason
|
||||
`reconcile` (audit 2026-10-12, H3).
|
||||
|
||||
## [2.4.2] - 2026-10-14
|
||||
|
||||
|
||||
Reference in New Issue
Block a user