Skip to content

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

Closed
wants to merge 2 commits into from
Closed

Remove QuicTransportOptions.IdleTimeout #35202

wants to merge 2 commits into from

Conversation

wtgodbe
Copy link
Member

@wtgodbe wtgodbe commented Aug 9, 2021

Fixes #34955

@wtgodbe wtgodbe requested review from JamesNK and Tratcher August 9, 2021 21:52
@ghost ghost added the area-runtime label Aug 9, 2021
@wtgodbe
Copy link
Member Author

wtgodbe commented Aug 9, 2021

Need to update

features.Set(sslServerAuthenticationOptions);
}
var transport = await _multiplexedTransportFactory.BindAsync(endPoint, features, cancellationToken).ConfigureAwait(false);
to set the feature (probably 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?

@Tratcher
Copy link
Member

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);
Copy link
Member

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?

@JamesNK
Copy link
Member

JamesNK commented Aug 10, 2021

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.

@wtgodbe
Copy link
Member Author

wtgodbe commented Aug 11, 2021

Ok @halter73 @Tratcher I updated this to remove the Feature & just set the timeout to 10 mins in QuicConnectionListener

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);
Copy link
Member

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.

Copy link
Member

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?

Copy link
Member

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?

Copy link
Member

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.

Copy link
Member

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

Copy link
Member Author

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.

Copy link
Member

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).

Copy link
Member

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.

@wtgodbe
Copy link
Member Author

wtgodbe commented Aug 12, 2021

Closing in favor of #35307

@wtgodbe wtgodbe closed this Aug 12, 2021
@dougbu dougbu deleted the wtgodbe/Timeout branch August 21, 2021 22:32
@amcasey amcasey added area-networking Includes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions and removed area-runtime labels Jun 6, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-networking Includes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions
Projects
None yet
Development

Successfully merging this pull request may close these issues.

QuicTransportOptions.IdleTimeout vs KestrelServerLimits.KeepAliveTimeout
5 participants