avoid consuming receive buffers when blocked by queue #211
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
By disabling auto-read and triggering reads when a channel becomes active or when the previous read on a channel has completed, we avoid pulling bytes out of our TCP receive buffer prematurely, which allows the normal mechanisms of TCP back-pressure to work as expected.
When auto-read enabled, an input experiencing back-pressure from the pipeline's queue would effectively avoid propagating that back-pressure by continuing to transfer bytes from the receive buffer into effectively unlimited direct memory buffers until it reached netty's memory allocation limit (killing the connections and losing all protocol-acked-but-unprocessed bytes) or an OOM was reached by allocating more memory than was available (crashing the whole process)
It is likely that disabling auto-read will have some negative effect on throughput with the default-size receive buffers, and that we will also need to tune these or provide a way to make them user-tunable.
Thanks for contributing to Logstash! If you haven't already signed our CLA, here's a handy link: https://www.elastic.co/contributor-agreement/