From d5b532f674a7b106bf0b2641fc611c75cc626f2b Mon Sep 17 00:00:00 2001 From: Jan Friesse Date: Wed, 14 Dec 2011 16:21:33 +0100 Subject: [PATCH] Move mon service to use icmap Signed-off-by: Jan Friesse Reviewed-by: Steven Dake --- services/mon.c | 280 +++++++++++++++++-------------------------------- 1 file changed, 94 insertions(+), 186 deletions(-) diff --git a/services/mon.c b/services/mon.c index 6c068f6d..15d32b5b 100644 --- a/services/mon.c +++ b/services/mon.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "../exec/fsm.h" @@ -57,7 +58,6 @@ static int mon_exec_init_fn ( struct corosync_api_v1 *corosync_api); static struct corosync_api_v1 *api; -static hdb_handle_t resources_obj; #define MON_DEFAULT_PERIOD 3000 #define MON_MIN_PERIOD 500 #define MON_MAX_PERIOD (120 * CS_TIME_MS_IN_SEC) @@ -84,13 +84,13 @@ static DECLARE_LIST_INIT (confchg_notify); struct resource_instance { - hdb_handle_t handle; + const char *icmap_path; const char *name; corosync_timer_handle_t timer_handle; void (*update_stats_fn) (void *data); struct cs_fsm fsm; uint64_t period; - objdb_value_types_t max_type; + icmap_value_types_t max_type; union { int32_t int32; double dbl; @@ -102,16 +102,18 @@ static void load_update_stats_fn (void *data); static struct resource_instance memory_used_inst = { .name = "memory_used", + .icmap_path = "resources.system.memory_used.", .update_stats_fn = mem_update_stats_fn, - .max_type = OBJDB_VALUETYPE_INT32, + .max_type = ICMAP_VALUETYPE_INT32, .max.int32 = INT32_MAX, .period = MON_DEFAULT_PERIOD, }; static struct resource_instance load_15min_inst = { .name = "load_15min", + .icmap_path = "resources.system.load_15min.", .update_stats_fn = load_update_stats_fn, - .max_type = OBJDB_VALUETYPE_DOUBLE, + .max_type = ICMAP_VALUETYPE_DOUBLE, .max.dbl = INT32_MAX, .period = MON_DEFAULT_PERIOD, }; @@ -225,29 +227,12 @@ static const char * mon_res_event_to_str(struct cs_fsm* fsm, return NULL; } -static cs_error_t str_to_uint64_t(const char* str, uint64_t *out_value, uint64_t min, uint64_t max) -{ - char *endptr; - - errno = 0; - *out_value = strtol(str, &endptr, 0); - - /* Check for various possible errors */ - if (errno != 0 || endptr == str) { - return CS_ERR_INVALID_PARAM; - } - - if (*out_value > max || *out_value < min) { - return CS_ERR_INVALID_PARAM; - } - return CS_OK; -} - static void mon_fsm_state_set (struct cs_fsm* fsm, enum mon_resource_state next_state, struct resource_instance* inst) { enum mon_resource_state prev_state = fsm->curr_state; const char *state_str; + char key_name[ICMAP_KEYNAME_MAXLEN]; ENTER(); @@ -258,40 +243,31 @@ static void mon_fsm_state_set (struct cs_fsm* fsm, } state_str = mon_res_state_to_str(fsm, fsm->curr_state); - api->object_key_replace (inst->handle, - "state", strlen ("state"), - state_str, strlen (state_str)); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "state"); + icmap_set_string(key_name, state_str); } static void mon_config_changed (struct cs_fsm* fsm, int32_t event, void * data) { struct resource_instance * inst = (struct resource_instance *)data; - char *str; - size_t str_len; - objdb_value_types_t type; uint64_t tmp_value; - int32_t res; - char str_copy[256]; + char key_name[ICMAP_KEYNAME_MAXLEN]; + int run_updater; ENTER(); - res = api->object_key_get_typed (inst->handle, - "poll_period", - (void**)&str, &str_len, - &type); - if (res == 0) { - memcpy(str_copy, str, str_len); - str_copy[str_len] = '\0'; - if (str_to_uint64_t(str_copy, &tmp_value, MON_MIN_PERIOD, MON_MAX_PERIOD) == CS_OK) { + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "poll_period"); + if (icmap_get_uint64(key_name, &tmp_value) == CS_OK) { + if (tmp_value >= MON_MIN_PERIOD && tmp_value <= MON_MAX_PERIOD) { log_printf (LOGSYS_LEVEL_DEBUG, "poll_period changing from:%"PRIu64" to %"PRIu64".", inst->period, tmp_value); inst->period = tmp_value; } else { log_printf (LOGSYS_LEVEL_WARNING, - "Could NOT use poll_period:%s ms for resource %s", - str, inst->name); + "Could NOT use poll_period:%"PRIu64" ms for resource %s", + tmp_value, inst->name); } } @@ -299,23 +275,30 @@ static void mon_config_changed (struct cs_fsm* fsm, int32_t event, void * data) api->timer_delete(inst->timer_handle); inst->timer_handle = 0; } - res = api->object_key_get_typed (inst->handle, "max", - (void**)&str, &str_len, &type); - if (res != 0) { - if (inst->max_type == OBJDB_VALUETYPE_INT32) { + + run_updater = 0; + + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "max"); + if (inst->max_type == ICMAP_VALUETYPE_INT32) { + if (icmap_get_int32(key_name, &inst->max.int32) != CS_OK) { inst->max.int32 = INT32_MAX; - } else - if (inst->max_type == OBJDB_VALUETYPE_DOUBLE) { - inst->max.dbl = INT32_MAX; + + mon_fsm_state_set (fsm, MON_S_STOPPED, inst); + } else { + run_updater = 1; } - mon_fsm_state_set (fsm, MON_S_STOPPED, inst); - } else { - if (inst->max_type == OBJDB_VALUETYPE_INT32) { - inst->max.int32 = strtol (str, NULL, 0); - } else - if (inst->max_type == OBJDB_VALUETYPE_DOUBLE) { - inst->max.dbl = strtod (str, NULL); + } + if (inst->max_type == ICMAP_VALUETYPE_DOUBLE) { + if (icmap_get_double(key_name, &inst->max.dbl) != CS_OK) { + inst->max.dbl = INT32_MAX; + + mon_fsm_state_set (fsm, MON_S_STOPPED, inst); + } else { + run_updater = 1; } + } + + if (run_updater) { mon_fsm_state_set (fsm, MON_S_RUNNING, inst); /* * run the updater, incase the period has shortened @@ -394,18 +377,18 @@ static void mem_update_stats_fn (void *data) struct resource_instance * inst = (struct resource_instance *)data; int32_t new_value; uint64_t timestamp; + char key_name[ICMAP_KEYNAME_MAXLEN]; new_value = percent_mem_used_get(); + fprintf(stderr,"BLA = %u\n", new_value); if (new_value > 0) { - api->object_key_replace (inst->handle, - "current", strlen("current"), - &new_value, sizeof(new_value)); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "current"); + icmap_set_uint32(key_name, new_value); timestamp = cs_timestamp_get(); - api->object_key_replace (inst->handle, - "last_updated", strlen("last_updated"), - ×tamp, sizeof(uint64_t)); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "last_updated"); + icmap_set_uint64(key_name, timestamp); if (new_value > inst->max.int32 && inst->fsm.curr_state != MON_S_FAILED) { cs_fsm_process (&inst->fsm, MON_E_FAILURE, inst); @@ -443,24 +426,18 @@ static void load_update_stats_fn (void *data) { struct resource_instance * inst = (struct resource_instance *)data; uint64_t timestamp; - int32_t res = 0; + char key_name[ICMAP_KEYNAME_MAXLEN]; double min15 = min15_loadavg_get(); if (min15 > 0) { - res = api->object_key_replace (inst->handle, - "current", strlen("current"), - &min15, sizeof (min15)); - if (res != 0) { - log_printf (LOGSYS_LEVEL_ERROR, "replace current failed: %d", res); - } + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "current"); + icmap_set_double(key_name, min15); + timestamp = cs_timestamp_get(); - res = api->object_key_replace (inst->handle, - "last_updated", strlen("last_updated"), - ×tamp, sizeof(uint64_t)); - if (res != 0) { - log_printf (LOGSYS_LEVEL_ERROR, "replace last_updated failed: %d", res); - } + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "last_updated"); + icmap_set_uint64(key_name, timestamp); + if (min15 > inst->max.dbl && inst->fsm.curr_state != MON_S_FAILED) { cs_fsm_process (&inst->fsm, MON_E_FAILURE, &inst); } @@ -470,104 +447,56 @@ static void load_update_stats_fn (void *data) inst, inst->update_stats_fn, &inst->timer_handle); } -static int object_find_or_create ( - hdb_handle_t parent_object_handle, - hdb_handle_t *object_handle, - const void *object_name, - size_t object_name_len) -{ - hdb_handle_t obj_finder; - hdb_handle_t obj; - int ret = -1; - - api->object_find_create ( - parent_object_handle, - object_name, - object_name_len, - &obj_finder); - - if (api->object_find_next (obj_finder, &obj) == 0) { - /* found it */ - *object_handle = obj; - ret = 0; - } - else { - ret = api->object_create (parent_object_handle, - object_handle, - object_name, object_name_len); - } - - api->object_find_destroy (obj_finder); - return ret; -} - -static void mon_object_destroyed( - hdb_handle_t parent_object_handle, - const void *name_pt, size_t name_len, - void *priv_data_pt) +static void mon_key_changed_cb ( + int32_t event, + const char *key_name, + struct icmap_notify_value new_value, + struct icmap_notify_value old_value, + void *user_data) { - struct resource_instance* inst = (struct resource_instance*)priv_data_pt; + struct resource_instance* inst = (struct resource_instance*)user_data; + char *last_key_part; - if (inst) { + if (event == ICMAP_TRACK_DELETE && inst) { log_printf (LOGSYS_LEVEL_WARNING, - "resource \"%s\" deleted from objdb!", + "resource \"%s\" deleted from cmap!", inst->name); cs_fsm_process (&inst->fsm, MON_E_CONFIG_CHANGED, inst); } -} - -static void mon_key_change_notify (object_change_type_t change_type, - hdb_handle_t parent_object_handle, - hdb_handle_t object_handle, - const void *object_name_pt, size_t object_name_len, - const void *key_name_pt, size_t key_len, - const void *key_value_pt, size_t key_value_len, - void *priv_data_pt) -{ - struct resource_instance* inst = (struct resource_instance*)priv_data_pt; + if (event == ICMAP_TRACK_MODIFY) { + last_key_part = strrchr(key_name, '.'); + if (last_key_part == NULL) + return ; - if ((strncmp ((char*)key_name_pt, "max", key_len) == 0) || - (strncmp ((char*)key_name_pt, "poll_period", key_len) == 0)) { - ENTER(); - cs_fsm_process (&inst->fsm, MON_E_CONFIG_CHANGED, inst); + last_key_part++; + if (strcmp(last_key_part, "max") == 0 || + strcmp(last_key_part, "poll_period") == 0) { + ENTER(); + cs_fsm_process (&inst->fsm, MON_E_CONFIG_CHANGED, inst); + } } } -static void mon_instance_init (hdb_handle_t parent, struct resource_instance* inst) +static void mon_instance_init (struct resource_instance* inst) { - int32_t res; - char mon_period_str[32]; - char *str; - size_t mon_period_len; - objdb_value_types_t mon_period_type; uint64_t tmp_value; - int32_t zero_32 = 0; - time_t zero_64 = 0; - double zero_double = 0; - - object_find_or_create (parent, - &inst->handle, - inst->name, strlen (inst->name)); - - if (inst->max_type == OBJDB_VALUETYPE_INT32) { - api->object_key_create_typed (inst->handle, - "current", &zero_32, - sizeof (zero_32), inst->max_type); + char key_name[ICMAP_KEYNAME_MAXLEN]; + icmap_track_t icmap_track; + + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "current"); + if (inst->max_type == ICMAP_VALUETYPE_INT32) { + icmap_set_int32(key_name, 0); } else { - api->object_key_create_typed (inst->handle, - "current", &zero_double, - sizeof (zero_double), inst->max_type); + icmap_set_double(key_name, 0); } - api->object_key_create_typed (inst->handle, - "last_updated", &zero_64, - sizeof (uint64_t), OBJDB_VALUETYPE_UINT64); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "last_updated"); + icmap_set_uint64(key_name, 0); - api->object_key_create_typed (inst->handle, - "state", mon_stopped_str, strlen (mon_stopped_str), - OBJDB_VALUETYPE_STRING); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "state"); + icmap_set_string(key_name, mon_stopped_str); inst->fsm.name = inst->name; inst->fsm.curr_entry = 0; @@ -577,40 +506,29 @@ static void mon_instance_init (hdb_handle_t parent, struct resource_instance* in inst->fsm.state_to_str = mon_res_state_to_str; inst->fsm.event_to_str = mon_res_event_to_str; - res = api->object_key_get_typed (inst->handle, - "poll_period", - (void**)&str, &mon_period_len, - &mon_period_type); - if (res != 0) { - mon_period_len = snprintf (mon_period_str, 32, "%"PRIu64"", - inst->period); - api->object_key_create_typed (inst->handle, - "poll_period", &mon_period_str, - mon_period_len, - OBJDB_VALUETYPE_STRING); + snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "%s%s", inst->icmap_path, "poll_period"); + if (icmap_get_uint64(key_name, &tmp_value) != CS_OK) { + icmap_set_uint64(key_name, inst->period); } else { - if (str_to_uint64_t(str, &tmp_value, MON_MIN_PERIOD, MON_MAX_PERIOD) == CS_OK) { + if (tmp_value >= MON_MIN_PERIOD && tmp_value <= MON_MAX_PERIOD) { inst->period = tmp_value; } else { log_printf (LOGSYS_LEVEL_WARNING, - "Could NOT use poll_period:%s ms for resource %s", - str, inst->name); + "Could NOT use poll_period:%"PRIu64" ms for resource %s", + tmp_value, inst->name); } } cs_fsm_process (&inst->fsm, MON_E_CONFIG_CHANGED, inst); - api->object_track_start (inst->handle, OBJECT_TRACK_DEPTH_RECURSIVE, - mon_key_change_notify, - NULL, mon_object_destroyed, NULL, inst); - + icmap_track_add(inst->icmap_path, + ICMAP_TRACK_ADD | ICMAP_TRACK_MODIFY | ICMAP_TRACK_DELETE | ICMAP_TRACK_PREFIX, + mon_key_changed_cb, inst, &icmap_track); } static int mon_exec_init_fn ( struct corosync_api_v1 *corosync_api) { - hdb_handle_t obj; - hdb_handle_t parent; #ifdef HAVE_LIBSTATGRAB sg_init(); @@ -621,18 +539,8 @@ static int mon_exec_init_fn ( #endif api = corosync_api; - object_find_or_create (OBJECT_PARENT_HANDLE, - &resources_obj, - "resources", strlen ("resources")); - - object_find_or_create (resources_obj, - &obj, - "system", strlen ("system")); - - parent = obj; - - mon_instance_init (parent, &memory_used_inst); - mon_instance_init (parent, &load_15min_inst); + mon_instance_init (&memory_used_inst); + mon_instance_init (&load_15min_inst); return 0; } -- 2.39.5