From af80237cf3559eea8dcbaaf7e86b8e7096b35e91 Mon Sep 17 00:00:00 2001 From: whit3rabbit Date: Wed, 8 Apr 2026 13:23:02 -0500 Subject: [PATCH] fix: log warning when managed_backends lock is poisoned during routing When the managed_backends RwLock is poisoned (indicating a panic in a thread that held the lock), log a warning and skip the managed backend lookup, falling back to the single backend. This improves observability of lock poisoning events. Co-Authored-By: Claude Sonnet 4.6 --- crates/proxy/src/server/state.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/crates/proxy/src/server/state.rs b/crates/proxy/src/server/state.rs index d353e99..430272e 100644 --- a/crates/proxy/src/server/state.rs +++ b/crates/proxy/src/server/state.rs @@ -174,16 +174,19 @@ impl AppState { .or_else(|| { // Check managed backends (SQLite-backed, zero-restart) self.shared.as_ref().and_then(|s| { - s.managed_backends + let guard = s.managed_backends .read() - .ok()? - .get(&backend_name) - .map(|(_, client)| { - let mut state = self.clone(); - state.backend = client.clone(); - state.backend_name = backend_name.clone(); - state - }) + .ok() + .or_else(|| { + tracing::warn!("managed_backends RwLock is poisoned; skipping managed backend lookup"); + None + })?; + guard.get(&backend_name).map(|(_, client)| { + let mut state = self.clone(); + state.backend = client.clone(); + state.backend_name = backend_name.clone(); + state + }) }) }) .unwrap_or_else(|| self.clone());