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
- Acquisition: Get a connection from the pool (or create new)
- Usage: Use the connection for operations
- Release: Return the connection to the pool
- 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: usizeMaximum number of concurrent connections allowed
ConnectionTimeout: DurationTimeout 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
impl ConnectionPool
Sourcepub fn default() -> Self
pub fn default() -> Self
Create a connection pool with default settings
Default settings: 10 max connections, 30s timeout
Sourcepub async fn GetConnection(&self) -> Result<ConnectionHandle, String>
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 handleErr(String): Error message if timeout or failure occurs
§Example
let handle = pool.GetConnection().await?;Sourcepub async fn ReleaseConnection(&self, handle: ConnectionHandle)
pub async fn ReleaseConnection(&self, handle: ConnectionHandle)
Sourcepub async fn GetStats(&self) -> ConnectionStats
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());Sourcepub async fn CleanUpStaleConnections(&self) -> usize
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);Sourceasync fn StartHealthMonitoring(&self, connection_id: &str)
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
Sourcepub fn max_connections(&self) -> usize
pub fn max_connections(&self) -> usize
Get the maximum number of connections
Sourcepub fn connection_timeout(&self) -> Duration
pub fn connection_timeout(&self) -> Duration
Get the connection timeout
Sourcepub fn available_permits(&self) -> usize
pub fn available_permits(&self) -> usize
Get the number of available permits
Sourcepub async fn active_connections(&self) -> usize
pub async fn active_connections(&self) -> usize
Get the number of active connections
Auto Trait Implementations§
impl Freeze for ConnectionPool
impl !RefUnwindSafe for ConnectionPool
impl Send for ConnectionPool
impl Sync for ConnectionPool
impl Unpin for ConnectionPool
impl !UnwindSafe for ConnectionPool
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSync for T
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].