From 0d16ce491afd3d31c36aa4fa752d18c730e768ba Mon Sep 17 00:00:00 2001 From: Amin Ben Romdhane Date: Fri, 31 May 2024 12:43:46 +0200 Subject: [PATCH] B#14541: micro-services not getting re-registered if bbfdmd restarts --- bbfdmd/ubus/bbfdmd.c | 19 ++++++++++--------- libbbfdm-api/dmplugin.c | 14 +++++++++++--- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/bbfdmd/ubus/bbfdmd.c b/bbfdmd/ubus/bbfdmd.c index 5e64bbc5..7919698d 100644 --- a/bbfdmd/ubus/bbfdmd.c +++ b/bbfdmd/ubus/bbfdmd.c @@ -1786,6 +1786,8 @@ static int daemon_load_datamodel(struct bbfdm_context *daemon_ctx) return err; } +static struct ubus_event_handler add_event = { .cb = lookup_event_cb }; + int main(int argc, char **argv) { struct bbfdm_context bbfdm_ctx; @@ -1869,19 +1871,18 @@ int main(int argc, char **argv) if (is_micro_service == true) { // It's a micro-service instance char proc_name[32] = {0}; + // Create process name using service name and prefix "dm_" snprintf(proc_name, sizeof(proc_name), "dm_%s", bbfdm_ctx.config.service_name); - // Set process name based on microservice + + // Set process name for the current process prctl(PR_SET_NAME, proc_name, NULL, NULL, NULL); - bool is_registred = register_service(&bbfdm_ctx.ubus_ctx); - if (is_registred == false) { - // register for add event - struct ubus_event_handler add_event; + // Register the micro-service + register_service(&bbfdm_ctx.ubus_ctx); - memset(&add_event, 0, sizeof(struct ubus_event_handler)); - add_event.cb = lookup_event_cb; - ubus_register_event_handler(&bbfdm_ctx.ubus_ctx, &add_event, "ubus.object.add"); - } + // If the micro-service is not registered, listen for "ubus.object.add" event + // and register the micro-service using event handler for it + ubus_register_event_handler(&bbfdm_ctx.ubus_ctx, &add_event, "ubus.object.add"); } INFO("Waiting on uloop...."); diff --git a/libbbfdm-api/dmplugin.c b/libbbfdm-api/dmplugin.c index a30b0d9e..669a3b6f 100644 --- a/libbbfdm-api/dmplugin.c +++ b/libbbfdm-api/dmplugin.c @@ -101,14 +101,22 @@ void free_services_from_list(struct list_head *clist) bool load_service(DMOBJ *main_dm, struct list_head *srv_list, char *srv_name, char *srv_parent_dm, char *srv_obj) { - if (!main_dm || !srv_list || !srv_name || !srv_parent_dm || !srv_obj) + if (!main_dm || !srv_list || !srv_name || !srv_parent_dm || !srv_obj) { + BBF_ERR("Invalid arguments: main_dm, srv_list, srv_name, srv_parent_dm, and srv_obj must not be NULL."); return false; + } - if (is_service_registered(srv_list, srv_name, srv_parent_dm, srv_obj)) + if (is_service_registered(srv_list, srv_name, srv_parent_dm, srv_obj)) { + BBF_ERR("Service registration failed: Service '%s' with parent DM '%s' and object '%s' is already registered.", + srv_name, srv_parent_dm, srv_obj); return false; + } - if (!add_service_to_main_tree(main_dm, srv_name, srv_parent_dm, srv_obj)) + if (!add_service_to_main_tree(main_dm, srv_name, srv_parent_dm, srv_obj)) { + BBF_ERR("Failed to add service '%s' to main tree with parent DM '%s' and object '%s'.", + srv_name, srv_parent_dm, srv_obj); return false; + } add_service_to_list(srv_list, srv_name, srv_parent_dm, srv_obj); return true;