fix(mcp-memory,server): prevent lock contention and executor blocking in TasksTool::List
This commit is contained in:
1 parent
0afba74b4c
commit
9e02639d0d
1 file changed
+11
-10
@@ -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<serde_json::Value> = 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::<String, crate::error::AppError>(json_str)
|
||||
})?;
|
||||
}).await.map_err(|e| crate::error::AppError::Internal(format!("Task serialization thread panicked: {}", e)))??;
|
||||
|
||||
Ok(data)
|
||||
}
|
||||
TasksTool::SetCriteria { id, criteria: criteria_list } => {
|
||||
|
||||
Reference in new issue
Block a user