-
Notifications
You must be signed in to change notification settings - Fork 6.1k
8371475: HttpClient: Implement CUBIC congestion controller #28195
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
base: pr/28156
Are you sure you want to change the base?
Conversation
|
👋 Welcome back djelinski! A progress list of the required criteria for merging this PR into |
|
❗ This change is not yet ready to be integrated. |
|
@djelinski The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
|
If jdk.httpclient.quic.congestionController is exposed then we'll need to track this with a CSR. |
vy
left a 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.
Really neat work @djelinski! I liked the surgery you carried out in QuicBaseCC. 💯
I've dropped some minor remarks. I guess we will need some time to wrap our mind around the math involved in the PR.
|
|
||
| private final QuicPacer pacer; | ||
|
|
||
| class QuicRenoCongestionController extends QuicBaseCongestionController { |
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 guess thins can be final and consequently protected modifier can be removed from the implemented methods.
| boolean isAppLimited; | ||
| isAppLimited = congestionWindow > maxBytesInFlight + 2L * maxDatagramSize; |
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.
| boolean isAppLimited; | |
| isAppLimited = congestionWindow > maxBytesInFlight + 2L * maxDatagramSize; | |
| boolean isAppLimited = congestionWindow > maxBytesInFlight + 2L * maxDatagramSize; |
@djelinski, I see you verbatim copied these lines – which is fine, and makes things easier to review. Nevertheless, I want to double-check: do we need to guard against any arithmetic overflows here?
| * @spec https://www.rfc-editor.org/rfc/rfc9438.html | ||
| * RFC 9438: CUBIC for Fast and Long-Distance Networks | ||
| */ | ||
| public class QuicCubicCongestionController extends QuicBaseCongestionController { |
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 guess this can be final.
| super(dbgTag, rttEstimator); | ||
| this.rttEstimator = rttEstimator; |
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.
Can we make rttEstimator a protected field of QuicBaseCongestionController?
| // this is less aggressive than RFC 9438, which uses target=Wcubic(t+RTT), | ||
| // but seems to work well enough |
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.
Shall we also document why we deviate from the RFC?
| boolean isAppLimited; | ||
| isAppLimited = sentTime.isAfter(lastFullWindow); |
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.
| boolean isAppLimited; | |
| isAppLimited = sentTime.isAfter(lastFullWindow); | |
| boolean isAppLimited = sentTime.isAfter(lastFullWindow); |
|
|
||
| /* | ||
| * @test | ||
| * @run testng/othervm -Djdk.httpclient.HttpClient.log=trace,quic:cc CubicTest |
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.
Shall we use JUnit instead?
|
|
||
| private static QuicCongestionController createCongestionController | ||
| (String dbgTag, QuicRttEstimator rttEstimator) { | ||
| String algo = System.getProperty("jdk.httpclient.quic.congestionController", "cubic"); |
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.
Can we keep this internal? That is, can we use jdk.internal.httpclient.quic.congestionController instead?
This PR adds a new congestion controller algorithm. It reuses a large part of the QuicRenoCongestionController, which was refactored to two classes - QuicBaseCongestionController, containing the shared code, and QuicRenoCongestionController, containing only the code that is unique to Reno.
CUBIC is now the default congestion controller. Reno can still be selected by setting the system property
jdk.httpclient.quic.congestionControllertoreno.A new test was added to exercise the new congestion controller. Existing tests continue to pass.
Progress
Integration blocker
Issue
Reviewing
Using
gitCheckout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/28195/head:pull/28195$ git checkout pull/28195Update a local copy of the PR:
$ git checkout pull/28195$ git pull https://git.openjdk.org/jdk.git pull/28195/headUsing Skara CLI tools
Checkout this PR locally:
$ git pr checkout 28195View PR using the GUI difftool:
$ git pr show -t 28195Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/28195.diff
Using Webrev
Link to Webrev Comment