From: Krzysztof Opasiak Date: Wed, 31 May 2017 17:38:38 +0000 (+0200) Subject: Use bson instead of void * for passing action data X-Git-Tag: submit/tizen/20170622.101818~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F09%2F132009%2F7;p=platform%2Fcore%2Fsystem%2Ffaultd.git Use bson instead of void * for passing action data Change-Id: I43de8f7d1162a5f6824ca404add341b201bbf2e5 Signed-off-by: Krzysztof Opasiak --- diff --git a/src/action/service_recover.c b/src/action/service_recover.c index 8e73c7d..4292c9a 100644 --- a/src/action/service_recover.c +++ b/src/action/service_recover.c @@ -21,28 +21,36 @@ #include "decision_made_event.h" #include "log.h" #include "systemd_dbus.h" +#include "common.h" static int recover_service(struct faultd_action *action) { struct faultd_event *ev = nqueue_pop(&action->execution_queue, struct faultd_event, nq_node); struct decision_made_event *dm_ev = to_decision_made_event(ev); + char *service_path; int ret; + service_path = bson_get_string(&dm_ev->action_data, FAULTD_AD_SERVICE_NAME); + if (!service_path) { + log_error("Service path has not been provided"); + goto unref_old_event; + } + /* * TODO: * For now it's just copy paste of service restart * Add some real recovery action here */ - ret = faultd_dbus_call_systemd_simple((char *)dm_ev->action_data, + ret = faultd_dbus_call_systemd_simple(service_path, SYSTEMD_UNIT_INTERFACE, "Restart", "s", "replace"); if (ret < 0) - log_error_errno(ret, "Failed to restart service: %s", - (char *)dm_ev->action_data); + log_error_errno(ret, "Failed to restart service: %s", service_path); +unref_old_event: faultd_event_unref(ev); return 0; } diff --git a/src/action/service_restart.c b/src/action/service_restart.c index e387275..ba7bede 100644 --- a/src/action/service_restart.c +++ b/src/action/service_restart.c @@ -21,23 +21,31 @@ #include "decision_made_event.h" #include "log.h" #include "systemd_dbus.h" +#include "common.h" static int restart_service(struct faultd_action *action) { struct faultd_event *ev = nqueue_pop(&action->execution_queue, struct faultd_event, nq_node); struct decision_made_event *dm_ev = to_decision_made_event(ev); + char *service_path; int ret; - ret = faultd_dbus_call_systemd_simple((char *)dm_ev->action_data, + service_path = bson_get_string(&dm_ev->action_data, FAULTD_AD_SERVICE_NAME); + if (!service_path) { + log_error("Service path has not been provided"); + goto unref_old_event; + } + + ret = faultd_dbus_call_systemd_simple(service_path, SYSTEMD_UNIT_INTERFACE, "Restart", "s", "replace"); if (ret < 0) - log_error_errno(ret, "Failed to restart service: %s", - (char *)dm_ev->action_data); + log_error_errno(ret, "Failed to restart service: %s", service_path); +unref_old_event: faultd_event_unref(ev); return 0; } diff --git a/src/decision_makers/rv_dm.c b/src/decision_makers/rv_dm.c index 4e8a85c..4de21f8 100644 --- a/src/decision_makers/rv_dm.c +++ b/src/decision_makers/rv_dm.c @@ -51,43 +51,46 @@ static int rv_make_decision(struct faultd_event_handler *handler) .reason = ev, .who_made = MODULE_NAME, .action = FAULTD_ACTION_SERVICE_RESTART_ID, - .action_data_release = free, }; int ret; if (systemd_service_is_of_type(&rv_ev->service, FAULTD_SERVICE_TYPE_VIP)) { ev_data.action = FAULTD_ACTION_REBOOT_ID; - ev_data.action_data = NULL; + ret = bson_fill_for_reboot(&ev_data.action_data); } else { - ev_data.action_data = strdup(rv_ev->service.dbus_path); - if (!ev_data.action_data) { - log_error("Unable to duplicate service name"); - faultd_event_unref(ev); - return -ENOMEM; - } + ret = bson_fill_for_srv_restart(&ev_data.action_data, + rv_ev->service.dbus_path); + } + + if (ret) { + log_error("Unable to create action data"); + goto unref_old_event; } ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev); - faultd_event_unref(ev); if (ret) { log_error("Unable to create event"); - goto free_action_data; + goto del_action_data; } + faultd_event_unref(ev); + ret = event_processor_report_event(new_ev); if (ret) { log_error("Unable to report event"); - goto put_new_event; + goto unref_new_event; } return 0; -put_new_event: +unref_new_event: faultd_event_unref(new_ev); return 0; -free_action_data: - free(ev_data.action_data); +del_action_data: + bson_destroy(&ev_data.action_data); +unref_old_event: + faultd_event_unref(ev); return 0; } diff --git a/src/decision_makers/standard_fault_dm.c b/src/decision_makers/standard_fault_dm.c index fbde1f3..feb30e0 100644 --- a/src/decision_makers/standard_fault_dm.c +++ b/src/decision_makers/standard_fault_dm.c @@ -47,8 +47,6 @@ static int sf_make_decision(struct faultd_event_handler *handler) .reason = ev, .who_made = MODULE_NAME, .action = FAULTD_ACTION_SERVICE_RECOVER_ID, - .action_data = NULL, - .action_data_release = free, }; int ret; @@ -61,34 +59,38 @@ static int sf_make_decision(struct faultd_event_handler *handler) * recovering that service */ - ev_data.action_data = strdup(sf_ev->service.dbus_path); - if (!ev_data.action_data) { - log_error("Unable to duplicate service name"); - faultd_event_unref(ev); - return -ENOMEM; + ret = bson_fill_for_srv_recover(&ev_data.action_data, + sf_ev->service.dbus_path, + sf_ev->service.recovery_unit); + if (ret) { + log_error("Unable to create action data"); + goto unref_old_event; } ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev); - faultd_event_unref(ev); if (ret) { log_error("Unable to create event"); - goto free_action_data; + goto del_action_data; } + faultd_event_unref(ev); + ret = event_processor_report_event(new_ev); if (ret) { log_error("Unable to report event"); - goto put_new_event; + goto unref_new_event; } return 0; -put_new_event: +unref_new_event: faultd_event_unref(new_ev); return 0; -free_action_data: - free(ev_data.action_data); +del_action_data: + bson_destroy(&ev_data.action_data); +unref_old_event: + faultd_event_unref(ev); return 0; } diff --git a/src/decision_makers/vip_fault_dm.c b/src/decision_makers/vip_fault_dm.c index 14a38fb..5e8ea0d 100644 --- a/src/decision_makers/vip_fault_dm.c +++ b/src/decision_makers/vip_fault_dm.c @@ -46,30 +46,39 @@ static int vf_make_decision(struct faultd_event_handler *handler) .reason = ev, .who_made = MODULE_NAME, .action = FAULTD_ACTION_REBOOT_ID, - .action_data = NULL, - .action_data_release = free, }; int ret; + ret = bson_fill_for_reboot(&ev_data.action_data); + if (ret) + goto unref_old_event; + ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev); - faultd_event_unref(ev); if (ret) { log_error("Unable to create event"); - goto out; + goto del_action_data; } + faultd_event_unref(ev); + ret = event_processor_report_event(new_ev); if (ret) { log_error("Unable to report event"); - goto put_new_event; + goto unref_new_event; } return 0; -put_new_event: +unref_new_event: faultd_event_unref(new_ev); -out: return 0; + +del_action_data: + bson_destroy(&ev_data.action_data); +unref_old_event: + faultd_event_unref(ev); + return 0; + } static struct faultd_event_handler vip_fault_event_handler = { diff --git a/src/event_types/decision_made_event.c b/src/event_types/decision_made_event.c index 0493368..6ae0cec 100644 --- a/src/event_types/decision_made_event.c +++ b/src/event_types/decision_made_event.c @@ -48,7 +48,6 @@ static int allocate_dm_event(struct faultd_event_type *type, } dm_ev->action_data = dm_ev_data->action_data; - dm_ev->action_data_release = dm_ev_data->action_data_release; dm_ev->reason = dm_ev_data->reason; faultd_event_ref(dm_ev->reason); @@ -73,8 +72,7 @@ static void dm_event_release(struct faultd_event *ev) free(dm_ev->who_made); free(dm_ev->action); - if (dm_ev->action_data_release) - dm_ev->action_data_release(dm_ev->action_data); + bson_destroy(&dm_ev->action_data); faultd_event_unref(dm_ev->reason); faultd_event_cleanup_internal(&dm_ev->event); free(dm_ev); @@ -107,8 +105,7 @@ static void dm_event_serialize(struct faultd_event *ev, bson *out) faultd_event_serialize_internal(ev, out); bson_append_string(out, DM_EV_WHO, dm_ev->who_made); bson_append_string(out, DM_EV_ACTION, dm_ev->action); - if (dm_ev->action_data != NULL) - bson_append_string(out, DM_EV_ACTION_DATA, (char*)dm_ev->action_data); /* FIXME */ + bson_append_bson(out, DM_EV_ACTION_DATA, &dm_ev->action_data); } static struct faultd_event_type decision_made_event_type = { diff --git a/src/event_types/decision_made_event.h b/src/event_types/decision_made_event.h index e32e8f3..9ab4377 100644 --- a/src/event_types/decision_made_event.h +++ b/src/event_types/decision_made_event.h @@ -20,6 +20,7 @@ #define FAULTD_DECISION_MADE_EVENT_H #include +#include #include "action.h" #include "event.h" @@ -35,8 +36,7 @@ struct decision_made_event { struct faultd_event *reason; char *who_made; char *action; - void *action_data; - void (*action_data_release)(void *); + bson action_data; /* TODO: what more do we need? */ }; @@ -46,9 +46,8 @@ struct dm_event_data { /* Strings are deep copied */ char *who_made; char *action; - /* Action data is shallow copied */ - void *action_data; - void (*action_data_release)(void *); + + bson action_data; }; #define to_decision_made_event(EVENT) \