From 7390d24fabb38f8c463e9a05a96b258c490d4652 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Fri, 8 Mar 2024 11:27:59 +0800 Subject: [PATCH] fix(core): eliminate NEU_REQ_ADD_DRIVERS request data race --- src/core/manager_internal.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/core/manager_internal.c b/src/core/manager_internal.c index 31672bd5..3e10dc15 100644 --- a/src/core/manager_internal.c +++ b/src/core/manager_internal.c @@ -460,6 +460,7 @@ static inline int add_driver(neu_manager_t *manager, neu_req_driver_t *driver) if (0 != neu_adapter_validate_gtags(adapter, &cmd, &resp) || 0 != neu_adapter_try_add_gtags(adapter, &cmd, &resp) || 0 != neu_adapter_add_gtags(adapter, &cmd, &resp)) { + neu_adapter_uninit(adapter); neu_manager_del_node(manager, driver->node); } @@ -498,11 +499,21 @@ int neu_manager_add_drivers(neu_manager_t *manager, neu_req_driver_array_t *req) for (uint16_t i = 0; i < req->n_driver; ++i) { ret = add_driver(manager, &req->drivers[i]); if (0 != ret) { + nlog_notice("add i:%" PRIu16 " driver:%s fail", i, + req->drivers[i].node); while (i-- > 0) { + nlog_notice("rollback i:%" PRIu16 " driver:%s", i, + req->drivers[i].node); + neu_adapter_t *adapter = neu_node_manager_find( + manager->node_manager, req->drivers[i].node); + neu_adapter_uninit(adapter); neu_manager_del_node(manager, req->drivers[i].node); } + nlog_error("fail to add %" PRIu16 " drivers", req->n_driver); break; } + nlog_notice("add i:%" PRIu16 " driver:%s success", i, + req->drivers[i].node); } return ret;