use crate::error::{PluginManagerError, PluginManagerResult};
use crate::status::PluginStatus;
use crate::manager::types::{PluginInstance, PluginMap};
use crate::manager::lifecycle_ops::stop_single_plugin;
use tracing::{debug, error, info, trace, warn};
pub async fn stop_all_plugins(
plugins: PluginMap,
timeout_secs: u64,
) -> PluginManagerResult<()> {
trace!("开始批量停止插件,超时时间: {}s", timeout_secs);
info!("开始停止插件...");
let stop_order = {
trace!("获取读锁,查找需要停止的插件");
let plugins = plugins.read().await;
let mut child_ids = Vec::new();
let mut parent_ids = Vec::new();
for (id, instance) in plugins.iter() {
if instance.status == PluginStatus::Running {
if instance.metadata.is_sub_plugin {
trace!("发现需要停止的子插件: {}", id);
child_ids.push(id.to_string());
} else {
trace!("发现需要停止的主插件: {}", id);
parent_ids.push(id.to_string());
}
}
}
let parent_count = parent_ids.len();
child_ids.extend(parent_ids);
debug!("需要停止的插件: {} 个子插件, {} 个主插件",
child_ids.len() - parent_count, parent_count);
child_ids
};
for plugin_id in stop_order {
trace!("停止插件: {}", plugin_id);
let mut plugins = plugins.write().await;
if let Some(plugin_instance) = plugins.get_mut(&plugin_id) {
stop_single_plugin(plugin_id, plugin_instance, timeout_secs).await;
}
}
info!("插件停止完成");
trace!("批量停止插件流程完成");
Ok(())
}
pub async fn stop_plugin(
plugins: PluginMap,
plugin_id: &str,
timeout_secs: u64,
) -> PluginManagerResult<()> {
trace!("开始停止单个插件: {} (超时: {}s)", plugin_id, timeout_secs);
let mut plugins = plugins.write().await;
let plugin_instance = plugins.get_mut(plugin_id)
.ok_or_else(|| {
error!("插件不存在: {}", plugin_id);
PluginManagerError::not_found(plugin_id)
})?;
debug!("找到插件实例: {} (状态: {:?})",
plugin_instance.metadata.name, plugin_instance.status);
stop_single_plugin(plugin_id.to_string(), plugin_instance, timeout_secs).await;
if let Some(instance) = plugins.get(plugin_id) {
if let PluginStatus::Error(err) = &instance.status {
error!("插件停止失败: {} - {}", plugin_id, err);
return Err(PluginManagerError::StopFailed(err.clone()));
}
}
trace!("插件停止流程完成");
Ok(())
}