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,
96 static void mem_update_stats_fn (
void *data);
97 static 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,
121 static void mon_config_changed (
struct cs_fsm*
fsm, int32_t event,
void * data);
122 static void mon_resource_failed (
struct cs_fsm*
fsm, int32_t event,
void * data);
151 return (&mon_service_engine);
154 static const char * mon_res_state_to_str(
struct cs_fsm* fsm,
171 static const char * mon_res_event_to_str(
struct cs_fsm* fsm,
185 static 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)
216 static 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);
237 static 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;
315 void mon_resource_failed (
struct cs_fsm* fsm, int32_t event,
void * data)
322 static 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;
346 static void mem_update_stats_fn (
void *data)
353 new_value = percent_mem_used_get();
358 timestamp = cs_timestamp_get();
371 static 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;
388 static void load_update_stats_fn (
void *data)
393 double min15 = min15_loadavg_get();
399 timestamp = cs_timestamp_get();
413 static 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);
492 mon_key_changed_cb, inst, &icmap_track);
497 #ifdef HAVE_LIBSTATGRAB_GE_090
505 mon_instance_init (&memory_used_inst);
506 mon_instance_init (&load_15min_inst);