-
Notifications
You must be signed in to change notification settings - Fork 218
Description
Bug Report
Version
0.3.4
Platform
Linux 5.18.10-76051810-generic, but probably not relevant
Crates
tower-http, async-compression
Description
We noticed in apollographql/router#1572 that the CompressionLayer waits until the entire response body is compressed to send it to the client. This is due to the Encoder behaviour in async-compression: Nullus157/async-compression#154.
How we saw that result:
- the router produces a multipart response, where we want the client to receive parts as soon as they are produced. The parts are produced as a
StreamofBytesthat is wrapped in an axumStreamBody - In one test the first part was produced immediately, and the next one after a few seconds
- If the response is not compressed, we see them come as soon as possible
- If the response is compressed (changing the compression algorithm does not change anything), then we receive nothing, and after a few seconds we receive both parts at the same time
The issue comes from this part:
When the underlying stream returns Poll::Pending, ready! will return it directly, so no data will be produced. I patched this in our router to produce data whenever we see a Pending, but that's not a proper solution.
Instead, the CompressionLayer should be able to direct the Encoder to produce data depending on conditions like how much data could be produced, or how long since the last chunk was sent