47#include <qb/qbipc_common.h>
68#define MAX_SCHEDMISS_EVENTS 10
70static unsigned int highest_schedmiss_event;
72#define SCHEDMISS_PREFIX "stats.schedmiss"
209#define NUM_PG_STATS (sizeof(cs_pg_stats) / sizeof(struct cs_stats_conv))
210#define NUM_SRP_STATS (sizeof(cs_srp_stats) / sizeof(struct cs_stats_conv))
211#define NUM_KNET_STATS (sizeof(cs_knet_stats) / sizeof(struct cs_stats_conv))
212#define NUM_KNET_HANDLE_STATS (sizeof(cs_knet_handle_stats) / sizeof(struct cs_stats_conv))
213#define NUM_IPCSC_STATS (sizeof(cs_ipcs_conn_stats) / sizeof(struct cs_stats_conv))
214#define NUM_IPCSG_STATS (sizeof(cs_ipcs_global_stats) / sizeof(struct cs_stats_conv))
247 *value_len = strlen((
char *)(stat_array) + conv->
offset)+1;
251 assert(value_len != NULL);
253 memcpy(
value, (
char *)(stat_array) + conv->
offset, *value_len);
257static void stats_add_entry(
const char *key,
struct cs_stats_conv *cs_conv)
264 qb_map_put(stats_map, item->
key_name, item);
267static void stats_rm_entry(
const char *key)
269 struct stats_item *item = qb_map_get(stats_map, key);
272 qb_map_rm(stats_map, item->
key_name);
277static void stats_map_free_cb(uint32_t event,
278 char* key,
void* old_value,
320 err = qb_map_notify_add(
stats_map, NULL, stats_map_free_cb, QB_MAP_NOTIFY_FREE, NULL);
333 struct knet_link_status link_status;
336 struct knet_handle_stats knet_handle_stats;
342 unsigned int sm_event;
352 switch (statinfo->
type) {
355 stats_map_set_value(statinfo, pg_stats,
value, value_len,
type);
359 stats_map_set_value(statinfo, pg_stats->
srp,
value, value_len,
type);
361 case STAT_KNET_HANDLE:
366 stats_map_set_value(statinfo, &knet_handle_stats,
value, value_len,
type);
369 if (sscanf(key_name,
"stats.knet.node%d.link%d", &
nodeid, &link_no) != 2) {
387 if (
sscanf(key_name,
"stats.ipcs.service%d.%d.%p", &service_id, &pid, &
conn_ptr) != 3) {
418 *value_len =
sizeof(
float);
428static void schedmiss_clear_stats(
void)
434 if (
i < highest_schedmiss_event) {
436 stats_rm_entry(
param);
438 stats_rm_entry(
param);
441 schedmiss_event[
i].
delay = 0.0f;
443 highest_schedmiss_event = 0;
459 schedmiss_event[0].
timestamp = timestamp;
460 schedmiss_event[0].
delay = delay;
468 highest_schedmiss_event++;
473#define STATS_CLEAR "stats.clear."
474#define STATS_CLEAR_KNET "stats.clear.knet"
475#define STATS_CLEAR_IPC "stats.clear.ipc"
476#define STATS_CLEAR_TOTEM "stats.clear.totem"
477#define STATS_CLEAR_ALL "stats.clear.all"
478#define STATS_CLEAR_SCHEDMISS "stats.clear.schedmiss"
500 schedmiss_clear_stats();
506 schedmiss_clear_stats();
708 tracker->key_name, stats_map_notify_fn,
747 stats_rm_entry(
param);
782 stats_rm_entry(
param);
cs_error_t qb_to_cs_error(int result)
qb_to_cs_error
cs_error_t
The cs_error_t enum.
struct cmap_map stats_map
int32_t icmap_tt_to_qbtt(int32_t track_type)
#define ICMAP_TRACK_MODIFY
icmap_value_types_t
Possible types of value.
#define ICMAP_TRACK_DELETE
int32_t icmap_qbtt_to_tt(int32_t track_type)
#define ICMAP_TRACK_PREFIX
Whole prefix is tracked, instead of key only (so "totem." tracking means that "totem....
size_t icmap_get_valuetype_len(icmap_value_types_t type)
void(* icmap_notify_fn_t)(int32_t event, const char *key_name, struct icmap_notify_value new_value, struct icmap_notify_value old_value, void *user_data)
Prototype for notify callback function.
qb_map_iter_t * icmap_iter_t
Itterator type.
struct icmap_track * icmap_track_t
Track type.
#define ICMAP_KEYNAME_MAXLEN
Maximum length of key in icmap.
cs_error_t cs_ipcs_get_conn_stats(int service_id, uint32_t pid, void *conn_ptr, struct ipcs_conn_stats *ipcs_stats)
void cs_ipcs_get_global_stats(struct ipcs_global_stats *ipcs_stats)
void cs_ipcs_clear_stats()
#define LOGSYS_LEVEL_ERROR
#define log_printf(level, format, args...)
#define LOGSYS_DECLARE_SUBSYS(subsys)
The LOGSYS_DECLARE_SUBSYS macro.
#define LOGSYS_LEVEL_WARNING
void stats_knet_del_member(knet_node_id_t nodeid, uint8_t link_no)
struct cs_stats_conv cs_schedmiss_stats[]
void stats_ipcs_add_connection(int service_id, uint32_t pid, void *ptr)
void stats_knet_add_handle(void)
const char * stats_map_iter_next(icmap_iter_t iter, size_t *value_len, icmap_value_types_t *type)
QB_LIST_DECLARE(stats_tracker_list_head)
#define STATS_CLEAR_TOTEM
void stats_add_schedmiss_event(uint64_t timestamp, float delay)
void * stats_map_track_get_user_data(icmap_track_t icmap_track)
struct cs_stats_conv cs_ipcs_conn_stats[]
cs_error_t stats_map_delete(const char *key_name)
cs_error_t stats_map_track_delete(icmap_track_t icmap_track)
#define NUM_KNET_HANDLE_STATS
icmap_iter_t stats_map_iter_init(const char *prefix)
struct cs_stats_conv cs_knet_stats[]
struct cs_stats_conv cs_srp_stats[]
void stats_trigger_trackers()
int stats_map_is_key_ro(const char *key_name)
void stats_ipcs_del_connection(int service_id, uint32_t pid, void *ptr)
cs_error_t stats_map_set(const char *key_name, const void *value, size_t value_len, icmap_value_types_t type)
void stats_map_iter_finalize(icmap_iter_t iter)
struct cs_stats_conv cs_pg_stats[]
cs_error_t stats_map_get(const char *key_name, void *value, size_t *value_len, icmap_value_types_t *type)
#define STATS_CLEAR_SCHEDMISS
cs_error_t stats_map_adjust_int(const char *key_name, int32_t step)
struct cs_stats_conv cs_ipcs_global_stats[]
cs_error_t stats_map_track_add(const char *key_name, int32_t track_type, icmap_notify_fn_t notify_fn, void *user_data, icmap_track_t *icmap_track)
void stats_knet_add_member(knet_node_id_t nodeid, uint8_t link_no)
struct cs_stats_conv cs_knet_handle_stats[]
cs_error_t stats_map_init(const struct corosync_api_v1 *corosync_api)
#define MAX_SCHEDMISS_EVENTS
The corosync_api_v1 struct.
void *(* totem_get_stats)(void)
enum cs_stats_conv::@10 type
const icmap_value_types_t value_type
icmap_notify_fn_t notify_fn
Structure passed as new_value and old_value in change callback.
struct cs_stats_conv * cs_conv
#define TOTEMPG_STATS_CLEAR_TOTEM
#define TOTEMPG_STATS_CLEAR_TRANSPORT
int totemknet_handle_get_stats(struct knet_handle_stats *stats)
int totemknet_link_get_status(knet_node_id_t node, uint8_t link, struct knet_link_status *status)
void totempg_stats_clear(int flags)