]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: stats: Continue to fill frontend stats on unimplemented metric
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 22 Jan 2021 16:33:22 +0000 (17:33 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 22 Jan 2021 16:42:32 +0000 (17:42 +0100)
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.

src/stats.c

index 0075b77e5b555bd1e5c0673e16440251b8752742..e1b350a4405a230b82f5c620f3f3494dc697ded1 100644 (file)
@@ -1623,10 +1623,10 @@ int stats_dump_one_line(const struct field *stats, size_t stats_count,
 }
 
 /* Fill <stats> with the frontend statistics. <stats> is preallocated array of
- * length <len>. 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 <len>. If <selected_field> 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)