From 4c4150a0428d184c21d75d990e8ea679bc7f97f4 Mon Sep 17 00:00:00 2001 From: Riz Ashraf Date: Mon, 21 Sep 2026 16:55:06 +0100 Subject: [PATCH] perf(tasks): refactor update and delete task handlers to eliminate string clones when mapping task relationships by relying on reference closures and index queues --- server/src/handlers_v2/tasks.rs | 35 ++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/server/src/handlers_v2/tasks.rs b/server/src/handlers_v2/tasks.rs index eefd884..4dcd16f 100644 --- a/server/src/handlers_v2/tasks.rs +++ b/server/src/handlers_v2/tasks.rs @@ -206,25 +206,36 @@ impl McpTool for UpdateTaskStatusHandler { // Cascade cancellation to children if target_status == "cancelled" || target_status == "abandoned" { - let mut children_map: std::collections::HashMap> = + let mut children_map: std::collections::HashMap> = std::collections::HashMap::new(); + + // First pass: map string ID to index to build the adjacency list by index + let mut id_to_idx = std::collections::HashMap::new(); + for (idx, t) in tasks.iter().enumerate() { + id_to_idx.insert(t.id.as_str(), idx); + } + for (idx, t) in tasks.iter().enumerate() { if let Some(pid) = &t.parent_id { - children_map.entry(pid.clone()).or_default().push(idx); + if let Some(&p_idx) = id_to_idx.get(pid.as_str()) { + children_map.entry(p_idx).or_default().push(idx); + } } } - let mut queue = std::collections::VecDeque::new(); - queue.push_back(target_id.clone()); + if let Some(&start_idx) = id_to_idx.get(target_id.as_str()) { + let mut queue = std::collections::VecDeque::new(); + queue.push_back(start_idx); - while let Some(curr) = queue.pop_front() { - if let Some(child_indices) = children_map.get(&curr) { - for &idx in child_indices { - if tasks[idx].status != "completed" - && tasks[idx].status != target_status - { - tasks[idx].status = target_status.clone(); - queue.push_back(tasks[idx].id.clone()); + while let Some(curr) = queue.pop_front() { + if let Some(child_indices) = children_map.get(&curr) { + for &idx in child_indices { + if tasks[idx].status != "completed" + && tasks[idx].status != target_status + { + tasks[idx].status = target_status.clone(); + queue.push_back(idx); + } } } }