[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 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-03-25 22:43:26 +00:00
committed by Stan Grams
parent d7c8eed44f
commit 22ad90b2ba
+21 -6
View File
@@ -134,26 +134,41 @@ pub fn load_all(db: &PickleDb, rig_id: &str, histories: &Arc<DecoderHistories>)
} }
/// Flush `histories` to the database under `rig_id`-prefixed keys and sync. /// 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<DecoderHistories>) { pub fn flush_all(db: &mut PickleDb, rig_id: &str, histories: &Arc<DecoderHistories>) {
let k = |suffix: &str| format!("{}.{}", rig_id, suffix); let k = |suffix: &str| format!("{}.{}", rig_id, suffix);
if let Ok(h) = histories.ais.lock() { 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() { 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() { 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() { 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() { 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() { 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(); let _ = db.dump();
} }