From: Willy Tarreau Date: Fri, 15 Sep 2017 06:18:11 +0000 (+0200) Subject: MINOR: listeners: make listeners count consistent with reality X-Git-Tag: v1.8-dev3~94 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2cc5bae0b897a377d9f6e2740a091008fbbe42e3;p=thirdparty%2Fhaproxy.git MINOR: listeners: make listeners count consistent with reality Some places call delete_listener() then decrement the number of listeners and jobs. At least one other place calls delete_listener() without doing so, but since it's in deinit(), it's harmless and cannot risk to cause zombie processes to survive. Given that the number of listeners and jobs is incremented when creating the listeners, it's much more logical to symmetrically decrement them when deleting such listeners. --- diff --git a/include/types/global.h b/include/types/global.h index 0a6ece71fc..37fbaca596 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -170,7 +170,7 @@ extern int pid; /* current process id */ extern int relative_pid; /* process id starting at 1 */ extern int actconn; /* # of active sessions */ extern int listeners; -extern int jobs; /* # of active jobs */ +extern int jobs; /* # of active jobs (listeners, sessions, open devices) */ extern struct chunk trash; extern int nb_oldpids; /* contains the number of old pids found */ extern const int zero; diff --git a/src/listener.c b/src/listener.c index 47bed179ef..d193b511a0 100644 --- a/src/listener.c +++ b/src/listener.c @@ -343,8 +343,9 @@ int create_listeners(struct bind_conf *bc, const struct sockaddr_storage *ss, /* Delete a listener from its protocol's list of listeners. The listener's * state is automatically updated from LI_ASSIGNED to LI_INIT. The protocol's - * number of listeners is updated. Note that the listener must have previously - * been unbound. This is the generic function to use to remove a listener. + * number of listeners is updated, as well as the global number of listeners + * and jobs. Note that the listener must have previously been unbound. This + * is the generic function to use to remove a listener. */ void delete_listener(struct listener *listener) { @@ -353,6 +354,8 @@ void delete_listener(struct listener *listener) listener->state = LI_INIT; LIST_DEL(&listener->proto_list); listener->proto->nb_listeners--; + listeners--; + jobs--; } /* This function is called on a read event from a listening socket, corresponding diff --git a/src/proxy.c b/src/proxy.c index 0bbce62c8d..ec1f60a9e0 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1080,8 +1080,6 @@ void zombify_proxy(struct proxy *p) unbind_listener_no_close(l); if (l->state >= LI_ASSIGNED) { delete_listener(l); - listeners--; - jobs--; } /* * Pretend we're still up and running so that the fd @@ -1120,8 +1118,6 @@ void stop_proxy(struct proxy *p) unbind_listener(l); if (l->state >= LI_ASSIGNED) { delete_listener(l); - listeners--; - jobs--; } } p->state = PR_STSTOPPED;