Skip to content

docs(rsync_io): evaluate socketpair vs stdio pipes for SSH subprocess#3438

Merged
oferchen merged 1 commit into
masterfrom
docs/ssh-socketpair-audit
Apr 29, 2026
Merged

docs(rsync_io): evaluate socketpair vs stdio pipes for SSH subprocess#3438
oferchen merged 1 commit into
masterfrom
docs/ssh-socketpair-audit

Conversation

@oferchen
Copy link
Copy Markdown
Owner

Summary

  • Adds docs/audits/ssh-socketpair-vs-pipes.md (tasks Fix missing imports in daemon tests #1686 + Add integration tests for core client flows #1689).
  • Compares oc-rsync's current two-pipe SSH stdio model
    (crates/rsync_io/src/ssh/builder.rs:280-282) against upstream
    rsync 3.4.1's socketpair wire (pipe.c::piped_child,
    util1.c::fd_pair, with pipe fallback when HAVE_SOCKETPAIR is
    undefined).
  • Documents six findings (FD topology divergence, no O_NONBLOCK
    on stdio, no shared poll registration, half-close limits, mixed
    IPC primitives across stderr vs wire, multiplex-vs-stderr
    boundary) and a three-phase migration plan: socketpair-backed
    wire on Unix with Windows pipe fallback, unified-FD event loop
    integration, and shutdown(SHUT_WR)-based half-close.
  • Auxiliary stderr socketpair (aux_channel.rs:264-291) is
    already in place; the audit recommends keeping it and extending
    the same factory pattern to the wire. No SO_PASSCRED or third
    socketpair needed - upstream multiplexes remote-rsync diagnostics
    as MSG_* envelopes on the wire (io.c::send_msg).

Test plan

  • No code changes; docs only.
  • Markdown lints (hyphens not em-dashes; matches existing
    docs/audits/*.md style).

…#1686, #1689)

Adds docs/audits/ssh-socketpair-vs-pipes.md comparing oc-rsync's current
two-pipe SSH stdio model against upstream rsync 3.4.1's socketpair-based
wire (pipe.c::piped_child, util1.c::fd_pair). Documents trade-offs,
cross-platform impact (Unix socketpair, Windows pipe fallback), six
findings, and a phased migration plan. The auxiliary stderr channel
already uses socketpair on Unix; this audit recommends extending the
same pattern to the wire.
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Apr 29, 2026
@oferchen oferchen merged commit 5963721 into master Apr 29, 2026
12 checks passed
@oferchen oferchen deleted the docs/ssh-socketpair-audit branch April 29, 2026 10:21
oferchen added a commit that referenced this pull request May 1, 2026
…#1686, #1689) (#3438)

Adds docs/audits/ssh-socketpair-vs-pipes.md comparing oc-rsync's current
two-pipe SSH stdio model against upstream rsync 3.4.1's socketpair-based
wire (pipe.c::piped_child, util1.c::fd_pair). Documents trade-offs,
cross-platform impact (Unix socketpair, Windows pipe fallback), six
findings, and a phased migration plan. The auxiliary stderr channel
already uses socketpair on Unix; this audit recommends extending the
same pattern to the wire.
oferchen added a commit that referenced this pull request May 1, 2026
…nsport (#1938) (#3525)

Formalizes the SSH stdio transport audit at docs/audits/ssh-socketpair-vs-pipes.md
under tracker #1938, consolidating prior #1686 working notes (PR #3438), the
io_uring boundary documented for #1858 (PR #3418), and the stderr socketpair
shipped under #1689 (PR #3383). Restructures the document into the formal
seven-section layout (summary, upstream reference, current implementation,
trade-offs, decision matrix, recommendation, implementation notes) plus
findings and references.

Recommends keeping anonymous pipes for the SSH wire and not pursuing the
socketpair migration: splice(2) and vmsplice(2) require a pipe end, the
zero-copy plan in #1860 depends on that, and the unified-FD argument is
subsumed by the async-transport refactor (#2068, #1655). Closes #1687
(prototype socketpair wire) as do-not-implement and #1902 (verify wire
claim against rsync_io source) as verified.

Citations were re-checked against worktree source: builder.rs:300-301
(Stdio::piped on the wire), aux_channel.rs:263-285 (UnixStream::pair for
stderr, Unix only), connection.rs:30-39 (SshConnection struct),
mod.rs:57-75 (io_uring boundary). Upstream evidence verified against
target/interop/upstream-src/rsync-3.4.1/: pipe.c:48-97 (piped_child),
util1.c:74-96 (fd_pair), main.c:504-663 (do_cmd dispatch),
clientserver.c:116-148 (daemon TCP wire), socket.c:736-846 (sock_exec
test escape).
oferchen added a commit that referenced this pull request May 5, 2026
…#1686, #1689) (#3438)

Adds docs/audits/ssh-socketpair-vs-pipes.md comparing oc-rsync's current
two-pipe SSH stdio model against upstream rsync 3.4.1's socketpair-based
wire (pipe.c::piped_child, util1.c::fd_pair). Documents trade-offs,
cross-platform impact (Unix socketpair, Windows pipe fallback), six
findings, and a phased migration plan. The auxiliary stderr channel
already uses socketpair on Unix; this audit recommends extending the
same pattern to the wire.
oferchen added a commit that referenced this pull request May 5, 2026
…nsport (#1938) (#3525)

Formalizes the SSH stdio transport audit at docs/audits/ssh-socketpair-vs-pipes.md
under tracker #1938, consolidating prior #1686 working notes (PR #3438), the
io_uring boundary documented for #1858 (PR #3418), and the stderr socketpair
shipped under #1689 (PR #3383). Restructures the document into the formal
seven-section layout (summary, upstream reference, current implementation,
trade-offs, decision matrix, recommendation, implementation notes) plus
findings and references.

Recommends keeping anonymous pipes for the SSH wire and not pursuing the
socketpair migration: splice(2) and vmsplice(2) require a pipe end, the
zero-copy plan in #1860 depends on that, and the unified-FD argument is
subsumed by the async-transport refactor (#2068, #1655). Closes #1687
(prototype socketpair wire) as do-not-implement and #1902 (verify wire
claim against rsync_io source) as verified.

Citations were re-checked against worktree source: builder.rs:300-301
(Stdio::piped on the wire), aux_channel.rs:263-285 (UnixStream::pair for
stderr, Unix only), connection.rs:30-39 (SshConnection struct),
mod.rs:57-75 (io_uring boundary). Upstream evidence verified against
target/interop/upstream-src/rsync-3.4.1/: pipe.c:48-97 (piped_child),
util1.c:74-96 (fd_pair), main.c:504-663 (do_cmd dispatch),
clientserver.c:116-148 (daemon TCP wire), socket.c:736-846 (sock_exec
test escape).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant