Use bson instead of void * for passing action data 09/132009/7
authorKrzysztof Opasiak <k.opasiak@samsung.com>
Wed, 31 May 2017 17:38:38 +0000 (19:38 +0200)
committerKrzysztof Opasiak <k.opasiak@samsung.com>
Mon, 5 Jun 2017 17:05:46 +0000 (19:05 +0200)
Change-Id: I43de8f7d1162a5f6824ca404add341b201bbf2e5
Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
src/action/service_recover.c
src/action/service_restart.c
src/decision_makers/rv_dm.c
src/decision_makers/standard_fault_dm.c
src/decision_makers/vip_fault_dm.c
src/event_types/decision_made_event.c
src/event_types/decision_made_event.h

index 8e73c7de1d3ebc6d0180360d3c6e4bbc6b9df4ed..4292c9a521943e0dbef33d8627d631e46f001ea1 100644 (file)
 #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;
 }
index e387275dedaea11197e63e44f7e05a873da43b21..ba7bedef98de41b579f22b1ef851ca24e8f7e739 100644 (file)
 #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;
 }
index 4e8a85c95c5a477ada68d75997a851f0d61e8e55..4de21f857c5b8507c598be3c729c0ac186f0917b 100644 (file)
@@ -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;
 }
 
index fbde1f36e8a83bd258662e9b38668a2bfe3445c0..feb30e03e804243268e59e5d73bec30ed8383463 100644 (file)
@@ -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;
 }
 
index 14a38fb3f66fd902590b6f1200a0beae02035469..5e8ea0d79770c07aa26b8c25cd36718dac6c5e7a 100644 (file)
@@ -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 = {
index 04933689a174e0889a86e88fad604b2ac521a5a4..6ae0cec47762b9672883d198a4bfdbfc7d07d930 100644 (file)
@@ -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 = {
index e32e8f327b629691422fd43eae44f6ac3bf0831c..9ab437718eb43f8062d95b4d488abccd37836c10 100644 (file)
@@ -20,6 +20,7 @@
 #define FAULTD_DECISION_MADE_EVENT_H
 
 #include <time.h>
+#include <ejdb/bson.h>
 
 #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)                                          \