Skip to content

Commit 121b41e

Browse files
lutterclaude
andcommitted
graph: Replace std::sync::RwLock with parking_lot::RwLock in LoadManager
These locks are accessed on every GraphQL query, so using the faster parking_lot::RwLock reduces lock contention in the query path. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 5201212 commit 121b41e

1 file changed

Lines changed: 9 additions & 7 deletions

File tree

graph/src/data/graphql/load_manager.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ use prometheus::core::GenericCounter;
44
use rand::{prelude::Rng, rng};
55
use std::collections::{HashMap, HashSet};
66
use std::iter::FromIterator;
7-
use std::sync::{Arc, RwLock};
7+
use std::sync::Arc;
88
use std::time::{Duration, Instant};
99

10+
use crate::parking_lot::RwLock;
11+
1012
use crate::components::metrics::{Counter, GaugeVec, MetricsRegistry};
1113
use crate::components::store::{DeploymentId, PoolWaitStats};
1214
use crate::data::graphql::shape_hash::shape_hash;
@@ -57,7 +59,7 @@ impl ShardEffort {
5759
}
5860

5961
pub fn add(&self, shard: &str, qref: QueryRef, duration: Duration, gauge: &GaugeVec) {
60-
let mut inner = self.inner.write().unwrap();
62+
let mut inner = self.inner.write();
6163
inner.add(qref, duration);
6264
gauge
6365
.with_label_values(&[shard])
@@ -70,7 +72,7 @@ impl ShardEffort {
7072
/// data for the particular query, return `None` as the effort
7173
/// for the query
7274
pub fn current_effort(&self, qref: &QueryRef) -> (Option<Duration>, Duration) {
73-
let inner = self.inner.read().unwrap();
75+
let inner = self.inner.read();
7476
let total_effort = inner.total.duration();
7577
let query_effort = inner.effort.get(qref).map(|stats| stats.duration());
7678
(query_effort, total_effort)
@@ -381,7 +383,7 @@ impl LoadManager {
381383

382384
let qref = QueryRef::new(deployment, shape_hash);
383385

384-
if self.jailed_queries.read().unwrap().contains(&qref) {
386+
if self.jailed_queries.read().contains(&qref) {
385387
return if ENV_VARS.load_simulate {
386388
Proceed
387389
} else {
@@ -426,7 +428,7 @@ impl LoadManager {
426428
"query_effort_ms" => query_effort,
427429
"total_effort_ms" => total_effort,
428430
"ratio" => format!("{:.4}", query_effort/total_effort));
429-
self.jailed_queries.write().unwrap().insert(qref);
431+
self.jailed_queries.write().insert(qref);
430432
return if ENV_VARS.load_simulate {
431433
Proceed
432434
} else {
@@ -465,7 +467,7 @@ impl LoadManager {
465467
}
466468

467469
fn kill_state(&self, shard: &str) -> (f64, Instant) {
468-
let state = self.kill_state.get(shard).unwrap().read().unwrap();
470+
let state = self.kill_state.get(shard).unwrap().read();
469471
(state.kill_rate, state.last_update)
470472
}
471473

@@ -505,7 +507,7 @@ impl LoadManager {
505507
kill_rate = (kill_rate - KILL_RATE_STEP_DOWN).max(0.0);
506508
}
507509
let event = {
508-
let mut state = self.kill_state.get(shard).unwrap().write().unwrap();
510+
let mut state = self.kill_state.get(shard).unwrap().write();
509511
state.kill_rate = kill_rate;
510512
state.last_update = now;
511513
state.log_event(now, kill_rate, overloaded)

0 commit comments

Comments
 (0)