]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: session: don't always assume there's a listener
authorThierry FOURNIER <tfournier@exceliance.fr>
Thu, 20 Mar 2014 14:42:53 +0000 (15:42 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 28 Mar 2014 12:16:32 +0000 (13:16 +0100)
For outgoing connections initiated from an applet, there might not be
any listener. It's the case with peers, which resort to a hack consisting
in making the session's listener point to the peer. This listener is only
used for statistics now so it's much easier to check for its presence now.

src/session.c

index 7eeb6aa5e02c9f3b124df6718b048c2af5a7b34c..a8f68a29c3183d36fa95aa257a0fc88858233e42 100644 (file)
@@ -689,7 +689,7 @@ void session_process_counters(struct session *s)
                        if (objt_server(s->target))
                                objt_server(s->target)->counters.bytes_in += bytes;
 
-                       if (s->listener->counters)
+                       if (s->listener && s->listener->counters)
                                s->listener->counters->bytes_in += bytes;
 
                        for (i = 0; i < MAX_SESS_STKCTR; i++) {
@@ -723,7 +723,7 @@ void session_process_counters(struct session *s)
                        if (objt_server(s->target))
                                objt_server(s->target)->counters.bytes_out += bytes;
 
-                       if (s->listener->counters)
+                       if (s->listener && s->listener->counters)
                                s->listener->counters->bytes_out += bytes;
 
                        for (i = 0; i < MAX_SESS_STKCTR; i++) {
@@ -2447,20 +2447,22 @@ struct task *process_session(struct task *t)
        s->fe->feconn--;
        if (s->flags & SN_BE_ASSIGNED)
                s->be->beconn--;
-       if (!(s->listener->options & LI_O_UNLIMITED))
-               actconn--;
        jobs--;
-       s->listener->nbconn--;
-       if (s->listener->state == LI_FULL)
-               resume_listener(s->listener);
+       if (s->listener) {
+               if (!(s->listener->options & LI_O_UNLIMITED))
+                       actconn--;
+               s->listener->nbconn--;
+               if (s->listener->state == LI_FULL)
+                       resume_listener(s->listener);
 
-       /* Dequeues all of the listeners waiting for a resource */
-       if (!LIST_ISEMPTY(&global_listener_queue))
-               dequeue_all_listeners(&global_listener_queue);
+               /* Dequeues all of the listeners waiting for a resource */
+               if (!LIST_ISEMPTY(&global_listener_queue))
+                       dequeue_all_listeners(&global_listener_queue);
 
-       if (!LIST_ISEMPTY(&s->fe->listener_queue) &&
-           (!s->fe->fe_sps_lim || freq_ctr_remain(&s->fe->fe_sess_per_sec, s->fe->fe_sps_lim, 0) > 0))
-               dequeue_all_listeners(&s->fe->listener_queue);
+               if (!LIST_ISEMPTY(&s->fe->listener_queue) &&
+                   (!s->fe->fe_sps_lim || freq_ctr_remain(&s->fe->fe_sess_per_sec, s->fe->fe_sps_lim, 0) > 0))
+                       dequeue_all_listeners(&s->fe->listener_queue);
+       }
 
        if (unlikely((global.mode & MODE_DEBUG) &&
                     (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {