Skip to content

Commit 5201212

Browse files
lutterclaude
andcommitted
graph, store: Replace std::sync::RwLock with parking_lot::RwLock for pool metrics
Use parking_lot::RwLock instead of std::sync::RwLock for connection pool metric recording. parking_lot::RwLock is faster for short-held locks as it uses efficient spinning before parking, reducing tokio worker thread blocking during metric recording. This change helps reduce tokio threadpool contention when the connection pool is under heavy load, as the metric recording locks are held for only microseconds. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent dace628 commit 5201212

4 files changed

Lines changed: 9 additions & 7 deletions

File tree

graph/src/components/store/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ use std::collections::{BTreeMap, BTreeSet, HashSet};
2525
use std::fmt;
2626
use std::fmt::Display;
2727
use std::sync::atomic::{AtomicUsize, Ordering};
28-
use std::sync::{Arc, RwLock};
28+
use std::sync::Arc;
2929
use std::time::Duration;
3030

31+
use crate::parking_lot::RwLock;
32+
3133
use async_trait::async_trait;
3234

3335
use crate::blockchain::{Block, BlockHash, BlockPtr};

graph/src/data/graphql/load_manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ impl LoadManager {
457457
}
458458

459459
fn overloaded(&self, wait_stats: &PoolWaitStats) -> (bool, Duration) {
460-
let store_avg = wait_stats.read().unwrap().average();
460+
let store_avg = wait_stats.read().average();
461461
let overloaded = store_avg
462462
.map(|average| average > ENV_VARS.load_threshold)
463463
.unwrap_or(false);

store/postgres/src/pool/manager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ use std::collections::HashMap;
2222
use std::sync::atomic::AtomicBool;
2323
use std::sync::atomic::Ordering;
2424
use std::sync::Arc;
25-
use std::sync::RwLock;
2625
use std::time::{Duration, Instant};
2726

27+
use graph::parking_lot::RwLock;
28+
2829
use crate::pool::AsyncPool;
2930

3031
/// Our own connection manager. It is pretty much the same as
@@ -308,7 +309,6 @@ impl WaitMeter {
308309
pub(crate) fn add_conn_wait_time(&self, duration: Duration) {
309310
self.wait_stats
310311
.write()
311-
.unwrap()
312312
.add_and_register(duration, &self.wait_gauge);
313313
}
314314
}

store/postgres/src/pool/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ use graph::slog::warn;
1919
use graph::util::timed_rw_lock::TimedMutex;
2020
use tokio::sync::OwnedSemaphorePermit;
2121

22+
use std::collections::HashMap;
2223
use std::fmt::{self};
2324
use std::ops::{Deref, DerefMut};
2425
use std::sync::Arc;
2526
use std::time::Duration;
26-
use std::{collections::HashMap, sync::RwLock};
27+
28+
use graph::parking_lot::RwLock;
2729

2830
use crate::catalog;
2931
use crate::pool::manager::{ConnectionManager, WaitMeter};
@@ -720,7 +722,6 @@ impl PoolInner {
720722
let permit = self.query_semaphore.cheap_clone().acquire_owned().await;
721723
self.semaphore_wait_stats
722724
.write()
723-
.unwrap()
724725
.add_and_register(start.elapsed(), &self.semaphore_wait_gauge);
725726
permit.unwrap()
726727
}
@@ -734,7 +735,6 @@ impl PoolInner {
734735
let elapsed = start.elapsed();
735736
self.indexing_semaphore_wait_stats
736737
.write()
737-
.unwrap()
738738
.add_and_register(elapsed, &self.indexing_semaphore_wait_gauge);
739739
(permit.unwrap(), elapsed)
740740
}

0 commit comments

Comments
 (0)