move listen status to a helper, defining both status enum and string
definition.
this will be helpful to be reused in prometheus code. It also removes
this hard-to-read nested ternary.

Signed-off-by: William Dauchy <wdau...@gmail.com>
---
 include/haproxy/listener-t.h |  9 +++++++++
 include/haproxy/listener.h   |  3 +++
 src/listener.c               | 18 ++++++++++++++++++
 src/stats.c                  |  2 +-
 4 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/include/haproxy/listener-t.h b/include/haproxy/listener-t.h
index ce5ed408f..7d3998ece 100644
--- a/include/haproxy/listener-t.h
+++ b/include/haproxy/listener-t.h
@@ -84,6 +84,15 @@ enum li_state {
  * not rely on this state.
  */
 
+/* listener status for stats */
+enum li_status {
+       LI_STATUS_WAITING = 0,
+       LI_STATUS_OPEN,
+       LI_STATUS_FULL,
+
+       LI_STATE_COUNT /* must be last */
+};
+
 /* listener socket options */
 #define LI_O_NONE               0x0000
 #define LI_O_NOLINGER           0x0001  /* disable linger on this socket */
diff --git a/include/haproxy/listener.h b/include/haproxy/listener.h
index 1be8551c3..f229efae4 100644
--- a/include/haproxy/listener.h
+++ b/include/haproxy/listener.h
@@ -218,6 +218,9 @@ struct task *manage_global_listener_queue(struct task *t, 
void *context, unsigne
 
 extern struct accept_queue_ring accept_queue_rings[MAX_THREADS] 
__attribute__((aligned(64)));
 
+extern const char* li_status_st[LI_STATE_COUNT];
+enum li_status get_li_status(struct listener *l);
+
 #endif /* _HAPROXY_LISTENER_H */
 
 /*
diff --git a/src/listener.c b/src/listener.c
index 0b929b906..9ca910b37 100644
--- a/src/listener.c
+++ b/src/listener.c
@@ -46,6 +46,12 @@ static struct bind_kw_list bind_keywords = {
 static struct mt_list global_listener_queue = 
MT_LIST_HEAD_INIT(global_listener_queue);
 static struct task *global_listener_queue_task;
 
+/* listener status for stats */
+const char* li_status_st[LI_STATE_COUNT] = {
+       [LI_STATUS_WAITING] = "WAITING",
+       [LI_STATUS_OPEN]    = "OPEN",
+       [LI_STATUS_FULL]    = "FULL",
+};
 
 #if defined(USE_THREAD)
 
@@ -183,6 +189,18 @@ REGISTER_CONFIG_POSTPARSER("multi-threaded accept queue", 
accept_queue_init);
 
 #endif // USE_THREAD
 
+/* helper to get listener status for stats */
+enum li_status get_li_status(struct listener *l)
+{
+       if (!l->maxconn || l->nbconn < l->maxconn) {
+               if (l->state == LI_LIMITED)
+                       return LI_STATUS_WAITING;
+               else
+                       return LI_STATUS_OPEN;
+       }
+       return LI_STATUS_FULL;
+}
+
 /* adjust the listener's state and its proxy's listener counters if needed.
  * It must be called under the listener's lock, but uses atomic ops to change
  * the proxy's counters so that the proxy lock is not needed.
diff --git a/src/stats.c b/src/stats.c
index 1e0db0b24..a63178d5a 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -1898,7 +1898,7 @@ int stats_fill_li_stats(struct proxy *px, struct listener 
*l, int flags,
                                metric = mkf_u64(FN_COUNTER, 
l->counters->denied_sess);
                                break;
                        case ST_F_STATUS:
-                               metric = mkf_str(FO_STATUS, (!l->maxconn || 
l->nbconn < l->maxconn) ? (l->state == LI_LIMITED) ? "WAITING" : "OPEN" : 
"FULL");
+                               metric = mkf_str(FO_STATUS, 
li_status_st[get_li_status(l)]);
                                break;
                        case ST_F_PID:
                                metric = mkf_u32(FO_KEY, relative_pid);
-- 
2.30.0


Reply via email to