Skip to content

fix(execution): honor SOCK_NONBLOCK on host-net sockets so git push >16KiB completes#1715

Open
NathanFlurry wants to merge 1 commit into
stack/fix-git-wasi-safe-sideband-demux-no-fork-in-fetch-pack-for-https-transport-yxttuznkfrom
stack/fix-execution-honor-sock_nonblock-on-host-net-sockets-so-git-push-16kib-completes-urmlkuuz
Open

fix(execution): honor SOCK_NONBLOCK on host-net sockets so git push >16KiB completes#1715
NathanFlurry wants to merge 1 commit into
stack/fix-git-wasi-safe-sideband-demux-no-fork-in-fetch-pack-for-https-transport-yxttuznkfrom
stack/fix-execution-honor-sock_nonblock-on-host-net-sockets-so-git-push-16kib-completes-urmlkuuz

Conversation

@NathanFlurry

Copy link
Copy Markdown
Member

The WASM runner dropped the SOCK_NONBLOCK bit from socket(2) and returned
EBADF for fcntl(F_GETFL/F_SETFL) on host-net socket fds, so guest libcurl
(git-remote-http, mbedTLS in-guest) ran its TLS socket in blocking mode.
Any smart-HTTP upload larger than one TLS record (16384 bytes plaintext)
deadlocked: curl checks for an early server response mid-upload, and the
blocking recv() waited on a server that was itself waiting for the rest of
the POST body. Also allocate host-net fds below FD_SETSIZE (1024) because
libcurl's select-based Curl_poll/curl_multi_fdset silently drop fds >=
FD_SETSIZE from the pollset, which stalls non-blocking transfers.

  • wasm-runner.mjs: parse SOCK_NONBLOCK (0x4000) in net_socket, honor
    O_NONBLOCK via fd_fdstat_get/fd_fdstat_set_flags for host-net sockets,
    and start host-net fds at 600 instead of 4096.
  • node_import_cache.rs: bump NODE_IMPORT_CACHE_ASSET_VERSION for the
    runner asset change.

…16KiB completes

The WASM runner dropped the SOCK_NONBLOCK bit from socket(2) and returned
EBADF for fcntl(F_GETFL/F_SETFL) on host-net socket fds, so guest libcurl
(git-remote-http, mbedTLS in-guest) ran its TLS socket in blocking mode.
Any smart-HTTP upload larger than one TLS record (16384 bytes plaintext)
deadlocked: curl checks for an early server response mid-upload, and the
blocking recv() waited on a server that was itself waiting for the rest of
the POST body. Also allocate host-net fds below FD_SETSIZE (1024) because
libcurl's select-based Curl_poll/curl_multi_fdset silently drop fds >=
FD_SETSIZE from the pollset, which stalls non-blocking transfers.

- wasm-runner.mjs: parse SOCK_NONBLOCK (0x4000) in net_socket, honor
  O_NONBLOCK via fd_fdstat_get/fd_fdstat_set_flags for host-net sockets,
  and start host-net fds at 600 instead of 4096.
- node_import_cache.rs: bump NODE_IMPORT_CACHE_ASSET_VERSION for the
  runner asset change.
This was referenced Jul 9, 2026
@NathanFlurry

NathanFlurry commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

Stack for rivet-dev/agentos

Get stack: forklift get 1715
Push local edits: forklift submit
Merge when ready: forklift merge 1715

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