Skip to content

fix: write each SPOP frame with a single socket write - #1

Merged
oleksandr-nc merged 1 commit into
masterfrom
fix/single-write-frame-emission
Aug 14, 2026
Merged

fix: write each SPOP frame with a single socket write#1
oleksandr-nc merged 1 commit into
masterfrom
fix/single-write-frame-emission

Conversation

@oleksandr-nc

@oleksandr-nc oleksandr-nc commented Aug 14, 2026

Copy link
Copy Markdown

The library wrote each SPOP frame with three separate write() calls (length prefix, frame header, payload). asyncio sends every write() immediately with TCP_NODELAY, so frames regularly left as 2-3 TCP segments. HAProxy 3.2's rewritten SPOP mux has a timing-sensitive bug with an AGENT-HELLO split across segments: it resets the connection instead of waiting for the remaining bytes, so SPOE transactions fail intermittently once all connection retries are lost. Verified: roughly 25-40% of cold connection attempts failed on HAProxy 3.2.0/3.2.22/3.3/3.4, zero on 3.1.2 (whose legacy SPOE applet reassembled partial frames fine).

Emitting the whole frame in one write removes the partial-frame window entirely and makes HaRP on HAProxy 3.2 fully stable: 15/15 clean cold starts and zero handshake resets, against ~30% failed cold starts before. One syscall instead of three is also simply better.

Found while investigating the CI failure on nextcloud/HaRP#116.

Signed-off-by: Oleksander Piskun <oleksandr2088@icloud.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant