Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Avoid unnecessary empty data frames at end of stream #140

Conversation

FinleyMcIlwaine
Copy link
Collaborator

If a stream terminates with an empty data frame, we will send that empty data frame even if it is succeeded by trailers that are marked end of stream. That empty data frame is unnecessary. We should only send it if the payload length is non-zero and we are not sending trailers.

I discovered this after seeing too many empty data errors from terminating a server handling several concurrent streams with an exception.

Currently, if a stream terminates with an empty data frame, we will send that
empty data frame even if it is succeeded by trailers that are marked end of
stream. That empty data frame is unnecessary. We should only send it if the
payload length is non-zero and we are not sending trailers.
@kazu-yamamoto kazu-yamamoto self-requested a review August 6, 2024 23:11
@FinleyMcIlwaine
Copy link
Collaborator Author

I cannot reproduce the current test failure locally after running the test on a loop for a while, on my branch or on main. My guess is that it is a non-deterministic failure that is not associated with these changes.

Copy link
Owner

@kazu-yamamoto kazu-yamamoto left a comment

Choose a reason for hiding this comment

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

Nice catch!

kazu-yamamoto added a commit that referenced this pull request Aug 8, 2024
@kazu-yamamoto
Copy link
Owner

It seems to me that your logic is correct.
So, rebased and merged.
Thanks.

@FinleyMcIlwaine
Copy link
Collaborator Author

@kazu-yamamoto Thanks for that! Also, we have another PR incoming soon, so don't worry about releasing these changes just yet.

@kazu-yamamoto
Copy link
Owner

The previous release was for me.
I needed to deploy the new ServerIO for my project.

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Jan 30, 2025
# ChangeLog for http2

## 5.3.9

* Using `ThreadManager` of `time-manager`.

## 5.3.8

* `forkManagedTimeout` ensures that only one asynchronous exception is
  thrown. Fixing the thread leak via `Weak ThreadId` and `modifyTVar'`.
  [#156](kazu-yamamoto/http2#156)

## 5.3.7

* Using `withHandle` of time-manager.
* Getting `Handle` for each thread.
* Providing allocSimpleConfig' to enable customizing WAI tiemout manager.
* Monitor option (-m) for h2c-client and h2c-server.

## 5.3.6

* Making `runIO` friendly with the new synchronism mechanism.
  [#152](kazu-yamamoto/http2#152)
* Re-throwing asynchronous exceptions to prevent thread leak.
* Simplifying the synchronism mechanism between workers and the sender.
  [#148](kazu-yamamoto/http2#148)

## 5.3.5

* Using `http-semantics` v0.3.
* Deprecating `numberOfWorkers`.
* Removing `unliftio`.
* Avoid `undefined` in client.
  [#146](kazu-yamamoto/http2#146)

## 5.3.4

* Support stream cancellation
  [#142](kazu-yamamoto/http2#142)

## 5.3.3

* Enclosing IPv6 literal authority with square brackets.
  [#143](kazu-yamamoto/http2#143)

## 5.3.2

* Avoid unnecessary empty data frames at end of stream
  [#140](kazu-yamamoto/http2#140)
* Removing unnecessary API from ServerIO

## 5.3.1

* Fix treatment of async exceptions
  [#138](kazu-yamamoto/http2#138)
* Avoid race condition
  [#137](kazu-yamamoto/http2#137)

## 5.3.0

* New server architecture: spawning worker on demand instead of the
  worker pool. This reduce huge numbers of threads for streaming into
  only 2. No API changes but workers do not terminate quicly. Rather
  workers collaborate with the sender after queuing a response and
  finish after all response data are sent.
* All threads are labeled with `labelThread`. You can see them by
  `listThreas` if necessary.

## 5.2.6

* Recover rxflow on closing.
  [#126](kazu-yamamoto/http2#126)
* Fixing ClientSpec for stream errors.
* Allowing negative window. (h2spec http2/6.9.2)
* Update for latest http-semantics
  [#122](kazu-yamamoto/http2#124)

## 5.2.5

* Setting peer initial window size properly.
  [#123](kazu-yamamoto/http2#123)

## 5.2.4

* Update for latest http-semantics
  [#122](kazu-yamamoto/http2#122)
* Measuring performance concurrently for h2c-client

## 5.2.3

* Update for latest http-semantics
  [#120](kazu-yamamoto/http2#120)
* Enable containers 0.7 (ghc 9.10)
  [#117](kazu-yamamoto/http2#117)

## 5.2.2

* Mark final chunk as final
  [#116](kazu-yamamoto/http2#116)
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants