use crate::get_proxy_manager;
use crate::model::{CheckMcpStatusResponseStatus, McpType};
use tokio::time::Duration;
use tracing::{debug, error, info};
const ONESHOT_TIMEOUT: Duration = Duration::from_secs(5 * 60);
pub async fn schedule_check_mcp_live() {
let proxy_manager = get_proxy_manager();
let mcp_service_statuses = proxy_manager.get_all_mcp_service_status();
info!(
"There are currently {} mcp plug-in services running",
mcp_service_statuses.len()
);
for mcp_service_status in mcp_service_statuses {
let mcp_id = mcp_service_status.mcp_id.clone();
let mcp_type = mcp_service_status.mcp_type.clone();
let cancellation_token = mcp_service_status.cancellation_token.clone();
if let CheckMcpStatusResponseStatus::Error(_) =
mcp_service_status.check_mcp_status_response_status
{
if let Err(e) = proxy_manager.cleanup_resources(&mcp_id).await {
error!("Failed to cleanup resources for {}: {}", mcp_id, e);
}
continue;
}
match mcp_type {
McpType::Persistent => {
if cancellation_token.is_cancelled() {
info!(
"The persistent MCP service {mcp_id} has been manually canceled and resources are being cleaned up."
);
if let Err(e) = proxy_manager.cleanup_resources(&mcp_id).await {
error!("Failed to cleanup resources for {}: {}", mcp_id, e);
}
continue;
}
if let Some(handler) = proxy_manager.get_proxy_handler(&mcp_id)
&& handler.is_terminated_async().await
{
info!(
"The persistent MCP service {mcp_id} child process ended abnormally and cleaned up resources."
);
if let Err(e) = proxy_manager.cleanup_resources(&mcp_id).await {
error!("Failed to cleanup resources for {}: {}", mcp_id, e);
}
}
}
McpType::OneShot => {
let idle_time = mcp_service_status.last_accessed.elapsed();
if idle_time > ONESHOT_TIMEOUT {
info!(
"OneShot service {} idle timeout (idle time: {} seconds), clean up resources",
mcp_id,
idle_time.as_secs()
);
if let Err(e) = proxy_manager.cleanup_resources(&mcp_id).await {
error!("Failed to cleanup resources for {}: {}", mcp_id, e);
}
continue;
}
if !matches!(
mcp_service_status.check_mcp_status_response_status,
CheckMcpStatusResponseStatus::Ready
) {
continue;
}
let handler = proxy_manager.get_proxy_handler(&mcp_id);
if let Some(handler) = handler
&& handler.is_terminated_async().await
{
debug!(
"OneShot service {} process exited (normal end state); \
kept until idle-timeout cleanup",
mcp_id
);
}
}
}
}
}