-
Notifications
You must be signed in to change notification settings - Fork 656
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # 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://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://github.com/apple/swift-nio/releases/tag/2.73.0) [Compare Source](https://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://github.com/supersonicbyte) in [https://github.com/apple/swift-nio/pull/2864](https://github.com/apple/swift-nio/pull/2864) - Expose `UDP_MAX_SEGMENTS` via System by [@​rnro](https://github.com/rnro) in [https://github.com/apple/swift-nio/pull/2891](https://github.com/apple/swift-nio/pull/2891) - Add new `ChannelOption` to get the amount of buffered outbound data in the Channel by [@​johnnzhou](https://github.com/johnnzhou) in [https://github.com/apple/swift-nio/pull/2849](https://github.com/apple/swift-nio/pull/2849) - Add an `AcceptBackoffHandler` to the async server bootstraps by [@​FranzBusch](https://github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2782](https://github.com/apple/swift-nio/pull/2782) ##### SemVer Patch - Adding a nicer description for `WebSocketFrame` by [@​supersonicbyte](https://github.com/supersonicbyte) in [https://github.com/apple/swift-nio/pull/2862](https://github.com/apple/swift-nio/pull/2862) - Improving `description` and adding `debugDescription` to `NIOAny` by [@​supersonicbyte](https://github.com/supersonicbyte) in [https://github.com/apple/swift-nio/pull/2866](https://github.com/apple/swift-nio/pull/2866) - Make FileChunk sendable by [@​ali-ahsan-ali](https://github.com/ali-ahsan-ali) in [https://github.com/apple/swift-nio/pull/2871](https://github.com/apple/swift-nio/pull/2871) - Make `ByteBuffer.debugDescription` suitable for structural display by [@​dnadoba](https://github.com/dnadoba) in [https://github.com/apple/swift-nio/pull/2495](https://github.com/apple/swift-nio/pull/2495) - Add support for WASILibc by [@​MaxDesiatov](https://github.com/MaxDesiatov) in [https://github.com/apple/swift-nio/pull/2671](https://github.com/apple/swift-nio/pull/2671) - `NIOSingleStepByteToMessageDecoder` reentrancy safety by [@​rnro](https://github.com/rnro) in [https://github.com/apple/swift-nio/pull/2881](https://github.com/apple/swift-nio/pull/2881) - Adopt `NIOThrowingAsyncSequenceProducer` by [@​rnro](https://github.com/rnro) in [https://github.com/apple/swift-nio/pull/2879](https://github.com/apple/swift-nio/pull/2879) - Clamp buffer to maximum upon large write operation by [@​ali-ahsan-ali](https://github.com/ali-ahsan-ali) in [https://github.com/apple/swift-nio/pull/2745](https://github.com/apple/swift-nio/pull/2745) - Revert "Adopt `NIOThrowingAsyncSequenceProducer` ([#​2879](https://github.com/apple/swift-nio/issues/2879))" by [@​rnro](https://github.com/rnro) in [https://github.com/apple/swift-nio/pull/2892](https://github.com/apple/swift-nio/pull/2892) - Add concrete description for `EmbeddedEventLoop` by [@​aryan-25](https://github.com/aryan-25) in [https://github.com/apple/swift-nio/pull/2890](https://github.com/apple/swift-nio/pull/2890) - Conditionally include linux/udp.h by [@​rnro](https://github.com/rnro) in [https://github.com/apple/swift-nio/pull/2894](https://github.com/apple/swift-nio/pull/2894) - Work around a type checking error when using the Static Linux SDK by [@​euanh](https://github.com/euanh) in [https://github.com/apple/swift-nio/pull/2898](https://github.com/apple/swift-nio/pull/2898) ##### Other Changes - \[CI] Run tests on push to main by [@​FranzBusch](https://github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2868](https://github.com/apple/swift-nio/pull/2868) - \[CI] License header support `.in` and `.cmake` files by [@​FranzBusch](https://github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2870](https://github.com/apple/swift-nio/pull/2870) - Include nanoseconds in assertion of timestamp for NIOFileSystem tests by [@​gjcairo](https://github.com/gjcairo) in [https://github.com/apple/swift-nio/pull/2869](https://github.com/apple/swift-nio/pull/2869) - Correct the link of sswg-security at SECURITY.md by [@​lamtrinhdev](https://github.com/lamtrinhdev) in [https://github.com/apple/swift-nio/pull/2872](https://github.com/apple/swift-nio/pull/2872) - Speculative fix for flakey AsyncTestingEventLoop test by [@​simonjbeaumont](https://github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2873](https://github.com/apple/swift-nio/pull/2873) - ci: Install shellcheck if not present in CI runner by [@​simonjbeaumont](https://github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2882](https://github.com/apple/swift-nio/pull/2882) - ci: Use ${GITHUB_BASE_REF} as treeish for checking API break by [@​simonjbeaumont](https://github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2883](https://github.com/apple/swift-nio/pull/2883) - ci: Refer to nested reusable workflows using remote variant by [@​simonjbeaumont](https://github.com/simonjbeaumont) in [https://github.com/apple/swift-nio/pull/2884](https://github.com/apple/swift-nio/pull/2884) - \[CI] Fix pull request label workflow by [@​FranzBusch](https://github.com/FranzBusch) in [https://github.com/apple/swift-nio/pull/2885](https://github.com/apple/swift-nio/pull/2885) #### New Contributors - [@​ali-ahsan-ali](https://github.com/ali-ahsan-ali) made their first contribution in [https://github.com/apple/swift-nio/pull/2871](https://github.com/apple/swift-nio/pull/2871) - [@​aryan-25](https://github.com/aryan-25) made their first contribution in [https://github.com/apple/swift-nio/pull/2890](https://github.com/apple/swift-nio/pull/2890) - [@​johnnzhou](https://github.com/johnnzhou) made their first contribution in [https://github.com/apple/swift-nio/pull/2849](https://github.com/apple/swift-nio/pull/2849) - [@​euanh](https://github.com/euanh) made their first contribution in [https://github.com/apple/swift-nio/pull/2898](https://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://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://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.