session: add session stats
Type: feature Signed-off-by: Filip Tehlar <ftehlar@cisco.com> Change-Id: I02d9bb5292b32ffb1b2f05daccd8a7d5dba05125
This commit is contained in:

committed by
Florin Coras

parent
b53b88a08e
commit
ac3c8dcb07
@@ -480,6 +480,7 @@ app_worker_own_session (app_worker_t * app_wrk, session_t * s)
|
||||
{
|
||||
segment_manager_t *sm;
|
||||
svm_fifo_t *rxf, *txf;
|
||||
int rv;
|
||||
|
||||
if (s->session_state == SESSION_STATE_LISTENING)
|
||||
return application_change_listener_owner (s, app_wrk);
|
||||
@@ -496,8 +497,8 @@ app_worker_own_session (app_worker_t * app_wrk, session_t * s)
|
||||
s->tx_fifo = 0;
|
||||
|
||||
sm = app_worker_get_connect_segment_manager (app_wrk);
|
||||
if (app_worker_alloc_session_fifos (sm, s))
|
||||
return -1;
|
||||
if ((rv = app_worker_alloc_session_fifos (sm, s)))
|
||||
return rv;
|
||||
|
||||
if (!svm_fifo_is_empty_cons (rxf))
|
||||
svm_fifo_clone (s->rx_fifo, rxf);
|
||||
|
@@ -105,8 +105,8 @@ segment_manager_add_segment_inline (segment_manager_t *sm, uword segment_size,
|
||||
/* Not configured for addition of new segments and not first */
|
||||
if (!props->add_segment && !segment_size)
|
||||
{
|
||||
clib_warning ("cannot allocate new segment");
|
||||
return VNET_API_ERROR_INVALID_VALUE;
|
||||
SESSION_DBG ("cannot allocate new segment");
|
||||
return SESSION_E_INVALID;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -418,7 +418,7 @@ segment_manager_init_first (segment_manager_t * sm)
|
||||
fs_index = segment_manager_add_segment (sm, max_seg_size, 0);
|
||||
if (fs_index < 0)
|
||||
{
|
||||
clib_warning ("Failed to preallocate segment %d", i);
|
||||
SESSION_DBG ("Failed to preallocate segment %d", i);
|
||||
return fs_index;
|
||||
}
|
||||
|
||||
@@ -440,7 +440,7 @@ segment_manager_init_first (segment_manager_t * sm)
|
||||
fs_index = segment_manager_add_segment (sm, first_seg_size, 0);
|
||||
if (fs_index < 0)
|
||||
{
|
||||
clib_warning ("Failed to allocate segment");
|
||||
SESSION_DBG ("Failed to allocate segment");
|
||||
return fs_index;
|
||||
}
|
||||
|
||||
@@ -458,7 +458,7 @@ segment_manager_init_first (segment_manager_t * sm)
|
||||
for (; i < fs->n_slices; i++)
|
||||
{
|
||||
if (fifo_segment_prealloc_fifo_hdrs (fs, i, hdrs_per_slice))
|
||||
return VNET_API_ERROR_SVM_SEGMENT_CREATE_FAIL;
|
||||
return SESSION_E_SEG_CREATE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -807,7 +807,7 @@ sm_lock_and_alloc_segment_and_fifos (segment_manager_t *sm,
|
||||
props->tx_fifo_size, rx_fifo, tx_fifo);
|
||||
if (rv)
|
||||
{
|
||||
clib_warning ("Added a segment, still can't allocate a fifo");
|
||||
SESSION_DBG ("Added a segment, still can't allocate a fifo");
|
||||
rv = SESSION_E_SEG_NO_SPACE2;
|
||||
goto done;
|
||||
}
|
||||
|
@@ -40,6 +40,11 @@ typedef enum
|
||||
SESSION_N_ERROR,
|
||||
} session_input_error_t;
|
||||
|
||||
typedef struct session_wrk_stats_
|
||||
{
|
||||
u32 errors[SESSION_N_ERRORS];
|
||||
} session_wrk_stats_t;
|
||||
|
||||
typedef struct session_tx_context_
|
||||
{
|
||||
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
|
||||
@@ -169,6 +174,8 @@ typedef struct session_worker_
|
||||
u16 batch_num;
|
||||
vlib_dma_batch_t *batch;
|
||||
|
||||
session_wrk_stats_t stats;
|
||||
|
||||
#if SESSION_DEBUG
|
||||
/** last event poll time by thread */
|
||||
clib_time_type_t last_event_poll;
|
||||
@@ -732,6 +739,23 @@ session_main_is_enabled ()
|
||||
return session_main.is_enabled == 1;
|
||||
}
|
||||
|
||||
always_inline void
|
||||
session_worker_stat_error_inc (session_worker_t *wrk, int error, int value)
|
||||
{
|
||||
if ((-(error) >= 0 && -(error) < SESSION_N_ERRORS))
|
||||
wrk->stats.errors[-error] += value;
|
||||
else
|
||||
SESSION_DBG ("unknown session counter");
|
||||
}
|
||||
|
||||
always_inline void
|
||||
session_stat_error_inc (int error, int value)
|
||||
{
|
||||
session_worker_t *wrk;
|
||||
wrk = session_main_get_worker (vlib_get_thread_index ());
|
||||
session_worker_stat_error_inc (wrk, error, value);
|
||||
}
|
||||
|
||||
#define session_cli_return_if_not_enabled() \
|
||||
do { \
|
||||
if (!session_main.is_enabled) \
|
||||
|
@@ -868,6 +868,62 @@ VLIB_CLI_COMMAND (session_enable_disable_command, static) =
|
||||
};
|
||||
/* *INDENT-ON* */
|
||||
|
||||
static clib_error_t *
|
||||
show_session_stats_fn (vlib_main_t *vm, unformat_input_t *input,
|
||||
vlib_cli_command_t *cmd)
|
||||
{
|
||||
session_main_t *smm = &session_main;
|
||||
session_worker_t *wrk;
|
||||
unsigned int *e;
|
||||
|
||||
if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
|
||||
return clib_error_return (0, "unknown input `%U'", format_unformat_error,
|
||||
input);
|
||||
|
||||
vec_foreach (wrk, smm->wrk)
|
||||
{
|
||||
vlib_cli_output (vm, "Thread %u:\n", wrk - smm->wrk);
|
||||
e = wrk->stats.errors;
|
||||
#define _(name, str) \
|
||||
if (e[SESSION_EP_##name]) \
|
||||
vlib_cli_output (vm, " %lu %s", e[SESSION_EP_##name], str);
|
||||
foreach_session_error
|
||||
#undef _
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
VLIB_CLI_COMMAND (show_session_stats_command, static) = {
|
||||
.path = "show session stats",
|
||||
.short_help = "show session stats",
|
||||
.function = show_session_stats_fn,
|
||||
};
|
||||
|
||||
static clib_error_t *
|
||||
clear_session_stats_fn (vlib_main_t *vm, unformat_input_t *input,
|
||||
vlib_cli_command_t *cmd)
|
||||
{
|
||||
session_main_t *smm = &session_main;
|
||||
session_worker_t *wrk;
|
||||
|
||||
if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
|
||||
return clib_error_return (0, "unknown input `%U'", format_unformat_error,
|
||||
input);
|
||||
|
||||
vec_foreach (wrk, smm->wrk)
|
||||
{
|
||||
clib_memset (&wrk->stats, 0, sizeof (wrk->stats));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
VLIB_CLI_COMMAND (clear_session_stats_command, static) = {
|
||||
.path = "clear session stats",
|
||||
.short_help = "clear session stats",
|
||||
.function = clear_session_stats_fn,
|
||||
};
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
|
@@ -139,7 +139,7 @@ session_mq_listen_handler (session_worker_t *wrk, session_evt_elt_t *elt)
|
||||
a->sep_ext.ext_cfg = session_mq_get_ext_config (app, mp->ext_config);
|
||||
|
||||
if ((rv = vnet_listen (a)))
|
||||
clib_warning ("listen returned: %U", format_session_error, rv);
|
||||
session_worker_stat_error_inc (wrk, rv, 1);
|
||||
|
||||
app_wrk = application_get_worker (app, mp->wrk_index);
|
||||
mq_send_session_bound_cb (app_wrk->wrk_index, mp->context, a->handle, rv);
|
||||
@@ -178,6 +178,7 @@ session_mq_connect_one (session_connect_msg_t *mp)
|
||||
{
|
||||
vnet_connect_args_t _a, *a = &_a;
|
||||
app_worker_t *app_wrk;
|
||||
session_worker_t *wrk;
|
||||
application_t *app;
|
||||
int rv;
|
||||
|
||||
@@ -211,7 +212,8 @@ session_mq_connect_one (session_connect_msg_t *mp)
|
||||
|
||||
if ((rv = vnet_connect (a)))
|
||||
{
|
||||
clib_warning ("connect returned: %U", format_session_error, rv);
|
||||
wrk = session_main_get_worker (vlib_get_thread_index ());
|
||||
session_worker_stat_error_inc (wrk, rv, 1);
|
||||
app_wrk = application_get_worker (app, mp->wrk_index);
|
||||
mq_send_session_connected_cb (app_wrk->wrk_index, mp->context, 0, rv);
|
||||
}
|
||||
@@ -320,7 +322,7 @@ session_mq_connect_uri_handler (session_worker_t *wrk, session_evt_elt_t *elt)
|
||||
a->app_index = app->app_index;
|
||||
if ((rv = vnet_connect_uri (a)))
|
||||
{
|
||||
clib_warning ("connect_uri returned: %d", rv);
|
||||
session_worker_stat_error_inc (wrk, rv, 1);
|
||||
app_wrk = application_get_worker (app, 0 /* default wrk only */ );
|
||||
mq_send_session_connected_cb (app_wrk->wrk_index, mp->context, 0, rv);
|
||||
}
|
||||
@@ -402,7 +404,7 @@ session_mq_unlisten_handler (session_worker_t *wrk, session_evt_elt_t *elt)
|
||||
a->wrk_map_index = mp->wrk_index;
|
||||
|
||||
if ((rv = vnet_unlisten (a)))
|
||||
clib_warning ("unlisten returned: %d", rv);
|
||||
session_worker_stat_error_inc (wrk, rv, 1);
|
||||
|
||||
app_wrk = application_get_worker (app, a->wrk_map_index);
|
||||
if (!app_wrk)
|
||||
@@ -601,6 +603,7 @@ session_mq_worker_update_handler (void *data)
|
||||
session_event_t *evt;
|
||||
session_t *s;
|
||||
application_t *app;
|
||||
int rv;
|
||||
|
||||
app = application_lookup (mp->client_index);
|
||||
if (!app)
|
||||
@@ -637,7 +640,9 @@ session_mq_worker_update_handler (void *data)
|
||||
return;
|
||||
}
|
||||
|
||||
app_worker_own_session (app_wrk, s);
|
||||
rv = app_worker_own_session (app_wrk, s);
|
||||
if (rv)
|
||||
session_stat_error_inc (rv, 1);
|
||||
|
||||
/*
|
||||
* Send reply
|
||||
|
Reference in New Issue
Block a user