From ac3c8dcb076245544e61dabb984d057167572276 Mon Sep 17 00:00:00 2001 From: Filip Tehlar Date: Tue, 14 Mar 2023 08:50:28 +0100 Subject: session: add session stats Type: feature Signed-off-by: Filip Tehlar Change-Id: I02d9bb5292b32ffb1b2f05daccd8a7d5dba05125 --- src/vnet/session/application_worker.c | 5 ++-- src/vnet/session/segment_manager.c | 12 ++++---- src/vnet/session/session.h | 24 +++++++++++++++ src/vnet/session/session_cli.c | 56 +++++++++++++++++++++++++++++++++++ src/vnet/session/session_node.c | 15 ++++++---- 5 files changed, 99 insertions(+), 13 deletions(-) diff --git a/src/vnet/session/application_worker.c b/src/vnet/session/application_worker.c index 0cb179161b8..1927f2f78d3 100644 --- a/src/vnet/session/application_worker.c +++ b/src/vnet/session/application_worker.c @@ -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); diff --git a/src/vnet/session/segment_manager.c b/src/vnet/session/segment_manager.c index c14cffa66a2..ad0ba89a1dd 100644 --- a/src/vnet/session/segment_manager.c +++ b/src/vnet/session/segment_manager.c @@ -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; } diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 456718afb89..e92b1f079d6 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -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) \ diff --git a/src/vnet/session/session_cli.c b/src/vnet/session/session_cli.c index 344937c684a..ba2cba02164 100644 --- a/src/vnet/session/session_cli.c +++ b/src/vnet/session/session_cli.c @@ -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 * diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index c61e89bf398..6011704c8d0 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -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 -- cgit 1.2.3-korg