58#define MON_DEFAULT_PERIOD 3000
59#define MON_MIN_PERIOD 500
60#define MON_MAX_PERIOD (120 * CS_TIME_MS_IN_SEC)
63 .
name =
"corosync resource monitoring service",
66 .private_data_size = 0,
71 .lib_engine_count = 0,
73 .exec_engine_count = 0,
75 .exec_init_fn = mon_exec_init_fn,
96static void mem_update_stats_fn (
void *data);
97static void load_update_stats_fn (
void *data);
100 .
name =
"memory_used",
101 .icmap_path =
"resources.system.memory_used.",
102 .update_stats_fn = mem_update_stats_fn,
104 .max.int32 = INT32_MAX,
109 .
name =
"load_15min",
110 .icmap_path =
"resources.system.load_15min.",
111 .update_stats_fn = load_update_stats_fn,
113 .max.dbl = INT32_MAX,
121static void mon_config_changed (
struct cs_fsm*
fsm, int32_t event,
void * data);
122static void mon_resource_failed (
struct cs_fsm*
fsm, int32_t event,
void * data);
154static const char * mon_res_state_to_str(
struct cs_fsm* fsm,
171static const char * mon_res_event_to_str(
struct cs_fsm* fsm,
185static void mon_fsm_cb (
struct cs_fsm *fsm,
int cb_event, int32_t curr_state,
186 int32_t next_state, int32_t fsm_event,
void *data)
216static void mon_fsm_state_set (
struct cs_fsm* fsm,
220 const char *state_str;
225 cs_fsm_state_set(fsm, next_state, inst, mon_fsm_cb);
230 state_str = mon_res_state_to_str(fsm, fsm->
curr_state);
237static void mon_config_changed (
struct cs_fsm* fsm, int32_t event,
void * data)
252 scanf_res = sscanf(tmp_str,
"%"PRIu64, &tmp_value);
253 if (scanf_res != 1) {
255 "Could NOT use poll_period: %s (not uint64 type) for resource %s",
256 tmp_str, inst->
name);
262 "poll_period changing from:%"PRIu64
" to %"PRIu64
".",
267 "Could NOT use poll_period:%"PRIu64
" ms for resource %s",
268 tmp_value, inst->
name);
283 if (sscanf(tmp_str,
"%"PRId32, &i32) != 1) {
293 if (sscanf(tmp_str,
"%lf", &
dbl) != 1) {
294 inst->
max.
dbl = INT32_MAX;
315void mon_resource_failed (
struct cs_fsm*
fsm, int32_t event,
void * data)
322static int32_t percent_mem_used_get(
void)
324 sg_mem_stats *mem_stats;
325 sg_swap_stats *swap_stats;
326 long long total, freemem;
328#ifdef HAVE_LIBSTATGRAB_GE_090
329 mem_stats = sg_get_mem_stats(NULL);
330 swap_stats = sg_get_swap_stats(NULL);
332 mem_stats = sg_get_mem_stats();
333 swap_stats = sg_get_swap_stats();
336 if (mem_stats == NULL || swap_stats == NULL) {
338 sg_str_error(sg_get_error()));
341 total = mem_stats->total + swap_stats->total;
342 freemem = mem_stats->free + swap_stats->free;
343 return ((total - freemem) * 100) / total;
346static void mem_update_stats_fn (
void *data)
353 new_value = percent_mem_used_get();
358 timestamp = cs_timestamp_get();
371static double min15_loadavg_get(
void)
373 sg_load_stats *load_stats;
375#ifdef HAVE_LIBSTATGRAB_GE_090
376 load_stats = sg_get_load_stats (NULL);
378 load_stats = sg_get_load_stats ();
380 if (load_stats == NULL) {
382 sg_str_error (sg_get_error()));
385 return load_stats->min15;
388static void load_update_stats_fn (
void *data)
393 double min15 = min15_loadavg_get();
399 timestamp = cs_timestamp_get();
413static void mon_key_changed_cb (
415 const char *key_name,
425 "resource \"%s\" deleted from cmap!",
432 last_key_part = strrchr(key_name,
'.');
433 if (last_key_part == NULL)
437 if (strcmp(last_key_part,
"max") == 0 ||
438 strcmp(last_key_part,
"poll_period") == 0) {
475 sscanf(tmp_str,
"%"PRIu64, &tmp_value) != 1) {
483 "Could NOT use poll_period:%"PRIu64
" ms for resource %s",
484 tmp_value, inst->
name);
497#ifdef HAVE_LIBSTATGRAB_GE_090
505 mon_instance_init (&memory_used_inst);
506 mon_instance_init (&load_15min_inst);
qb_loop_timer_handle corosync_timer_handle_t
corosync_timer_handle_t
@ CS_LIB_FLOW_CONTROL_NOT_REQUIRED
#define MILLI_2_NANO_SECONDS
QB_LIST_DECLARE(cpg_pd_list_head)
#define corosync_exit_error(err)
@ COROSYNC_DONE_FATAL_ERR
#define CS_FSM_CB_EVENT_PROCESS_NF
#define CS_FSM_CB_EVENT_STATE_SET
#define CS_FSM_CB_EVENT_STATE_SET_NF
#define ICMAP_TRACK_MODIFY
cs_error_t icmap_set_int32(const char *key_name, int32_t value)
icmap_value_types_t
Possible types of value.
#define ICMAP_TRACK_DELETE
cs_error_t icmap_track_add(const char *key_name, int32_t track_type, icmap_notify_fn_t notify_fn, void *user_data, icmap_track_t *icmap_track)
Add tracking function for given key_name.
cs_error_t icmap_set_string(const char *key_name, const char *value)
#define ICMAP_TRACK_PREFIX
Whole prefix is tracked, instead of key only (so "totem." tracking means that "totem....
cs_error_t icmap_set_double(const char *key_name, double value)
cs_error_t icmap_set_uint64(const char *key_name, uint64_t value)
#define ICMAP_KEYNAME_MAXLEN
Maximum length of key in icmap.
cs_error_t icmap_set_uint32(const char *key_name, uint32_t value)
cs_error_t icmap_get_string(const char *key_name, char **str)
Shortcut for icmap_get for string type.
#define LOGSYS_LEVEL_ERROR
#define log_printf(level, format, args...)
#define LOGSYS_LEVEL_INFO
#define LOGSYS_LEVEL_CRIT
#define LOGSYS_LEVEL_WARNING
#define LOGSYS_LEVEL_DEBUG
#define MON_DEFAULT_PERIOD
struct cs_fsm_entry mon_fsm_table[]
struct corosync_service_engine * mon_get_service_engine_ver0(void)
struct corosync_service_engine mon_service_engine
const char * mon_failed_str
const char * mon_stopped_str
const char * mon_failure_str
LOGSYS_DECLARE_SUBSYS("MON")
const char * mon_config_changed_str
const char * mon_running_str
The corosync_api_v1 struct.
int(* timer_add_duration)(unsigned long long nanoseconds_in_future, void *data, void(*timer_nf)(void *data), corosync_timer_handle_t *handle)
void(* timer_delete)(corosync_timer_handle_t timer_handle)
The corosync_service_engine struct.
cs_fsm_state_to_str_fn state_to_str
struct cs_fsm_entry * table
cs_fsm_event_to_str_fn event_to_str
Structure passed as new_value and old_value in change callback.
corosync_timer_handle_t timer_handle
icmap_value_types_t max_type
union resource_instance::@9 max
void(* update_stats_fn)(void *data)