From 05f5047d40a9623f96501aca3af66e4f82a4dd20 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 15 Sep 2017 09:19:58 +0200 Subject: [PATCH] MINOR: listener: new function listener_release Instead of duplicating some sensitive listener-specific code in the session and in the stream code, let's call listener_release() when releasing a connection attached to a listener. --- include/proto/listener.h | 6 ++++++ src/listener.c | 23 +++++++++++++++++++++++ src/session.c | 15 +-------------- src/stream.c | 17 ++--------------- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/include/proto/listener.h b/include/proto/listener.h index 7fdb1cfad..18609537d 100644 --- a/include/proto/listener.h +++ b/include/proto/listener.h @@ -102,6 +102,12 @@ void delete_listener(struct listener *listener); */ void listener_accept(int fd); +/* Notify the listener that a connection initiated from it was released. This + * is used to keep the connection count consistent and to possibly re-open + * listening when it was limited. + */ +void listener_release(struct listener *l); + /* * Registers the bind keyword list as a list of valid keywords for next * parsing sessions. diff --git a/src/listener.c b/src/listener.c index 0af49b0e4..e6f89f977 100644 --- a/src/listener.c +++ b/src/listener.c @@ -588,6 +588,29 @@ void listener_accept(int fd) return; } +/* Notify the listener that a connection initiated from it was released. This + * is used to keep the connection count consistent and to possibly re-open + * listening when it was limited. + */ +void listener_release(struct listener *l) +{ + struct proxy *fe = l->bind_conf->frontend; + + if (!(l->options & LI_O_UNLIMITED)) + actconn--; + l->nbconn--; + if (l->state == LI_FULL) + resume_listener(l); + + /* Dequeues all of the listeners waiting for a resource */ + if (!LIST_ISEMPTY(&global_listener_queue)) + dequeue_all_listeners(&global_listener_queue); + + if (!LIST_ISEMPTY(&fe->listener_queue) && + (!fe->fe_sps_lim || freq_ctr_remain(&fe->fe_sess_per_sec, fe->fe_sps_lim, 0) > 0)) + dequeue_all_listeners(&fe->listener_queue); +} + /* * Registers the bind keyword list as a list of valid keywords for next * parsing sessions. diff --git a/src/session.c b/src/session.c index 68a4303d6..22f6b58b4 100644 --- a/src/session.c +++ b/src/session.c @@ -376,20 +376,7 @@ static void session_kill_embryonic(struct session *sess) conn_free(conn); sess->fe->feconn--; - - if (!(sess->listener->options & LI_O_UNLIMITED)) - actconn--; - sess->listener->nbconn--; - if (sess->listener->state == LI_FULL) - resume_listener(sess->listener); - - /* Dequeues all of the listeners waiting for a resource */ - if (!LIST_ISEMPTY(&global_listener_queue)) - dequeue_all_listeners(&global_listener_queue); - - if (!LIST_ISEMPTY(&sess->fe->listener_queue) && - (!sess->fe->fe_sps_lim || freq_ctr_remain(&sess->fe->fe_sess_per_sec, sess->fe->fe_sps_lim, 0) > 0)) - dequeue_all_listeners(&sess->fe->listener_queue); + listener_release(sess->listener); task_delete(task); task_free(task); diff --git a/src/stream.c b/src/stream.c index d8c1a7e0d..5489f114d 100644 --- a/src/stream.c +++ b/src/stream.c @@ -2421,21 +2421,8 @@ struct task *process_stream(struct task *t) if (s->flags & SF_BE_ASSIGNED) s->be->beconn--; - if (sess->listener) { - if (!(sess->listener->options & LI_O_UNLIMITED)) - actconn--; - sess->listener->nbconn--; - if (sess->listener->state == LI_FULL) - resume_listener(sess->listener); - - /* Dequeues all of the listeners waiting for a resource */ - if (!LIST_ISEMPTY(&global_listener_queue)) - dequeue_all_listeners(&global_listener_queue); - - if (!LIST_ISEMPTY(&sess->fe->listener_queue) && - (!sess->fe->fe_sps_lim || freq_ctr_remain(&sess->fe->fe_sess_per_sec, sess->fe->fe_sps_lim, 0) > 0)) - dequeue_all_listeners(&sess->fe->listener_queue); - } + if (sess->listener) + listener_release(sess->listener); if (unlikely((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {