#r2d2 #client-connection #connection-pool

thrift-pool

Easily make Connection Pools compatible with r2d2 and bb8 from any Thrift Client

17 releases (11 stable)

1.5.0 Jan 21, 2024
1.4.1 Jan 2, 2022
1.4.0 Dec 31, 2021
0.2.0 Dec 30, 2021
0.1.4 Dec 28, 2021

#9 in #r2d2

Download history 1/week @ 2024-06-21 3/week @ 2024-06-28 4/week @ 2024-07-05 4/week @ 2024-08-09 6/week @ 2024-08-16 10/week @ 2024-09-06 14/week @ 2024-09-13 55/week @ 2024-09-20 35/week @ 2024-09-27 30/week @ 2024-10-04

136 downloads per month
Used in hbase-thrift

MIT/Apache

21KB
219 lines

Thrift Pool

This library provides a simple way implement bb8 and/or r2d2 Connection Pools for any TThriftClient

Documenation

  • This library is primarily documented on its docs.rs page

  • Here is a quick example

use thrift::protocol::{TCompactInputProtocol, TCompactOutputProtocol, TInputProtocol, TOutputProtocol};
use thrift::transport::{
    ReadHalf, TFramedReadTransport, TFramedWriteTransport, TTcpChannel, WriteHalf,
};
use thrift_pool::{MakeThriftConnectionFromAddrs, ThriftConnectionManager, ThriftConnection, FromProtocol};

// A typical generated client
struct MyThriftClient<Ip: TInputProtocol, Op: TOutputProtocol> {
    i_prot: Ip,
    o_prot: Op,
}

// implement this trait so that `MakeThriftConnectionFromAddrs` can create it
impl<Ip: TInputProtocol, Op: TOutputProtocol> FromProtocol for MyThriftClient<Ip, Op> {
    type InputProtocol = Ip;

    type OutputProtocol = Op;

    fn from_protocol(
        input_protocol: Self::InputProtocol,
        output_protocol: Self::OutputProtocol,
    ) -> Self {
        MyThriftClient {
            i_prot: input_protocol,
            o_prot: output_protocol,
        }
    }
}

// implement this trait so that `ThriftConnectionManager` can manage it
impl<Ip: TInputProtocol, Op: TOutputProtocol> ThriftConnection for MyThriftClient<Ip, Op> {
    type Error = thrift::Error;
    fn is_valid(&mut self) -> Result<(), Self::Error> {
       Ok(())
    }
    fn has_broken(&mut self) -> bool {
       false
   }
}

// the actual connection type
type Client = MyThriftClient<
    TCompactInputProtocol<TFramedReadTransport<ReadHalf<TTcpChannel>>>,
    TCompactOutputProtocol<TFramedWriteTransport<WriteHalf<TTcpChannel>>>,
>;

// this works because we implemented FromProtocol for the client
// AND
// because the `Protocol` and `Transport` types used here satisfy the contraints
let manager = ThriftConnectionManager::new(
                    MakeThriftConnectionFromAddrs::<Client, _>::new("localhost:9090")
                );

// this works because we implemented ThriftConnection for the client
let pool = r2d2::Pool::builder().build(manager)?;

// this also works after enabling the `impl-bb8` feature
let pool = bb8::Pool::builder().build(manager).await?;

// the pool can be used just like in r2d2/bb8 documentation
let mut client = pool.get()?;

Examples

Dependencies

~0.6–6.5MB
~39K SLoC