Execute MCP server delete (called from main loop after render)
(
&mut self,
server_id: &str,
chat_view: &mut ChatView,
chat_state: &mut ChatState,
rt_handle: &tokio::runtime::Handle,
)
| 2656 | |
| 2657 | /// Execute MCP server delete (called from main loop after render) |
| 2658 | fn execute_mcp_delete( |
| 2659 | &mut self, |
| 2660 | server_id: &str, |
| 2661 | chat_view: &mut ChatView, |
| 2662 | chat_state: &mut ChatState, |
| 2663 | rt_handle: &tokio::runtime::Handle, |
| 2664 | ) { |
| 2665 | let mcp_service = match crate::get_mcp_service() { |
| 2666 | Some(svc) => svc.clone(), |
| 2667 | None => { |
| 2668 | chat_state.add_system_message("MCP service not initialized".to_string()); |
| 2669 | chat_view.mcp_selector_set_loading(None); |
| 2670 | return; |
| 2671 | } |
| 2672 | }; |
| 2673 | |
| 2674 | let server_id_owned = server_id.to_string(); |
| 2675 | let task_server_id = server_id_owned.clone(); |
| 2676 | let handle = rt_handle.spawn(async move { |
| 2677 | // Delete config first so UI can reflect removal immediately even if stop is blocked. |
| 2678 | mcp_service |
| 2679 | .config_service() |
| 2680 | .delete_server_config(&server_id_owned) |
| 2681 | .await?; |
| 2682 | |
| 2683 | // Best-effort async cleanup: slow startups may hold process write lock for a long time. |
| 2684 | // Retry stop with short timeout, without blocking the delete operation completion. |
| 2685 | let cleanup_service = mcp_service.clone(); |
| 2686 | let cleanup_server_id = server_id_owned.clone(); |
| 2687 | tokio::spawn(async move { |
| 2688 | for attempt in 1..=20 { |
| 2689 | let stop_result = tokio::time::timeout( |
| 2690 | Duration::from_millis(250), |
| 2691 | cleanup_service |
| 2692 | .server_manager() |
| 2693 | .stop_server(&cleanup_server_id), |
| 2694 | ) |
| 2695 | .await; |
| 2696 | |
| 2697 | match stop_result { |
| 2698 | Ok(Ok(())) => return, |
| 2699 | Ok(Err(bitfun_core::util::errors::BitFunError::NotFound(_))) => return, |
| 2700 | Ok(Err(e)) => { |
| 2701 | tracing::debug!( |
| 2702 | "Best-effort MCP stop failed: id={} attempt={} error={}", |
| 2703 | cleanup_server_id, |
| 2704 | attempt, |
| 2705 | e |
| 2706 | ); |
| 2707 | } |
| 2708 | Err(_) => { |
| 2709 | tracing::debug!( |
| 2710 | "Best-effort MCP stop timed out: id={} attempt={}", |
| 2711 | cleanup_server_id, |
| 2712 | attempt |
| 2713 | ); |
| 2714 | } |
| 2715 | } |
no test coverage detected