Skip to content
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

Add an idle write timeout #718

Merged
merged 3 commits into from
Dec 18, 2023
Merged

Add an idle write timeout #718

merged 3 commits into from
Dec 18, 2023

Conversation

gjcairo
Copy link
Collaborator

@gjcairo gjcairo commented Dec 14, 2023

Motivation

We currently provide an idle read timeout to fail requests that take more than a given amount of time to produce any response data. We were missing its counterpart: to provide a timeout for when no request data is being written either.
This could happen, for example, when uploading large files: if for whatever reason (e.g. back pressure from the server, etc) the client does not write any bytes, and there is no data being sent from the server either, the connection could be idle and unused, but remain open for longer than necessary. With an idle write timeout, we can avoid this.

Modifications

Added a new idle write timeout.

Result

Users can now configure an idle write timeout in addition to an idle read timeout.

@gjcairo gjcairo marked this pull request as ready for review December 14, 2023 15:24
@gjcairo gjcairo requested a review from dnadoba December 15, 2023 12:02
assert(self.idleWriteTimeoutTimer == nil, "Expected there is no timeout timer so far.")

self.idleWriteTimeoutTimer = self.eventLoop.scheduleTask(in: timeAmount) {
guard self.idleWriteTimeoutTimer != nil else { return }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In HTTP1 we use a timer "ID" but here we are just setting the timer to nil. Is there a reason for these two different approaches?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this is an inconsistency and should be changed because race conditions can happen with this current approach. It was actually fixed for HTTP1 in #455, but not in HTTP2. I just decided to keep things as they currently are in this PR (without using the timer ID) to avoid mixing multiple changes in a single PR, but I'll send a follow-up that adds a timer and changes these checks.

@gjcairo gjcairo added the semver/minor For PRs that when merged cause a bump of the minor version, ie. 1.x.0 -> 1.(x+1).0 label Dec 18, 2023
@gjcairo gjcairo merged commit d2d3566 into swift-server:main Dec 18, 2023
7 of 8 checks passed
@gjcairo gjcairo deleted the write-timeout branch December 18, 2023 12:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
semver/minor For PRs that when merged cause a bump of the minor version, ie. 1.x.0 -> 1.(x+1).0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants