Build Packages / Unit tests (push) Successful in 1h10m55s
Build Packages / DIALS test (push) Successful in 12m20s
Build Packages / XDS test (durin plugin) (push) Successful in 7m16s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m15s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m7s
Build Packages / Generate python client (push) Successful in 25s
Build Packages / Build documentation (push) Successful in 47s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m21s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m31s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 11m38s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 12m26s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m22s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m43s
Build Packages / build:rpm (rocky8) (push) Successful in 9m47s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 8m37s
Build Packages / build:rpm (rocky9) (push) Successful in 10m5s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 7m27s
Three robustness fixes for the writer-facing TCP stream, addressing the spurious "wrong number of images" / connection failures seen under load. 1. Never MSG_ZEROCOPY a transient buffer. The synchronous SendImage path passes a caller-owned buffer with z == nullptr and reuses it for the next frame immediately. With MSG_ZEROCOPY the kernel still references that buffer after send() returns, so the peer could receive corrupted frames and drop the connection mid-stream, truncating the run. Zero-copy is now gated on a ZeroCopyReturnValue that keeps the buffer alive until completion. 2. Make the SendAll watchdog measure lack of progress, not total wall-clock. The previous absolute deadline tore down a healthy but back-pressured connection (slow/starved writer) after a fixed window; the watchdog now resets on every byte actually sent, so only a genuinely stuck socket is closed. Dead peers are still caught by OS keepalive and POLLHUP/POLLERR. 3. Make the END-ack wait progress-based (WaitForEndAck). The writer may still be draining a backlog of DATA frames when END is sent; each DATA ACK is progress, so the timeout only arms once the writer falls silent rather than firing while images are legitimately still being drained. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>