From 9e02639d0d5a0f8cbc2e70bc207c9c017acc8942 Mon Sep 17 00:00:00 2001 From: Riz Ashraf Date: Sun, 11 Oct 2026 18:31:26 +0100 Subject: [PATCH] fix(mcp-memory,server): prevent lock contention and executor blocking in TasksTool::List --- server/src/handlers/tasks.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/server/src/handlers/tasks.rs b/server/src/handlers/tasks.rs index 264b03c..420edbf 100644 --- a/server/src/handlers/tasks.rs +++ b/server/src/handlers/tasks.rs @@ -256,10 +256,10 @@ impl McpTool for TasksHandler { } } TasksTool::List { git_branch, status, summary_level, max_tokens, offset } => { - let level = summary_level.as_deref().unwrap_or("detailed"); + let level = summary_level.clone().unwrap_or_else(|| "detailed".to_string()); let offset = offset.unwrap_or(0); - let data = state.project.tasks.read_with(|tasks| { - let matching: Vec<_> = tasks + let filtered: Vec = state.project.tasks.read_with(|tasks| { + tasks .iter() .filter(|t| { let status_match = match status.as_deref() { @@ -273,17 +273,17 @@ impl McpTool for TasksHandler { }; status_match && branch_match }) - .collect(); - - let mut filtered: Vec<_> = matching - .into_iter() .skip(offset) - .map(|t| match level { + .map(|t| match level.as_str() { "compact" => serde_json::json!({ "id": t.id, "title": t.title, "status": t.status }), "full" => serde_json::to_value(t).unwrap_or_default(), _ => serde_json::json!({ "id": t.id, "title": t.title, "status": t.status, "description": t.description, "git_branch": t.git_branch }), }) - .collect(); + .collect() + }); + + let data = tokio::task::spawn_blocking(move || { + let mut filtered = filtered; let mut json_str = serde_yaml::to_string(&filtered)?; if let Some(max_t) = max_tokens { let char_limit = max_t * 4; @@ -293,7 +293,8 @@ impl McpTool for TasksHandler { } } Ok::(json_str) - })?; + }).await.map_err(|e| crate::error::AppError::Internal(format!("Task serialization thread panicked: {}", e)))??; + Ok(data) } TasksTool::SetCriteria { id, criteria: criteria_list } => {