mirror of
https://github.com/tower-rs/tower.git
synced 2026-03-02 11:50:05 +00:00
In the past, any errors thrown by a `Service` wrapped in a `tower_buffer::Buffer` were silently swallowed, and the handles were simply informed that the connection to the `Service` was closed. This patch captures errors from a wrapped `Service`, and communicates that error to all pending and future requests. It does so by wrapping up the error in an `Arc`, which is sent to all pending `oneshot` request channels, and is stored in a shared location so that future requests will see the error when their send to the `Worker` fail. Note that this patch also removes the `open` field from `State`, as it is no longer necessary following #120, since bounded channels have a `try_ready` method we can rely on instead. Note that this change is not entirely backwards compatible -- the error type for a `Service` that is wrapped in `Buffer` must now be `Send + Sync` so that it can safely be communicated back to callers. Furthermore, `tower_buffer::Error::Closed` now contains the error that the failed `Service` produced, which may trip up old code.