From e098c257c2465074b984917c8f7ae31b6a7c775a Mon Sep 17 00:00:00 2001 From: Riz Ashraf Date: Mon, 21 Sep 2026 06:22:05 +0100 Subject: [PATCH] Optimize Store persistence by eliminating deep clone of internal lock, and optimize relation merging by using retain deduplication. --- server/src/handlers.rs | 10 ++++------ server/src/state.rs | 7 ++----- server/src/store.rs | 30 ++++++++++++++---------------- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/server/src/handlers.rs b/server/src/handlers.rs index abf58e1..8d1ace7 100644 --- a/server/src/handlers.rs +++ b/server/src/handlers.rs @@ -1053,11 +1053,10 @@ impl MemoryHandler { adrs.push(a); }); - if let Some(adr) = new_adr { - if let Ok(idx) = self.state.search_index.read() { + if let Some(adr) = new_adr + && let Ok(idx) = self.state.search_index.read() { drop(idx.index_adr(&adr)); } - } Ok(format!("Decision logged as {}", adr_id).to_string()) } @@ -1081,8 +1080,7 @@ impl MemoryHandler { if let Some(src) = master.entities.remove(&req.source_entity) { if let Some(tgt) = master.entities.get_mut(&req.target_entity) { tgt.observations.extend(src.observations); - tgt.observations = - MemoryState::unique_items(tgt.observations.clone()); + MemoryState::deduplicate(&mut tgt.observations); } else { let mut new_tgt = src.clone(); new_tgt.name = req.target_entity.clone(); @@ -1097,7 +1095,7 @@ impl MemoryHandler { r.to = req.target_entity.clone(); } } - master.relations = MemoryState::unique_items(master.relations.clone()); + MemoryState::deduplicate(&mut master.relations); }); Ok("Entities merged".to_string()) } diff --git a/server/src/state.rs b/server/src/state.rs index f1c24c1..60e9561 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -31,12 +31,9 @@ pub struct MemoryState { } impl MemoryState { - pub fn unique_items(input: Vec) -> Vec { + pub fn deduplicate(input: &mut Vec) { let mut keys = std::collections::HashSet::new(); - input - .into_iter() - .filter(|entry| keys.insert(entry.clone())) - .collect() + input.retain(|entry| keys.insert(entry.clone())); } pub fn broadcast_activity(&self, message: &str) { diff --git a/server/src/store.rs b/server/src/store.rs index a44ff3b..60d39ee 100644 --- a/server/src/store.rs +++ b/server/src/store.rs @@ -30,29 +30,27 @@ impl Store T { let lock = self.cache.read().unwrap(); lock.clone() } pub fn modify(&self, f: F) { - let mut lock = self.cache.write().unwrap(); - f(&mut lock); - let key = self.key.clone(); - let db = self.db.clone(); - let data = lock.clone(); + let (key, db, json_data) = { + let mut lock = self.cache.write().unwrap(); + f(&mut lock); + // Serialize while holding lock to avoid expensive deep clone of T + let json = serde_json::to_vec(&*lock).unwrap(); + (self.key.clone(), self.db.clone(), json) + }; + tokio::task::spawn_blocking(move || { - Self::save_to_db(&key, &db, &data); + let write_txn = db.begin_write().unwrap(); + { + let mut table = write_txn.open_table(STORE_TABLE).unwrap(); + table.insert(key.as_str(), json_data.as_slice()).unwrap(); + } + write_txn.commit().unwrap(); }); } }