182 lines
5.9 KiB
Rust
Raw Normal View History

// Copyright 2018 Parity Technologies (UK) Ltd.
2017-11-22 18:01:28 +01:00
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
mod codec;
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
mod config;
mod io;
2017-11-01 11:59:52 +01:00
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
pub use config::{MplexConfig, MaxBufferBehaviour};
use codec::LocalStreamId;
use std::{cmp, iter, task::Context, task::Poll};
use bytes::Bytes;
use libp2p_core::{
StreamMuxer,
muxing::StreamMuxerEvent,
upgrade::{InboundUpgrade, OutboundUpgrade, UpgradeInfo},
};
use parking_lot::Mutex;
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
use futures::{prelude::*, future, ready};
2017-11-01 11:59:52 +01:00
impl UpgradeInfo for MplexConfig {
type Info = &'static [u8];
type InfoIter = iter::Once<Self::Info>;
fn protocol_info(&self) -> Self::InfoIter {
iter::once(b"/mplex/6.7.0")
}
}
impl<C> InboundUpgrade<C> for MplexConfig
where
C: AsyncRead + AsyncWrite + Unpin,
{
type Output = Multiplex<C>;
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
type Error = io::Error;
type Future = future::Ready<Result<Self::Output, io::Error>>;
fn upgrade_inbound(self, socket: C, _: Self::Info) -> Self::Future {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
future::ready(Ok(Multiplex {
io: Mutex::new(io::Multiplexed::new(socket, self)),
}))
2017-11-01 11:59:52 +01:00
}
}
2017-11-01 11:59:52 +01:00
impl<C> OutboundUpgrade<C> for MplexConfig
where
C: AsyncRead + AsyncWrite + Unpin,
{
type Output = Multiplex<C>;
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
type Error = io::Error;
type Future = future::Ready<Result<Self::Output, io::Error>>;
fn upgrade_outbound(self, socket: C, _: Self::Info) -> Self::Future {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
future::ready(Ok(Multiplex {
io: Mutex::new(io::Multiplexed::new(socket, self))
}))
2017-11-01 11:59:52 +01:00
}
}
/// Multiplexer. Implements the `StreamMuxer` trait.
///
/// This implementation isn't capable of detecting when the underlying socket changes its address,
/// and no [`StreamMuxerEvent::AddressChange`] event is ever emitted.
pub struct Multiplex<C> {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
io: Mutex<io::Multiplexed<C>>
2017-11-01 11:59:52 +01:00
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
impl<C> StreamMuxer for Multiplex<C>
where
C: AsyncRead + AsyncWrite + Unpin
2017-11-22 18:01:28 +01:00
{
type Substream = Substream;
type OutboundSubstream = OutboundSubstream;
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
type Error = io::Error;
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn poll_event(&self, cx: &mut Context<'_>)
-> Poll<io::Result<StreamMuxerEvent<Self::Substream>>>
{
let stream_id = ready!(self.io.lock().poll_next_stream(cx))?;
let stream = Substream::new(stream_id);
Poll::Ready(Ok(StreamMuxerEvent::InboundSubstream(stream)))
2017-11-22 18:01:28 +01:00
}
fn open_outbound(&self) -> Self::OutboundSubstream {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
OutboundSubstream {}
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn poll_outbound(&self, cx: &mut Context<'_>, _: &mut Self::OutboundSubstream)
-> Poll<Result<Self::Substream, io::Error>>
{
let stream_id = ready!(self.io.lock().poll_open_stream(cx))?;
Poll::Ready(Ok(Substream::new(stream_id)))
}
fn destroy_outbound(&self, _substream: Self::OutboundSubstream) {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
// Nothing to do, since `open_outbound` creates no new local state.
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn read_substream(&self, cx: &mut Context<'_>, substream: &mut Self::Substream, buf: &mut [u8])
-> Poll<Result<usize, io::Error>>
{
loop {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
// Try to read from the current (i.e. last received) frame.
2019-01-30 15:41:54 +01:00
if !substream.current_data.is_empty() {
let len = cmp::min(substream.current_data.len(), buf.len());
buf[..len].copy_from_slice(&substream.current_data.split_to(len));
return Poll::Ready(Ok(len));
}
2017-11-22 18:01:28 +01:00
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
// Read the next data frame from the multiplexed stream.
match ready!(self.io.lock().poll_read_stream(cx, substream.id))? {
Some(data) => { substream.current_data = data; }
None => { return Poll::Ready(Ok(0)) }
}
2017-11-22 18:01:28 +01:00
}
2017-11-01 11:59:52 +01:00
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn write_substream(&self, cx: &mut Context<'_>, substream: &mut Self::Substream, buf: &[u8])
-> Poll<Result<usize, io::Error>>
{
self.io.lock().poll_write_stream(cx, substream.id, buf)
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn flush_substream(&self, cx: &mut Context<'_>, substream: &mut Self::Substream)
-> Poll<Result<(), io::Error>>
{
self.io.lock().poll_flush_stream(cx, substream.id)
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn shutdown_substream(&self, cx: &mut Context<'_>, substream: &mut Self::Substream)
-> Poll<Result<(), io::Error>>
{
self.io.lock().poll_close_stream(cx, substream.id)
}
fn destroy_substream(&self, sub: Self::Substream) {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
self.io.lock().drop_stream(sub.id);
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn close(&self, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
self.io.lock().poll_close(cx)
}
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
fn flush_all(&self, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
self.io.lock().poll_flush(cx)
}
2017-11-01 11:59:52 +01:00
}
/// Active attempt to open an outbound substream.
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
pub struct OutboundSubstream {}
/// Active substream to the remote.
pub struct Substream {
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
/// The unique, local identifier of the substream.
id: LocalStreamId,
/// The current data frame the substream is reading from.
current_data: Bytes,
[mplex] Refactoring with Patches (#1769) * Refactor Mplex. Thereby addressing the following issues: * Send a `Reset` frame when open substreams get dropped (313). * Avoid stalls caused by a read operation on one substream reading (and buffering) frames for another substream without notifying the corresponding task. I.e. the tracked read-interest must be scoped to a substream. * Remove dropped substreams from the tracked set of open substreams, to avoid artificially running into substream limits. * Update CHANGELOG. * Refine behaviour of dropping substreams. By taking the substream state into account. The refined behaviour is modeled after the behaviour of Yamux. * Tweak docs and recv buffer retention. * Further small tweaks. * Make the pending frames a FIFO queue. * Take more care to avoid keeping read-wakers around and to notify them when streams close. * Prefer wake over unregister. It is probably safer to always wake pending wakers. * Update muxers/mplex/src/codec.rs Co-authored-by: Max Inden <mail@max-inden.de> * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Some review feedback and cosmetics. * Update muxers/mplex/src/io.rs Co-authored-by: Max Inden <mail@max-inden.de> * Revise read control flow for clarity. While seemingly duplicating some control flow between `poll_next_strean` and `poll_read_stream`, the individual control flow of each read operation is easier to follow. * CI * Rename Status::Ok to Status::Open. * Rename pending_flush to pending_flush_open. * Finishing touches. * Tweak changelog. Co-authored-by: Max Inden <mail@max-inden.de>
2020-09-28 10:30:49 +02:00
}
impl Substream {
fn new(id: LocalStreamId) -> Self {
Self { id, current_data: Bytes::new() }
}
}