From: Christopher Faulet Date: Fri, 22 Jan 2021 16:33:22 +0000 (+0100) Subject: BUG/MINOR: stats: Continue to fill frontend stats on unimplemented metric X-Git-Tag: v2.4-dev7~153 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d808f1759dcb9fcf28b68f835b56e9c0caddddcc;p=thirdparty%2Fhaproxy.git BUG/MINOR: stats: Continue to fill frontend stats on unimplemented metric A regression was introduced by the commit 0ef54397b ("MEDIUM: stats: allow to select one field in `stats_fill_fe_stats`"). stats_fill_fe_stats() function fails on unimplemented metrics for frontends. However, not all stats metrics are used by frontends. For instance ST_F_QCUR. As a consequence, the frontends stats are always skipped. To fix the bug, we just skip unimplemented metric for frontends. An error is triggered only if a specific field is given and is unimplemented. No backport is needed except if the above commit is backported. --- diff --git a/src/stats.c b/src/stats.c index 0075b77e5b..e1b350a440 100644 --- a/src/stats.c +++ b/src/stats.c @@ -1623,10 +1623,10 @@ int stats_dump_one_line(const struct field *stats, size_t stats_count, } /* Fill with the frontend statistics. is preallocated array of - * length . The length of the array must be at least ST_F_TOTAL_FIELDS. If - * this length is less than this value, or if one field is not implemented, the - * function returns 0, otherwise, it returns 1. If selected_field is != NULL, - * only fill this one + * length . If is != NULL, only fill this one. The length + * of the array must be at least ST_F_TOTAL_FIELDS. If this length is less than + * this value, or if the selected field is not implemented for frontends, the + * function returns 0, otherwise, it returns 1. */ int stats_fill_fe_stats(struct proxy *px, struct field *stats, int len, enum stat_field *selected_field) @@ -1787,8 +1787,12 @@ int stats_fill_fe_stats(struct proxy *px, struct field *stats, int len, metric = mkf_u64(FN_COUNTER, px->fe_counters.cum_conn); break; default: - /* should never fall here unless non implemented */ - return 0; + /* not used for frontends. If a specific metric + * is requested, return an error. Otherwise continue. + */ + if (selected_field != NULL) + return 0; + continue; } stats[current_field] = metric; if (selected_field != NULL)