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

perf: optimize header list size calculations #750

Merged
merged 1 commit into from
Feb 22, 2024

Conversation

Noah-Kennedy
Copy link
Contributor

This speeds up loading blocks in cases where we have many headers already.

@Noah-Kennedy Noah-Kennedy force-pushed the noah/speed-up-decoding branch from be897a2 to d5b89a2 Compare February 21, 2024 23:14
@Noah-Kennedy
Copy link
Contributor Author

Accidentally targeted it at 0.3, though I think this is enough of a perf improvement to justify a backport.

We can just forwardport this to 0.4 after I guess?

@Noah-Kennedy Noah-Kennedy force-pushed the noah/speed-up-decoding branch 2 times, most recently from dff5782 to eb64392 Compare February 21, 2024 23:21
This speeds up loading blocks in cases where we have many headers already.
@Noah-Kennedy Noah-Kennedy force-pushed the noah/speed-up-decoding branch from eb64392 to 0e7ca68 Compare February 21, 2024 23:26
@Noah-Kennedy Noah-Kennedy changed the title headers: optimize header list size calculations per: optimize header list size calculations Feb 21, 2024
@Noah-Kennedy Noah-Kennedy changed the title per: optimize header list size calculations perf: optimize header list size calculations Feb 21, 2024
@@ -892,6 +901,8 @@ impl HeaderBlock {

headers_size += decoded_header_size(name.as_str().len(), value.len());
if headers_size < max_header_list_size {
self.field_size +=
decoded_header_size(name.as_str().len(), value.len());

Choose a reason for hiding this comment

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

Should we check that decoded_header_size won't exceed max_header_list_sized?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

that is covered under other checks elsewhere

Choose a reason for hiding this comment

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

Nvm, that's exactly what this does

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah I don't know why I said that lol, it's literally checked right here.

@seanmonstar seanmonstar merged commit 94e80b1 into hyperium:0.3.x Feb 22, 2024
6 checks passed
@Noah-Kennedy Noah-Kennedy deleted the noah/speed-up-decoding branch February 22, 2024 01:56
seanmonstar pushed a commit that referenced this pull request Feb 22, 2024
This speeds up loading blocks in cases where we have many headers already.
seanmonstar pushed a commit that referenced this pull request Feb 22, 2024
This speeds up loading blocks in cases where we have many headers already.
cxw620 pushed a commit to cxw620/h2 that referenced this pull request Jan 20, 2025
* Add a setter for header_table_size

* Include a test for setting header_table_size

* Fix formatting

* Switch pseudo header order to mimic chrome

* support chrome/okhttp impersonate

* deps(http): bump version to v0.2.11

* feat(header): support safari header pseudo order

* Send frames based on custom configuration

* Revert "deps(http): bump version to v0.2.11"

* deps(http): bump version to v0.2.11

* bump version to v0.4.2

* fix: streams awaiting capacity lockout (hyperium#730) (hyperium#734)

This PR changes the the assign-capacity queue to prioritize streams that
are send-ready.

This is necessary to prevent a lockout when streams aren't able to proceed while
waiting for connection capacity, but there is none.

Closes hyperium/hyper#3338

Co-authored-by: dswij <[email protected]>

* streams: limit error resets for misbehaving connections

This change causes GOAWAYs to be issued to misbehaving connections which for one reason or another cause us to emit lots of error resets.

Error resets are not generally expected from valid implementations anyways.

The threshold after which we issue GOAWAYs is tunable, and will default to 1024.

* Prepare v0.3.24

* perf: optimize header list size calculations (hyperium#750)

This speeds up loading blocks in cases where we have many headers already.

* deps(http): v0.2

* Fix header order

* Optimize pseudo-header sort

* Setting static headers

* feat(frame): Passing values ​​to solve pseudo order

* Add headers priority

* Fix default flag

* Project rename to `h2-patch`
---------

Co-authored-by: 4JX <[email protected]>
Co-authored-by: Sean McArthur <[email protected]>
Co-authored-by: dswij <[email protected]>
Co-authored-by: Noah Kennedy <[email protected]>
cxw620 pushed a commit to cxw620/h2 that referenced this pull request Jan 20, 2025
* Add a setter for header_table_size

* Include a test for setting header_table_size

* Fix formatting

* Switch pseudo header order to mimic chrome

* support chrome/okhttp impersonate

* deps(http): bump version to v0.2.11

* feat(header): support safari header pseudo order

* Send frames based on custom configuration

* Revert "deps(http): bump version to v0.2.11"

This reverts commit 7882ee95b58275200863ce15ece74983ec9c76f3.

* deps(http): bump version to v0.2.11

* bump version to v0.4.2

* fix: streams awaiting capacity lockout (hyperium#730) (hyperium#734)

This PR changes the the assign-capacity queue to prioritize streams that
are send-ready.

This is necessary to prevent a lockout when streams aren't able to proceed while
waiting for connection capacity, but there is none.

Closes hyperium/hyper#3338

Co-authored-by: dswij <[email protected]>

* v0.3.23

* streams: limit error resets for misbehaving connections

This change causes GOAWAYs to be issued to misbehaving connections which for one reason or another cause us to emit lots of error resets.

Error resets are not generally expected from valid implementations anyways.

The threshold after which we issue GOAWAYs is tunable, and will default to 1024.

* Prepare v0.3.24

* perf: optimize header list size calculations (hyperium#750)

This speeds up loading blocks in cases where we have many headers already.

* bump version to v 0.4.3

* deps(http): v0.2

* Fix header order

* Optimize pseudo-header sort

* Setting static headers

* feat(frame): Passing values ​​to solve pseudo order

* Add headers priority

* Fix default flag

* Project rename to `h2-patch`

---------

Co-authored-by: 4JX <[email protected]>
Co-authored-by: Sean McArthur <[email protected]>
Co-authored-by: dswij <[email protected]>
Co-authored-by: Noah Kennedy <[email protected]>
cxw620 pushed a commit to cxw620/h2 that referenced this pull request Jan 20, 2025
* v0.3.26

* Rename project to `rh2`

* Refactor frame sending custom implementation

* Export frame `PseudoOrder` settings

* Reduce unnecessary Option packaging

* v0.3.27

* fix(frame/headers): Fix error when headers priority is empty

* v0.3.29

* feat(frame/headers): Packaging headers pseudo order type (hyperium#8)

* feat(frame/settings): Packaging settings type (hyperium#9)

* Initialize frame settings order in advance

* v0.3.31

* feat(frame): Add unknown_setting frame settings (hyperium#10)

* Add unknown_setting patch

* Customize all Http Settings order

* v0.3.40

* fix(frame): Fix unknown setting encode (hyperium#11)

* v0.3.41

* feat: Replace with static settings (hyperium#12)

* v0.3.50

* feat: Destructive update, fixed-length array records the setting frame order (hyperium#13)

* v0.3.60

* Update README.md

* Sync upstream (hyperium#14)

* fix: streams awaiting capacity lockout (hyperium#730) (hyperium#734)

This PR changes the the assign-capacity queue to prioritize streams that
are send-ready.

This is necessary to prevent a lockout when streams aren't able to proceed while
waiting for connection capacity, but there is none.

Closes hyperium/hyper#3338

Co-authored-by: dswij <[email protected]>

* v0.3.23

* streams: limit error resets for misbehaving connections

This change causes GOAWAYs to be issued to misbehaving connections which for one reason or another cause us to emit lots of error resets.

Error resets are not generally expected from valid implementations anyways.

The threshold after which we issue GOAWAYs is tunable, and will default to 1024.

* Prepare v0.3.24

* perf: optimize header list size calculations (hyperium#750)

This speeds up loading blocks in cases where we have many headers already.

* v0.3.25

* refactor: cleanup new unused warnings (hyperium#757)

* fix: limit number of CONTINUATION frames allowed

Calculate the amount of allowed CONTINUATION frames based on other
settings.

    max_header_list_size / max_frame_size

That is about how many CONTINUATION frames would be needed to send
headers up to the max allowed size. We then multiply by that by a small
amount, to allow for implementations that don't perfectly pack into the
minimum frames *needed*.

In practice, *much* more than that would be a very inefficient peer, or
a peer trying to waste resources.

See https://seanmonstar.com/blog/hyper-http2-continuation-flood/ for
more info.

* v0.3.26

* fix: return a WriteZero error if frames cannot be written (hyperium#783)

Some operating systems will allow you continually call `write()` on a closed socket, and will return `Ok(0)` instead of an error. This patch checks for a zero write, and instead of looping forever trying to write, returns a proper error.

Closes hyperium#781

Co-authored-by: leibeiyi <[email protected]>

* lints: fix unexpected cfgs warnings

* ci: pin deps for MSRV

* ci: pin more deps for MSRV job (hyperium#817)

* fix: notify_recv after send_reset() in reset_on_recv_stream_err() to ensure local stream is released properly (hyperium#816)

Similar to what have been done in fn send_reset<B>(), we should notify RecvStream that is parked after send_reset().

Co-authored-by: Jiahao Liang <[email protected]>

---------

Co-authored-by: Sean McArthur <[email protected]>
Co-authored-by: dswij <[email protected]>
Co-authored-by: Noah Kennedy <[email protected]>
Co-authored-by: beiyi lei <[email protected]>
Co-authored-by: leibeiyi <[email protected]>
Co-authored-by: Jiahao Liang <[email protected]>

* v0.3.61

---------

Co-authored-by: Sean McArthur <[email protected]>
Co-authored-by: dswij <[email protected]>
Co-authored-by: Noah Kennedy <[email protected]>
Co-authored-by: beiyi lei <[email protected]>
Co-authored-by: leibeiyi <[email protected]>
Co-authored-by: Jiahao Liang <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants