use crate::error::{PluginManagerError, PluginManagerResult};
use crate::status::PluginStatus;
use crate::manager::types::PluginMap;
use crate::manager::loader::load_plugin;
use crate::manager::query::find_plugin_file_by_id;
use crate::manager::validation::sanitize_plugin_name;
use crate::manager::load_ops::{insert_plugin_instance, insert_child_plugin};
use tokio::time::{timeout, Duration};
use tracing::{debug, error, info, trace, warn};
pub async fn get_reload_info(
plugins: PluginMap,
plugin_id: &str,
) -> PluginManagerResult<(String, bool)> {
trace!("获取插件重载信息: {}", plugin_id);
let plugins = plugins.read().await;
let plugin_instance = plugins.get(plugin_id)
.ok_or_else(|| {
error!("插件不存在: {}", plugin_id);
PluginManagerError::not_found(plugin_id)
})?;
let plugin_name = plugin_instance.metadata.name.clone();
let was_running = plugin_instance.status == PluginStatus::Running;
debug!("插件重载信息 - 名称: {}, 运行状态: {}", plugin_name, was_running);
Ok((plugin_name, was_running))
}
pub async fn call_reload_hook(
plugins: PluginMap,
plugin_id: &str,
timeout_secs: u64,
) {
trace!("调用插件重载钩子: {} (超时: {}s)", plugin_id, timeout_secs);
info!("调用插件重载钩子: {}", plugin_id);
let mut plugins = plugins.write().await;
if let Some(plugin_instance) = plugins.get_mut(plugin_id) {
debug!("找到插件实例: {} (状态: {:?})",
plugin_instance.metadata.name, plugin_instance.status);
if plugin_instance.status == PluginStatus::Running {
trace!("插件处于运行状态,调用 on_reload 钩子");
let reload_result = timeout(
Duration::from_secs(timeout_secs),
plugin_instance.plugin.on_reload()
).await;
match reload_result {
Ok(Ok(_)) => {
info!("插件重载钩子执行成功: {}", plugin_id);
trace!("重载钩子执行完成");
}
Ok(Err(e)) => {
warn!("插件重载钩子执行失败 {}: {},但插件已成功重载", plugin_id, e);
}
Err(_) => {
warn!("插件重载钩子执行超时 {} (超时时间: {}s),但插件已成功重载", plugin_id, timeout_secs);
}
}
} else {
debug!("插件 {} 未运行,跳过重载钩子", plugin_id);
}
} else {
warn!("插件 {} 不存在,无法调用重载钩子", plugin_id);
}
}