Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Previously, the bounded mpsc channels wouldn't provide backpressure in many cases because they provided a guaranteed slot for every sender. This change refactors mpsc channels to never allow more than buffer + 1 messages in-flight at a time. Senders will attempt to increment the number of in-flight messages in poll-ready. If successful, the count is incremented and a message is sent. If the buffer was full, the sender adds itself to a queue to be awoken. When a message is received, the receiver attempts to awaken a Sender and grant it "sending rights". If no such channel was found, it decreases the number of in-flight messages currently present in the buffer. There's one odd choice in this change, which was to pick buffer + 1 rather than buffer as the max number of elements. In practice, many of the tests and a handful of real-world code relied on the ability to have an initial element available for the first sender, and were attempting to send into channels with a buffer size of zero. These use-cases were all broken by this change without the change to use buffer + 1. Despite the buffer + 1 mitigation, this is still a breaking change since it modifies the maximum number of elements allowed into a channel. 0.2 has been out for a short enough time that it's probably possible to transition without breaking existing code, but this approach should be taken with caution. Luckily, 0.2 organized futures-channel into a separate crate, so it could be released as an 0.3 version of futures-channel, futures-sink, futures-util, and the futures facade while still maintaining futures-io and futures-core compatibility.
- Loading branch information