Conversation
Add thin passthroughs to the underlying noq batch APIs so downstream crates (e.g. rayfish) can amortize the per-datagram connection-mutex cost, which is the dominant overhead at high pps for a mesh VPN forwarding bursts of TUN packets. - Connection::send_datagrams / read_datagrams delegate to noq::Connection. - Re-export ReadDatagrams and SendMany through endpoint::quic and the public endpoint surface (required by the crate's unreachable_pub lint). - Add [patch.crates-io] pointing noq/noq-proto/noq-udp at the local fork (../noq) so iroh builds against the rayfish noq with the batch APIs. This is a workspace-local dev override; published iroh still resolves to noq 1.0.1 from crates.io.
| [patch.crates-io] | ||
| noq = { path = "../noq/noq" } | ||
| noq-proto = { path = "../noq/noq-proto" } | ||
| noq-udp = { path = "../noq/noq-udp" } |
There was a problem hiding this comment.
I'll do it once we merge noq. Then we can upgrade to whatever version that one adds
|
Related: n0-computer/noq#735 |
|
Thanks for taking care of this side as well! But let's move this back into draft until n0-computer/noq#735 is merged. Please re-open once that's been merged. |
Follow the noq rename to read_many_datagrams / send_many_datagrams and the slice-based signatures.
# Conflicts: # Cargo.lock # Cargo.toml
Take inbound packets from a peer connection with read_many_datagrams, so a burst is drained under one lock hold instead of a wake per packet, and hand the lazy-dial backlog to send_many_datagrams in per-route runs. The batch APIs come from noq via the rayfish forks (n0-computer/noq#735, n0-computer/iroh#4383), so ray patches noq alongside iroh and netwatch. The drop-newest policy is kept by tracking the bytes already staged in a run against the connection's send buffer space.
|
Hey, this batch API is now released in noq. I think this can be updated and the PR opened? It looks very straight forward, so probably not much holding up this PR once it's open. |
| # a noq release carries them. | ||
| noq = { git = "https://github.com/rayfish/noq", branch = "perf/datagram-batching" } | ||
| noq-proto = { git = "https://github.com/rayfish/noq", branch = "perf/datagram-batching" } | ||
| noq-udp = { git = "https://github.com/rayfish/noq", branch = "perf/datagram-batching" } |
There was a problem hiding this comment.
The whole patch section should be able to be removed now
|
Could you update the description to the current state? That becomes the commit message once we merge. Also if you could change "breaking changes" into "api changes" and list the new APIs that would be great |
Description
Expose the new noq batch datagram APIs through iroh's
Connectionwrapper so downstream crates (e.g. rayfish) can amortize the per-datagram connection-mutex cost, which is the dominant overhead at high pps for a mesh VPN forwarding bursts of TUN packets.Connection::send_datagrams/read_datagramsdelegate tonoq::Connection.ReadDatagramsandSendManythroughendpoint::quicand the public endpoint surface (required by the crate'sunreachable_publint).Depends on the noq PR that adds
Connection::send_datagrams/read_datagramsandDatagramState::recv_many/Datagrams::send_many. This branch should not merge until that noq release is published and the[patch.crates-io]override (see below) is removed.Breaking Changes
None. All additions are additive methods and types. Existing
send_datagram/read_datagram/send_datagram_waitare unchanged.Notes & open questions
[patch.crates-io]override in the workspaceCargo.tomlpointingnoq/noq-proto/noq-udpat a local fork (../noq) so iroh can see the new APIs during development. This MUST be removed before merge, which requires the noq batch-API PR to be merged and a new noq release published to crates.io first. Leaving the patch in would break CI for anyone without the local../noqcheckout.iroh/Cargo.tomlis not yet bumped; a follow-up commit will bumpnoq(andnoq-proto/noq-udp) to the released version that contains the batch APIs, and remove the patch, in the same change.Change checklist