Files
Thomas GöttgensandBen Meadors 0dafcc90fe fix(api): retain the unwritten tail on a short TCP API write (#11890)
* fix(api): retain the unwritten tail on a short TCP API write

ServerAPI closed the session whenever stream->write() returned fewer bytes than
requested. A short write is transmit-buffer backpressure, not a dead socket, and
it is most likely during the back-to-back frames of the initial NodeDB dump, so
a node at its node cap dropped clients on effectively every connect.

Route TCP frames through StreamFrameWriter, the retained-tail path the USB CDC
console already uses: the remainder is re-offered on the next pass and the
session is closed only when the link itself is gone. Poll at 25ms while output
is still undelivered, since nothing wakes the thread when the socket frees
transmit space.

Fixes #11822

* fix(api): block log re-encoding while a TCP frame is retained

emitLogRecord() writes into txBufLog and StreamFrameWriter can now hold that
buffer as a retained tail, so a second log record would overwrite bytes the
transport has not sent yet. Gate encoding on the retained-frame state, matching
SerialConsole.

No caller reaches this today (emitLogRecord() is only used by SerialConsole),
but retaining the buffer at all is new here.

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2026-09-18 06:54:50 +00:00
..