Skip to content

Commit fc9a823

Browse files
pfreixesdjc
authored andcommitted
Adds new statistics attributes for tracking connections closed
The two new attributes `connections_closed_broken` and `connections_closed_invalid` can be used for respectively understand how many conections were closed due to be considered broken or invalid.
1 parent 994c79d commit fc9a823

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

bb8/src/api.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ pub struct Statistics {
101101
pub get_timed_out: u64,
102102
/// Total time accumulated waiting for a connection.
103103
pub get_wait_time: Duration,
104+
/// Total connections that were closed due to be in broken state.
105+
pub connections_closed_broken: u64,
106+
/// Total connections that were closed due to be considered invalid.
107+
pub connections_closed_invalid: u64,
104108
}
105109

106110
/// A builder for a connection pool.

bb8/src/inner.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use tokio::spawn;
1010
use tokio::time::{interval_at, sleep, timeout, Interval};
1111

1212
use crate::api::{Builder, ConnectionState, ManageConnection, PooledConnection, RunError, State};
13-
use crate::internals::{Approval, ApprovalIter, Conn, SharedPool, StatsGetKind};
13+
use crate::internals::{Approval, ApprovalIter, Conn, SharedPool, StatsGetKind, StatsKind};
1414

1515
pub(crate) struct PoolInner<M>
1616
where
@@ -113,6 +113,7 @@ where
113113
match self.inner.manager.is_valid(&mut conn).await {
114114
Ok(()) => return Ok(conn),
115115
Err(e) => {
116+
self.inner.statistics.record(StatsKind::ClosedInvalid);
116117
self.inner.forward_error(e);
117118
conn.state = ConnectionState::Invalid;
118119
continue;
@@ -149,7 +150,10 @@ where
149150
let mut locked = self.inner.internals.lock();
150151
match (state, self.inner.manager.has_broken(&mut conn.conn)) {
151152
(ConnectionState::Present, false) => locked.put(conn, None, self.inner.clone()),
152-
(_, _) => {
153+
(_, is_broken) => {
154+
if is_broken {
155+
self.inner.statistics.record(StatsKind::ClosedBroken);
156+
}
153157
let approvals = locked.dropped(1, &self.inner.statics);
154158
self.spawn_replenishing_approvals(approvals);
155159
self.inner.notify.notify_waiters();

bb8/src/internals.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ pub(crate) struct AtomicStatistics {
256256
pub(crate) get_waited: AtomicU64,
257257
pub(crate) get_timed_out: AtomicU64,
258258
pub(crate) get_wait_time_micros: AtomicU64,
259+
pub(crate) connections_closed_broken: AtomicU64,
260+
pub(crate) connections_closed_invalid: AtomicU64,
259261
}
260262

261263
impl AtomicStatistics {
@@ -272,6 +274,14 @@ impl AtomicStatistics {
272274
.fetch_add(wait_time.as_micros() as u64, Ordering::SeqCst);
273275
}
274276
}
277+
278+
pub(crate) fn record(&self, kind: StatsKind) {
279+
match kind {
280+
StatsKind::ClosedBroken => &self.connections_closed_broken,
281+
StatsKind::ClosedInvalid => &self.connections_closed_invalid,
282+
}
283+
.fetch_add(1, Ordering::SeqCst);
284+
}
275285
}
276286

277287
impl From<&AtomicStatistics> for Statistics {
@@ -281,6 +291,8 @@ impl From<&AtomicStatistics> for Statistics {
281291
get_waited: item.get_waited.load(Ordering::SeqCst),
282292
get_timed_out: item.get_timed_out.load(Ordering::SeqCst),
283293
get_wait_time: Duration::from_micros(item.get_wait_time_micros.load(Ordering::SeqCst)),
294+
connections_closed_broken: item.connections_closed_broken.load(Ordering::SeqCst),
295+
connections_closed_invalid: item.connections_closed_invalid.load(Ordering::SeqCst),
284296
}
285297
}
286298
}
@@ -290,3 +302,8 @@ pub(crate) enum StatsGetKind {
290302
Waited,
291303
TimedOut,
292304
}
305+
306+
pub(crate) enum StatsKind {
307+
ClosedBroken,
308+
ClosedInvalid,
309+
}

bb8/tests/test.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ async fn test_drop_on_broken() {
246246
}
247247

248248
assert!(DROPPED.load(Ordering::SeqCst));
249+
assert_eq!(pool.state().statistics.connections_closed_broken, 1);
249250
}
250251

251252
#[tokio::test]
@@ -453,6 +454,9 @@ async fn test_now_invalid() {
453454
// Now try to get a new connection.
454455
let r = pool.get().await;
455456
assert!(r.is_err());
457+
458+
// both connections in the pool were considered invalid
459+
assert_eq!(pool.state().statistics.connections_closed_invalid, 2);
456460
}
457461

458462
#[tokio::test]

0 commit comments

Comments
 (0)