ConnectionPool

Struct ConnectionPool 

Source
pub struct ConnectionPool {
    MaxConnections: usize,
    ConnectionTimeout: Duration,
    Semaphore: Arc<Semaphore>,
    ActiveConnections: Arc<Mutex<HashMap<String, ConnectionHandle>>>,
    HealthChecker: Arc<Mutex<HealthChecker>>,
}
Expand description

Connection pool for IPC operations

This structure manages a pool of connections, preventing connection exhaustion by reusing connections and providing health monitoring.

§Pool Architecture

ConnectionPool
    |
    | Semaphore (limits max connections)
    v
Active Connections (HashMap<id, ConnectionHandle>)
    |
    | Health Checker (background task)
    v
Monitor health and update scores

§Connection Lifecycle

  1. Acquisition: Get a connection from the pool (or create new)
  2. Usage: Use the connection for operations
  3. Release: Return the connection to the pool
  4. Cleanup: Automatically remove stale/unhealthy connections

§Health Monitoring

Each connection has:

  • Health score (0.0 to 100.0)
  • Error count
  • Last used timestamp
  • Background health checks every 30 seconds

§Example Usage

let pool = Arc::new(ConnectionPool::new(10, Duration::from_secs(30)));

// Get a connection
let handle = pool.GetConnection().await?;

// Use the connection...

// Release the connection
pool.ReleaseConnection(handle).await;

// Get statistics
let stats = pool.GetStats().await;

Fields§

§MaxConnections: usize

Maximum number of concurrent connections allowed

§ConnectionTimeout: Duration

Timeout for acquiring a connection from the pool

§Semaphore: Arc<Semaphore>

Semaphore to limit concurrent connections

§ActiveConnections: Arc<Mutex<HashMap<String, ConnectionHandle>>>

Map of active connections by ID

§HealthChecker: Arc<Mutex<HealthChecker>>

Health checker for monitoring connection health

Implementations§

Source§

impl ConnectionPool

Source

pub fn new(MaxConnections: usize, ConnectionTimeout: Duration) -> Self

Create a new connection pool with specified parameters

§Parameters
  • MaxConnections: Maximum number of concurrent connections
  • ConnectionTimeout: Timeout for acquiring a connection
§Example
let pool = ConnectionPool::new(10, Duration::from_secs(30));
Source

pub fn default() -> Self

Create a connection pool with default settings

Default settings: 10 max connections, 30s timeout

Source

pub async fn GetConnection(&self) -> Result<ConnectionHandle, String>

Get a connection handle from the pool with timeout

This method acquires a semaphore permit and creates a new connection handle. If the pool is at capacity, it will wait until a connection becomes available or the timeout is reached.

§Returns
  • Ok(ConnectionHandle): New connection handle
  • Err(String): Error message if timeout or failure occurs
§Example
let handle = pool.GetConnection().await?;
Source

pub async fn ReleaseConnection(&self, handle: ConnectionHandle)

Release a connection handle back to the pool

This method removes the connection from the active connections map, allowing the semaphore permit to be reused.

§Parameters
  • handle: The connection handle to release
§Example
pool.ReleaseConnection(handle).await;
Source

pub async fn GetStats(&self) -> ConnectionStats

Get connection statistics for monitoring

This method returns aggregate statistics about the connection pool, useful for monitoring and debugging.

§Returns

Connection statistics including total connections, healthy connections, utilization, etc.

§Example
let stats = pool.GetStats().await;
println!("Pool stats: {:?}", stats.summary());
Source

pub async fn CleanUpStaleConnections(&self) -> usize

Clean up stale connections

This method removes connections that have not been used recently or are unhealthy, preventing memory leaks and resource exhaustion.

Stale connection criteria:

  • Unused for 5 minutes (300 seconds)
  • Not healthy (health score <= 50 or error count >= 5)
§Returns

The number of stale connections removed

§Example
let cleaned = pool.CleanUpStaleConnections().await;
println!("Cleaned up {} stale connections", cleaned);
Source

async fn StartHealthMonitoring(&self, connection_id: &str)

Start health monitoring for a connection

This method spawns a background task that periodically checks the health of the connection and updates its health score.

§Parameters
  • connection_id: The ID of the connection to monitor
Source

pub fn max_connections(&self) -> usize

Get the maximum number of connections

Source

pub fn connection_timeout(&self) -> Duration

Get the connection timeout

Source

pub fn available_permits(&self) -> usize

Get the number of available permits

Source

pub async fn active_connections(&self) -> usize

Get the number of active connections

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<T> AutoreleaseSafe for T
where T: ?Sized,