- Shipped
- November 8, 2026 at 8:17 AM UTC
- Author
- Kamo
- Commit
- e5ca475
A requested-document upload Antivirus holds while busy is recorded at once for EVERY kind (antivirus_status PENDING, pinned by the original's content triple) and answers 202 + scan PENDING; the request no longer blocks up to 45 s for the hold and a rendition, and never answers 503 'try again' for it. LegalHeldUploads finishes it: a CORE NATS queue subscription (group docs-legal-antivirus) on antivirus.hold.verdict waits for the row and for ConversionService's completer to store the checked bytes, then makes the PDF from THOSE bytes (Office: ConversionService's own post-hold rendition, so the two never race for convertedDat; photos: converted here, upright) and moves the pin; harmful after the hold -> BLOCKED + family (the uploader and Antivirus viewers were told by AntivirusGate when the completer recorded the verdict). Idempotent (writes only land on a still-PENDING row), retried on YugabyteDB conflicts, announced on rt.org.<org>.docs with the assignment in the path so open pages re-read. The event is a nudge: the upload kicks one attempt after its commit and any read of a PENDING file kicks another. Every read (member, reviewer, SI pre-check, executed binder) of a PENDING file answers 423 ANTIVIRUS_CHECKING, of a BLOCKED one 423 ANTIVIRUS_BLOCKED (family, fileName), and the served PDF goes through the Antivirus read gate; the reviewer controller keeps the platform shape. A member cannot finish while a file is still checking or blocked. File JSON carries scan{}.
