]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: listener: new function listener_release
authorWilly Tarreau <w@1wt.eu>
Fri, 15 Sep 2017 07:19:58 +0000 (09:19 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 15 Sep 2017 09:49:52 +0000 (11:49 +0200)
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
src/listener.c
src/session.c
src/stream.c

index 7fdb1cfad825ab03defe759eb523ba4a83fa6137..18609537dd82b675f6a92d82525b45e0d116de79 100644 (file)
@@ -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 <kwl> as a list of valid keywords for next
  * parsing sessions.
index 0af49b0e46916c3d87a52efdaaf91dfc7c381290..e6f89f977d74670cc11d36323bc68ab654c0b032 100644 (file)
@@ -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 <kwl> as a list of valid keywords for next
  * parsing sessions.
index 68a4303d68ad559641357ba4004131eeae669c0d..22f6b58b4bd0167dcfa558138060f8f30ca2c512 100644 (file)
@@ -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);
index d8c1a7e0d1aabb44b11510e45fa9c394c822a77d..5489f114df63dde06f3b858c774591a70cb80855 100644 (file)
@@ -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)))) {