From 22ad90b2baad04afd0e84aa7b00b8c82f00ddb8e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 25 Mar 2026 22:43:26 +0000 Subject: [PATCH] [fix](trx-server): release mutex before serialization in flush_all Clone history data out under the lock, then drop the guard before calling save_key, so serialization never blocks concurrent readers. https://claude.ai/code/session_01XzurkeuUmamBuhQwxVy7T4 Signed-off-by: Claude --- src/trx-server/src/history_store.rs | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/trx-server/src/history_store.rs b/src/trx-server/src/history_store.rs index 9ae41e6..51753f5 100644 --- a/src/trx-server/src/history_store.rs +++ b/src/trx-server/src/history_store.rs @@ -134,26 +134,41 @@ pub fn load_all(db: &PickleDb, rig_id: &str, histories: &Arc) } /// Flush `histories` to the database under `rig_id`-prefixed keys and sync. +/// +/// Each history's mutex is held only long enough to clone the data out, +/// so serialization (which may be slow) never blocks concurrent readers. pub fn flush_all(db: &mut PickleDb, rig_id: &str, histories: &Arc) { let k = |suffix: &str| format!("{}.{}", rig_id, suffix); if let Ok(h) = histories.ais.lock() { - save_key(db, &k("ais"), &h); + let snapshot = h.clone(); + drop(h); + save_key(db, &k("ais"), &snapshot); } if let Ok(h) = histories.vdes.lock() { - save_key(db, &k("vdes"), &h); + let snapshot = h.clone(); + drop(h); + save_key(db, &k("vdes"), &snapshot); } if let Ok(h) = histories.aprs.lock() { - save_key(db, &k("aprs"), &h); + let snapshot = h.clone(); + drop(h); + save_key(db, &k("aprs"), &snapshot); } if let Ok(h) = histories.cw.lock() { - save_key(db, &k("cw"), &h); + let snapshot = h.clone(); + drop(h); + save_key(db, &k("cw"), &snapshot); } if let Ok(h) = histories.ft8.lock() { - save_key(db, &k("ft8"), &h); + let snapshot = h.clone(); + drop(h); + save_key(db, &k("ft8"), &snapshot); } if let Ok(h) = histories.wspr.lock() { - save_key(db, &k("wspr"), &h); + let snapshot = h.clone(); + drop(h); + save_key(db, &k("wspr"), &snapshot); } let _ = db.dump(); }