From: Willy Tarreau Date: Sun, 16 Aug 2009 16:20:44 +0000 (+0200) Subject: [MEDIUM] session: account per-listener connections X-Git-Tag: v1.4-dev3~46 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6e6fb2beb96a6a0bdd05d042923785dc40a1d2df;p=thirdparty%2Fhaproxy.git [MEDIUM] session: account per-listener connections In order to merge the unix session handling code, we have to maintain the number of per-listener connections in the session. This was only performed for unix sockets till now. --- diff --git a/src/client.c b/src/client.c index cb11727548..93bd8946a2 100644 --- a/src/client.c +++ b/src/client.c @@ -108,6 +108,16 @@ int event_accept(int fd) { } } + if (l->nbconn >= l->maxconn) { + /* too many connections, we shoot this one and return. + * FIXME: it would be better to simply switch the listener's + * state to LI_FULL and disable the FD. We could re-enable + * it upon fd_delete(), but this requires all protocols to + * be switched. + */ + goto out_close; + } + if ((s = pool_alloc2(pool2_session)) == NULL) { /* disable this proxy for a while */ Alert("out of memory in event_accept().\n"); EV_FD_CLR(fd, DIR_RD); @@ -458,6 +468,12 @@ int event_accept(int fd) { */ task_wakeup(t, TASK_WOKEN_INIT); + l->nbconn++; /* warning! right now, it's up to the handler to decrease this */ + if (l->nbconn >= l->maxconn) { + EV_FD_CLR(l->fd, DIR_RD); + l->state = LI_FULL; + } + p->feconn++; /* beconn will be increased later */ if (p->feconn > p->feconn_max) p->feconn_max = p->feconn; diff --git a/src/session.c b/src/session.c index 5213dcdc26..1a18790021 100644 --- a/src/session.c +++ b/src/session.c @@ -1206,6 +1206,13 @@ resync_stream_interface: if (s->flags & SN_BE_ASSIGNED) s->be->beconn--; actconn--; + 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 (unlikely((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {