From 98b062e9b564f399fb06da935ea6d6e37fa1d3f5 Mon Sep 17 00:00:00 2001 From: Zain Kabani Date: Wed, 24 May 2023 11:59:31 -0400 Subject: [PATCH 1/2] Add LIFO option for getting resources in the pool --- bb8/src/api.rs | 20 ++++++++++++++++++++ bb8/src/internals.rs | 14 +++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/bb8/src/api.rs b/bb8/src/api.rs index f0d1b82..6dc8219 100644 --- a/bb8/src/api.rs +++ b/bb8/src/api.rs @@ -74,6 +74,14 @@ impl Pool { } } +#[derive(Debug)] +pub enum QueueStrategy { + /// Last in first out + LIFO, + /// First in first out + FIFO, +} + /// A builder for a connection pool. #[derive(Debug)] pub struct Builder { @@ -95,6 +103,8 @@ pub struct Builder { pub(crate) error_sink: Box>, /// The time interval used to wake up and reap connections. pub(crate) reaper_rate: Duration, + /// Queue strategy (FIFO or LIFO) + pub(crate) queue_strategy: QueueStrategy, /// User-supplied trait object responsible for initializing connections pub(crate) connection_customizer: Option>>, _p: PhantomData, @@ -112,6 +122,7 @@ impl Default for Builder { retry_connection: true, error_sink: Box::new(NopErrorSink), reaper_rate: Duration::from_secs(30), + queue_strategy: QueueStrategy::FIFO, connection_customizer: None, _p: PhantomData, } @@ -260,6 +271,15 @@ impl Builder { self } + /// Sets the queue strategy to be used by the pool + /// + /// Defaults to `LIFO`. + #[must_use] + pub fn queue_strategy(mut self, queue_strategy: QueueStrategy) -> Self { + self.queue_strategy = queue_strategy; + self + } + /// Set the connection customizer to customize newly checked out connections #[must_use] pub fn connection_customizer( diff --git a/bb8/src/internals.rs b/bb8/src/internals.rs index cffd928..0050a67 100644 --- a/bb8/src/internals.rs +++ b/bb8/src/internals.rs @@ -2,7 +2,7 @@ use std::cmp::min; use std::sync::Arc; use std::time::Instant; -use crate::lock::Mutex; +use crate::{lock::Mutex, api::QueueStrategy}; use futures_channel::oneshot; use crate::api::{Builder, ManageConnection}; @@ -42,6 +42,7 @@ where conns: VecDeque>, num_conns: u32, pending_conns: u32, + queue_strategy: QueueStrategy, } impl PoolInternals @@ -80,8 +81,14 @@ where } // Queue it in the idle queue - self.conns - .push_back(IdleConn::from(guard.conn.take().unwrap())); + match self.queue_strategy { + QueueStrategy::FIFO => self + .conns + .push_back(IdleConn::from(guard.conn.take().unwrap())), + QueueStrategy::LIFO => self + .conns + .push_front(IdleConn::from(guard.conn.take().unwrap())), + } } pub(crate) fn connect_failed(&mut self, _: Approval) { @@ -163,6 +170,7 @@ where conns: VecDeque::new(), num_conns: 0, pending_conns: 0, + queue_strategy: QueueStrategy::LIFO, } } } From 178012242aa6160d8a6589fdc7a00159987ac1aa Mon Sep 17 00:00:00 2001 From: Zain Kabani Date: Wed, 24 May 2023 13:40:34 -0400 Subject: [PATCH 2/2] Fix comment and fmt --- bb8/src/api.rs | 2 +- bb8/src/internals.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bb8/src/api.rs b/bb8/src/api.rs index 6dc8219..e1a72fe 100644 --- a/bb8/src/api.rs +++ b/bb8/src/api.rs @@ -273,7 +273,7 @@ impl Builder { /// Sets the queue strategy to be used by the pool /// - /// Defaults to `LIFO`. + /// Defaults to `FIFO`. #[must_use] pub fn queue_strategy(mut self, queue_strategy: QueueStrategy) -> Self { self.queue_strategy = queue_strategy; diff --git a/bb8/src/internals.rs b/bb8/src/internals.rs index 0050a67..1ec3e42 100644 --- a/bb8/src/internals.rs +++ b/bb8/src/internals.rs @@ -2,7 +2,7 @@ use std::cmp::min; use std::sync::Arc; use std::time::Instant; -use crate::{lock::Mutex, api::QueueStrategy}; +use crate::{api::QueueStrategy, lock::Mutex}; use futures_channel::oneshot; use crate::api::{Builder, ManageConnection};