]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] listeners: add listen_full() to mark a listener full
authorWilly Tarreau <w@1wt.eu>
Sun, 24 Jul 2011 17:23:38 +0000 (19:23 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 24 Jul 2011 17:25:28 +0000 (19:25 +0200)
This is just a cleanup which removes calls to EV_FD_CLR() and state
setting everywhere in the code.

include/proto/protocols.h
src/protocols.c
src/session.c
src/stream_sock.c

index e0d6ee432d49696c4a2a185802b6d3ea6334a8c2..354a4e971a5ae942fea1a0334a084ce1b0ef6e2f 100644 (file)
@@ -51,6 +51,11 @@ int pause_listener(struct listener *l);
  */
 int resume_listener(struct listener *l);
 
+/* Marks a ready listener as full so that the session code tries to re-enable
+ * it upon next close() using resume_listener().
+ */
+void listener_full(struct listener *l);
+
 /* This function adds all of the protocol's listener's file descriptors to the
  * polling lists when they are in the LI_LISTEN state. It is intended to be
  * used as a protocol's generic enable_all() primitive, for use after the
index 49e7eaaa2e465cac5680c45e4e8a527a852f1f51..7d8913d6cce0f5282b9c6f169c9214264b61e918 100644 (file)
@@ -106,6 +106,17 @@ int resume_listener(struct listener *l)
        return 1;
 }
 
+/* Marks a ready listener as full so that the session code tries to re-enable
+ * it upon next close() using resume_listener().
+ */
+void listener_full(struct listener *l)
+{
+       if (l->state >= LI_READY) {
+               EV_FD_CLR(l->fd, DIR_RD);
+               l->state = LI_FULL;
+       }
+}
+
 /* This function adds all of the protocol's listener's file descriptors to the
  * polling lists when they are in the LI_LISTEN state. It is intended to be
  * used as a protocol's generic enable_all() primitive, for use after the
index e5ac4eedd50e03908441ef61c2502fcb14beef35..6e718c00cb59a8e72264b1d1b946b1cb011f6cfb 100644 (file)
@@ -32,6 +32,7 @@
 #include <proto/log.h>
 #include <proto/session.h>
 #include <proto/pipe.h>
+#include <proto/protocols.h>
 #include <proto/proto_http.h>
 #include <proto/proto_tcp.h>
 #include <proto/proxy.h>
@@ -2088,12 +2089,8 @@ struct task *process_session(struct task *t)
        actconn--;
        jobs--;
        s->listener->nbconn--;
-       if (s->listener->state == LI_FULL &&
-           s->listener->nbconn < s->listener->maxconn) {
-               /* we should reactivate the listener */
-               EV_FD_SET(s->listener->fd, DIR_RD);
-               s->listener->state = LI_READY;
-       }
+       if (s->listener->state == LI_FULL)
+               resume_listener(s->listener);
 
        if (unlikely((global.mode & MODE_DEBUG) &&
                     (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {
index c5cd1e5a883c5ac4969f1502f766da961dea979c..10e13cb00a286e0dc9159cdda5e1197a605d138e 100644 (file)
@@ -1194,8 +1194,7 @@ int stream_sock_accept(int fd)
        int ret;
 
        if (unlikely(l->nbconn >= l->maxconn)) {
-               EV_FD_CLR(l->fd, DIR_RD);
-               l->state = LI_FULL;
+               listener_full(l);
                return 0;
        }
 
@@ -1221,20 +1220,16 @@ int stream_sock_accept(int fd)
                                        send_log(p, LOG_EMERG,
                                                 "Proxy %s reached system FD limit at %d. Please check system tunables.\n",
                                                 p->id, maxfd);
-                               if (l->nbconn) {
-                                       EV_FD_CLR(l->fd, DIR_RD);
-                                       l->state = LI_FULL;
-                               }
+                               if (l->nbconn)
+                                       listener_full(l);
                                return 0;
                        case EMFILE:
                                if (p)
                                        send_log(p, LOG_EMERG,
                                                 "Proxy %s reached process FD limit at %d. Please check 'ulimit-n' and restart.\n",
                                                 p->id, maxfd);
-                               if (l->nbconn) {
-                                       EV_FD_CLR(l->fd, DIR_RD);
-                                       l->state = LI_FULL;
-                               }
+                               if (l->nbconn)
+                                       listener_full(l);
                                return 0;
                        case ENOBUFS:
                        case ENOMEM:
@@ -1242,10 +1237,8 @@ int stream_sock_accept(int fd)
                                        send_log(p, LOG_EMERG,
                                                 "Proxy %s reached system memory limit at %d sockets. Please check system tunables.\n",
                                                 p->id, maxfd);
-                               if (l->nbconn) {
-                                       EV_FD_CLR(l->fd, DIR_RD);
-                                       l->state = LI_FULL;
-                               }
+                               if (l->nbconn)
+                                       listener_full(l);
                                return 0;
                        default:
                                return 0;
@@ -1291,10 +1284,10 @@ int stream_sock_accept(int fd)
                }
 
                if (l->nbconn >= l->maxconn) {
-                       EV_FD_CLR(l->fd, DIR_RD);
-                       l->state = LI_FULL;
+                       listener_full(l);
                        return 0;
                }
+
        } /* end of while (p->feconn < p->maxconn) */
        return 0;
 }