#include <corosync/engine/coroapi.h>
#include <corosync/list.h>
#include <corosync/engine/logsys.h>
+#include <corosync/engine/icmap.h>
#include "../exec/fsm.h"
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)
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;
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,
};
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();
}
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);
}
}
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
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);
{
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);
}
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;
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();
#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;
}