-
Notifications
You must be signed in to change notification settings - Fork 10.3k
Remove QuicTransportOptions.IdleTimeout #35202
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
Conversation
Need to update aspnetcore/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportManager.cs Lines 68 to 72 in fd65bd8
listenOptions.KestrelServerOptions.Limits.KeepAliveTimeout ). @JamesNK @Tratcher I'm assuming the feature class should be internal? If so, where do we think it should live, given that we're using it in Kestrel.Core & Transport.Quic. Kestrel.Core + IVT?
|
The feature should be considered public API in the Quic Transport library, it's just a different way of passing options. |
var features = new FeatureCollection(); | ||
features.Set(sslServerAuthenticationOptions); | ||
features.Set(kestrelServerLimitsFeature); |
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.
Where does this get set in real life outside of tests? Does this need to be set in TransportManager or something?
Add an interop test (these are in Http3RequestTests.cs in Interop.FunctionalTests project) that creates a server with a very low timeout, e.g. 1 second, sends a request, and the request should fail when the timeout occurs. |
src/Servers/Kestrel/Transport.Quic/src/Internal/KestrelServerLimitsFeature.cs
Outdated
Show resolved
Hide resolved
quicListenerOptions.MaxBidirectionalStreams = options.MaxBidirectionalStreamCount; | ||
quicListenerOptions.MaxUnidirectionalStreams = options.MaxUnidirectionalStreamCount; | ||
// Set Quic idle timeout to a conservative 10 minutes - we handle idle itemouts gracefully in the Kestrel layer | ||
// based off of KestrelServerLimits.KeepAliveTimeout | ||
quicListenerOptions.IdleTimeout = TimeSpan.FromMinutes(10); |
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.
KeepAliveTimeout isn't implemented in Kestrel layer for HTTP/3. We're using the QUIC idle timeout.
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.
Is there a reason not to hard-code this to Kestrel's default 130 second KeepAliveTimeout?
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.
It's not configurable so we might want to be more generous?
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.
Given the pushback I got increasing this default by 10 seconds, I'm surprised we'd want to increase it nearly five-fold for Quic while making it non-configurable. Why is making it more generous better than making it more conservative? I'd just keep the default.
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.
Why aren't we making it configurable? I thought the idea here was to make IdleTimeout = KestrelServerLimits.KeepAliveTimeout
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.
Stephen's argument earlier was:
If we want to continue exposing QuicTransportOptions.IdleTimeout fine, but I don't think we have to because it is redundant with the KeepAliveTimeout and the shorter one would win.
Which I buy. Having the extra API surface in the form of the Feature doesn't seem fully necessary. As for default vs. 10 min, am I misunderstanding that the shorter one would win today? If that's the case it doesn't seem like it would matter, so maybe it's cleaner to have them use the same 130 second default.
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 the better layering is to have Kestrel.Core track the idleness of the connection and close the connection manually after the KeepAliveTimeout like we do for non-multiplexed transports rather than require the transport fish out a feature passed to BindAsync and implement a KeepAliveTimeout/IdleTimeout itself. We figured doing this might be a bit too much work for .NET 6, but adding a new public API just to remove it in the next release also feels bad, so we ended up here. See #35202 (comment).
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.
Spicy: Make QuicTransportOptions.IdleTimeout internal. Kestrel sets it to KeepAliveTimeout.
We're all in the shared framework.
Closing in favor of #35307 |
Fixes #34955