mirror of
https://github.com/versity/versitygw.git
synced 2026-09-22 16:04:15 +00:00
Overflow publications ran one goroutine per job: a stalled sink with a full queue grew them without bound (a probe reached a thousand blocked calls). Overflow now runs inline under a bounded semaphore, so at most a fixed number of callers wait and every record still publishes. The publication worker outlived the operational sinks: gateway shutdown closed the RC service and then the sinks while publications were still queued, losing terminal records (reached "file already closed" with the real file logger). The shutdown wrapper now drains the publication queue before closing the RC service, and the route handler exposes the drain; late terminals after the drain publish inline instead of queueing behind a stopped worker. The publication reservation happened after the transfer claim returned: in the window between the claim and the reservation, a concurrent READY's re-authorization denial consumed the unreserved record, so the claimant's successful transfer lost its publication to the denial. The READY handler now reserves before the claim and before re-authorization; a rolled-back claim (wire failure, peer busy) releases the reservation instead of publishing, so the session keeps its record for the next claimant or the reaper. The tracker test now joins the worker through the shutdown drain and asserts per-session outcomes and byte counts instead of an aggregate count that a pending fifth record could satisfy.