-
Notifications
You must be signed in to change notification settings - Fork 656
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Expose UDP_MAX_SEGMENTS via System #2891
Conversation
c9803ba
to
9804b0e
Compare
Sources/NIOCore/Utilities.swift
Outdated
|
||
extension System { | ||
/// Returns the UDP maximum segment count if the platform supports and defines it. | ||
public static func udpMaxSegments() -> Int? { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should really be a static let
that's computed on first access
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure that's true: the cost of this function is pretty close to the cost of the dispatch_once
, so we might prefer a static var
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've changed this to a static var
.
Sources/NIOCore/Utilities.swift
Outdated
@@ -258,3 +258,18 @@ extension System { | |||
public static let supportsUDPReceiveOffload: Bool = false | |||
#endif | |||
} | |||
|
|||
extension System { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wy is this in a new extension?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just for separation of groups of related code - but I'm happy to lump it together if you'd rather.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've consolidated them now that I'm only adding one thing.
Motivation: Linux kernels recently increased the value of `UDP_MAX_SEGMENTS` from 64 to 128 causing hardcoded assumptions in our tests to become invalid. Modifications: Surface the value of `UDP_MAX_SEGMENTS` if it is defined on the platform in use via new public API `System.udpMaxSegments()` (otherwise return `nil`) and make use of it in `DatagramChannelTests`. `System.udpMaxSegments()` is added as new public API in analogue to e.g. `System.supportsUDPReceiveOffload`. Result: `DatagramChannelTests` pass and new API.
9804b0e
to
500c7e1
Compare
Sources/NIOCore/Utilities.swift
Outdated
|
||
extension System { | ||
/// Returns the UDP maximum segment count if the platform supports and defines it. | ||
public static func udpMaxSegments() -> Int? { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure that's true: the cost of this function is pretty close to the cost of the dispatch_once
, so we might prefer a static var
.
Sources/CNIOLinux/shim.c
Outdated
#ifdef UDP_MAX_SEGMENTS | ||
const unsigned long CNIOLinux_UDP_MAX_SEGMENTS = UDP_MAX_SEGMENTS; | ||
#endif | ||
const unsigned long CNIOLinux_UDP_MAX_SEGMENTS = 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than have max_segments_defined
, we should probably just return a sentinel value. -1
is good.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I normally try to avoid sentinel values as a rule but given we know that this value should comfortably fit within an Int64
I can live with it here, particularly if it might help the optimizer see through this logic.
Sources/NIOCore/Utilities.swift
Outdated
/// Returns the UDP maximum segment count if the platform supports and defines it. | ||
public static var udpMaxSegments: Int? { | ||
#if os(Linux) | ||
if CNIOLinux_UDP_MAX_SEGMENTS != -1 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mild nit: I suspect the optimizer will end up calling this function twice, as it doesn't know what it does. I recommend that you save the value to a temporary and branch from there.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I've addressed this but your comment isn't 100% clear to me.
2cf2def
to
f1fc284
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice one, LGTM.
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [apple/swift-nio](https://redirect.github.com/apple/swift-nio) | minor | `2.72.0` -> `2.73.0` | --- ### Release Notes <details> <summary>apple/swift-nio (apple/swift-nio)</summary> ### [`v2.73.0`](https://redirect.github.com/apple/swift-nio/releases/tag/2.73.0) [Compare Source](https://redirect.github.com/apple/swift-nio/compare/2.72.0...2.73.0) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### SemVer Minor - Make `ByteBuffer`'s description more useful by [@​supersonicbyte](https://redirect.github.com/supersonicbyte) in [https://github.com/apple/swift-nio/pull/2864](https://redirect.github.com/apple/swift-nio/pull/2864) - Expose `UDP_MAX_SEGMENTS` via System by [@​rnro](https://redirect.github.com/rnro) in [https://github.com/apple/swift-nio/pull/2891](https://redirect.github.com/apple/swift-nio/pull/2891) - Add new `ChannelOption` to get the amount of buffered outbound data in the Channel by [@​johnnzhou](https://redirect.github.com/johnnzhou) in [https://github.com/apple/swift-nio/pull/2849](https://redirect.github.com/apple/swift-nio/pull/2849) - Add an `AcceptBackoffHandler` to the async server bootstraps by [@​FranzBusch](https://redirect.github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2782](https://redirect.github.com/apple/swift-nio/pull/2782) ##### SemVer Patch - Adding a nicer description for `WebSocketFrame` by [@​supersonicbyte](https://redirect.github.com/supersonicbyte) in [https://github.com/apple/swift-nio/pull/2862](https://redirect.github.com/apple/swift-nio/pull/2862) - Improving `description` and adding `debugDescription` to `NIOAny` by [@​supersonicbyte](https://redirect.github.com/supersonicbyte) in [https://github.com/apple/swift-nio/pull/2866](https://redirect.github.com/apple/swift-nio/pull/2866) - Make FileChunk sendable by [@​ali-ahsan-ali](https://redirect.github.com/ali-ahsan-ali) in [https://github.com/apple/swift-nio/pull/2871](https://redirect.github.com/apple/swift-nio/pull/2871) - Make `ByteBuffer.debugDescription` suitable for structural display by [@​dnadoba](https://redirect.github.com/dnadoba) in [https://github.com/apple/swift-nio/pull/2495](https://redirect.github.com/apple/swift-nio/pull/2495) - Add support for WASILibc by [@​MaxDesiatov](https://redirect.github.com/MaxDesiatov) in [https://github.com/apple/swift-nio/pull/2671](https://redirect.github.com/apple/swift-nio/pull/2671) - `NIOSingleStepByteToMessageDecoder` reentrancy safety by [@​rnro](https://redirect.github.com/rnro) in [https://github.com/apple/swift-nio/pull/2881](https://redirect.github.com/apple/swift-nio/pull/2881) - Adopt `NIOThrowingAsyncSequenceProducer` by [@​rnro](https://redirect.github.com/rnro) in [https://github.com/apple/swift-nio/pull/2879](https://redirect.github.com/apple/swift-nio/pull/2879) - Clamp buffer to maximum upon large write operation by [@​ali-ahsan-ali](https://redirect.github.com/ali-ahsan-ali) in [https://github.com/apple/swift-nio/pull/2745](https://redirect.github.com/apple/swift-nio/pull/2745) - Revert "Adopt `NIOThrowingAsyncSequenceProducer` ([#​2879](https://redirect.github.com/apple/swift-nio/issues/2879))" by [@​rnro](https://redirect.github.com/rnro) in [https://github.com/apple/swift-nio/pull/2892](https://redirect.github.com/apple/swift-nio/pull/2892) - Add concrete description for `EmbeddedEventLoop` by [@​aryan-25](https://redirect.github.com/aryan-25) in [https://github.com/apple/swift-nio/pull/2890](https://redirect.github.com/apple/swift-nio/pull/2890) - Conditionally include linux/udp.h by [@​rnro](https://redirect.github.com/rnro) in [https://github.com/apple/swift-nio/pull/2894](https://redirect.github.com/apple/swift-nio/pull/2894) - Work around a type checking error when using the Static Linux SDK by [@​euanh](https://redirect.github.com/euanh) in [https://github.com/apple/swift-nio/pull/2898](https://redirect.github.com/apple/swift-nio/pull/2898) ##### Other Changes - \[CI] Run tests on push to main by [@​FranzBusch](https://redirect.github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2868](https://redirect.github.com/apple/swift-nio/pull/2868) - \[CI] License header support `.in` and `.cmake` files by [@​FranzBusch](https://redirect.github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2870](https://redirect.github.com/apple/swift-nio/pull/2870) - Include nanoseconds in assertion of timestamp for NIOFileSystem tests by [@​gjcairo](https://redirect.github.com/gjcairo) in [https://github.com/apple/swift-nio/pull/2869](https://redirect.github.com/apple/swift-nio/pull/2869) - Correct the link of sswg-security at SECURITY.md by [@​lamtrinhdev](https://redirect.github.com/lamtrinhdev) in [https://github.com/apple/swift-nio/pull/2872](https://redirect.github.com/apple/swift-nio/pull/2872) - Speculative fix for flakey AsyncTestingEventLoop test by [@​simonjbeaumont](https://redirect.github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2873](https://redirect.github.com/apple/swift-nio/pull/2873) - ci: Install shellcheck if not present in CI runner by [@​simonjbeaumont](https://redirect.github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2882](https://redirect.github.com/apple/swift-nio/pull/2882) - ci: Use ${GITHUB_BASE_REF} as treeish for checking API break by [@​simonjbeaumont](https://redirect.github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2883](https://redirect.github.com/apple/swift-nio/pull/2883) - ci: Refer to nested reusable workflows using remote variant by [@​simonjbeaumont](https://redirect.github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2884](https://redirect.github.com/apple/swift-nio/pull/2884) - \[CI] Fix pull request label workflow by [@​FranzBusch](https://redirect.github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2885](https://redirect.github.com/apple/swift-nio/pull/2885) #### New Contributors - [@​ali-ahsan-ali](https://redirect.github.com/ali-ahsan-ali) made their first contribution in [https://github.com/apple/swift-nio/pull/2871](https://redirect.github.com/apple/swift-nio/pull/2871) - [@​aryan-25](https://redirect.github.com/aryan-25) made their first contribution in [https://github.com/apple/swift-nio/pull/2890](https://redirect.github.com/apple/swift-nio/pull/2890) - [@​johnnzhou](https://redirect.github.com/johnnzhou) made their first contribution in [https://github.com/apple/swift-nio/pull/2849](https://redirect.github.com/apple/swift-nio/pull/2849) - [@​euanh](https://redirect.github.com/euanh) made their first contribution in [https://github.com/apple/swift-nio/pull/2898](https://redirect.github.com/apple/swift-nio/pull/2898) **Full Changelog**: apple/swift-nio@2.72.0...2.73.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://redirect.github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC45NC4xIiwidXBkYXRlZEluVmVyIjoiMzguOTQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: cgrindel-self-hosted-renovate[bot] <139595543+cgrindel-self-hosted-renovate[bot]@users.noreply.github.com>
Motivation:
Linux kernels recently increased the value of
UDP_MAX_SEGMENTS
from 64 to 128 causing hardcoded assumptions in our tests to become invalid.Modifications:
Surface the value of
UDP_MAX_SEGMENTS
if it is defined on the platform in use via new public APISystem.udpMaxSegments()
(otherwise returnnil
) and make use of it inDatagramChannelTests
.System.udpMaxSegments()
is added as new public API in analogue to e.g.System.supportsUDPReceiveOffload
.Result:
DatagramChannelTests
pass and new API.