|
|
@@ -45,6 +45,7 @@
|
|
|
#include <corosync/engine/coroapi.h>
|
|
|
#include <corosync/list.h>
|
|
|
#include <corosync/engine/logsys.h>
|
|
|
+#include <corosync/engine/icmap.h>
|
|
|
#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;
|
|
|
}
|