use bytecodec::io::BufferedIo;
use fibers::net::TcpStream;
use futures::Future;
use std::net::SocketAddr;
use Error;
pub use connection_pool::{
ConnectionPool, ConnectionPoolBuilder, ConnectionPoolHandle, RentedConnection,
};
const BUF_SIZE: usize = 4096;
pub trait AcquireConnection {
type Connection: AsMut<Connection>;
type Future: Future<Item = Self::Connection, Error = Error>;
fn acquire_connection(&mut self, addr: SocketAddr) -> Self::Future;
}
#[derive(Debug, Default, Clone)]
pub struct Oneshot;
impl AcquireConnection for Oneshot {
type Connection = Connection;
type Future = Box<dyn Future<Item = Connection, Error = Error> + Send + 'static>;
fn acquire_connection(&mut self, addr: SocketAddr) -> Self::Future {
let future = TcpStream::connect(addr)
.map_err(move |e| track!(Error::from(e); addr))
.map(move |stream| Connection::new(addr, stream));
Box::new(future)
}
}
#[derive(Debug)]
pub struct Connection {
stream: BufferedIo<TcpStream>,
peer_addr: SocketAddr,
state: ConnectionState,
}
impl Connection {
pub fn new(peer_addr: SocketAddr, stream: TcpStream) -> Self {
let _ = stream.set_nodelay(true);
Connection {
peer_addr,
stream: BufferedIo::new(stream, BUF_SIZE, BUF_SIZE),
state: ConnectionState::InUse,
}
}
pub fn peer_addr(&self) -> SocketAddr {
self.peer_addr
}
pub(crate) fn state(&self) -> ConnectionState {
self.state
}
pub(crate) fn set_state(&mut self, state: ConnectionState) {
self.state = state;
}
pub(crate) fn stream_mut(&mut self) -> &mut BufferedIo<TcpStream> {
&mut self.stream
}
}
impl AsMut<Connection> for Connection {
fn as_mut(&mut self) -> &mut Self {
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum ConnectionState {
InUse,
Recyclable,
Closed,
}