From 918ef95a2e5f9de71efa55beee35eaa083c31b7d Mon Sep 17 00:00:00 2001 From: fly_1997 Date: Thu, 13 Jun 2024 16:28:19 +0800 Subject: [PATCH 2/2] fix dependency error and add enable failed logs --- src/plugin_mgr/dep_handler.cpp | 22 +++++++++++++--------- src/plugin_mgr/instance_run_handler.h | 2 ++ src/plugin_mgr/plugin_manager.cpp | 17 ++++++++++++----- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/plugin_mgr/dep_handler.cpp b/src/plugin_mgr/dep_handler.cpp index 227ee2f..2b20e7e 100644 --- a/src/plugin_mgr/dep_handler.cpp +++ b/src/plugin_mgr/dep_handler.cpp @@ -28,22 +28,26 @@ void DepHandler::add_arc_node(std::shared_ptr node, const std::vector arc_head = node->head; node->cnt = dep_nodes.size(); int real_cnt = 0; + bool state = true; for (auto name : dep_nodes) { std::string from = node->instance->get_name(); std::shared_ptr tmp = std::make_shared(from, name); tmp->next = arc_head->next; arc_head->next = tmp; - + tmp->init = true; if (nodes.count(name)) { tmp->is_exist = true; - tmp->init = true; real_cnt++; + if (!nodes[name]->instance->get_state()) { + state = false; + } } in_edges[name].insert(from); arc_nodes[std::make_pair(from, name)] = tmp; } + /* node->instance->state = true, only all dependencies meet the conditions. */ if (real_cnt == node->cnt) { - node->instance->set_state(true); + node->instance->set_state(state); } node->real_cnt = real_cnt; } @@ -115,18 +119,17 @@ void DepHandler::del_node_and_arc_nodes(std::shared_ptr node) { } void DepHandler::update_instance_state(const std::string &name) { - if (!nodes[name]->instance->get_state() || !in_edges.count(name)) return; + if (!in_edges.count(name)) return; std::unordered_set &arcs = in_edges[name]; for (auto &from : arcs) { auto arc_node = arc_nodes[std::make_pair(from, name)]; if (nodes.count(from)) { auto tmp = nodes[from]; tmp->real_cnt++; - if (tmp->real_cnt == tmp->cnt) { + if (tmp->real_cnt == tmp->cnt && nodes[name]->instance->get_state()) { tmp->instance->set_state(true); } arc_node->is_exist = true; - arc_node->init = true; update_instance_state(tmp->instance->get_name()); } } @@ -144,8 +147,9 @@ void DepHandler::query_node_top(const std::string &name, std::vector{name}); return; } - while (arc_node->next != nullptr) { - if (arc_node->next->is_exist) { + while (arc_node->next != nullptr) { + /* Display the edges that exist and the points that do not. */ + if (arc_node->next->is_exist || !nodes.count(arc_node->next->to)) { query.emplace_back(std::vector{name, arc_node->next->to}); } arc_node = arc_node->next; @@ -164,7 +168,7 @@ void DepHandler::query_node_dependency(const std::string &name, std::vectorinstance->get_name(); query.emplace_back(std::vector{node_name}); for (auto cur = node->head->next; cur != nullptr; cur = cur->next) { - if (cur->is_exist) { + if (cur->is_exist || !nodes.count(cur->to)) { query.emplace_back(std::vector{node_name, cur->to}); } if (!vis.count(cur->to) && nodes.count(cur->to)) { diff --git a/src/plugin_mgr/instance_run_handler.h b/src/plugin_mgr/instance_run_handler.h index 682510b..3804a49 100644 --- a/src/plugin_mgr/instance_run_handler.h +++ b/src/plugin_mgr/instance_run_handler.h @@ -19,8 +19,10 @@ #include enum class RunType { + /* Message from PluginManager. */ ENABLED, DISABLED, + /* Message from internal. */ INTERNAL_ENABLED, INTERNAL_DISABLED, }; diff --git a/src/plugin_mgr/plugin_manager.cpp b/src/plugin_mgr/plugin_manager.cpp index 7220f48..c3ff8bf 100644 --- a/src/plugin_mgr/plugin_manager.cpp +++ b/src/plugin_mgr/plugin_manager.cpp @@ -290,16 +290,23 @@ void PluginManager::pre_enable() { if (item.get_enabled()) { std::shared_ptr plugin = memory_store.get_plugin(plugin_name); for (size_t j = 0; j < plugin->get_instance_len(); ++j) { - instance_enabled(plugin->get_instance(j)->get_name()); + std::string name = plugin->get_instance(j)->get_name(); + auto ret = instance_enabled(name); + if (ret != ErrorCode::OK) { + WARN("[PluginManager] " << name << " instance pre-enabled failed, because " << ErrorText::get_error_text(ret) << "."); + } else { + INFO("[PluginManager] " << name << " instance pre-enabled."); + } } } else { for (size_t j = 0; j < item.get_instance_size(); ++j) { std::string name = item.get_instance_name(j); - if (!memory_store.is_instance_exist(name)) { - WARN("[PluginManager] instance " << name << " cannot be enabled, because it does not exist."); - continue; + auto ret = instance_enabled(name); + if (ret != ErrorCode::OK) { + WARN("[PluginManager] " << name << " instance pre-enabled failed, because " << ErrorText::get_error_text(ret) << "."); + } else { + INFO("[PluginManager] " << name << " instance pre-enabled."); } - instance_enabled(name); } } } -- 2.33.0