diff --git a/include/types/global.h b/include/types/global.h index 12ba8d42c..fdc151632 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -101,7 +101,8 @@ extern char *progname; /* program name */ 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 listeners; +extern int jobs; /* # of active jobs */ extern char trash[BUFSIZE]; extern char *swap_buffer; extern int nb_oldpids; /* contains the number of old pids found */ diff --git a/src/cfgparse.c b/src/cfgparse.c index 258942ebf..14171ce9f 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -267,6 +267,7 @@ static int str2listener(char *str, struct proxy *curproxy) tcpv4_add_listener(l); } + jobs++; listeners++; } /* end for(port) */ } /* end while(next) */ diff --git a/src/haproxy.c b/src/haproxy.c index 0bbed6f66..3ceb3980b 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -124,6 +124,7 @@ struct global global = { /*********************************************************************/ int stopping; /* non zero means stopping in progress */ +int jobs = 0; /* number of active jobs (conns, listeners, active tasks, ...) */ /* Here we store informations about the pids of the processes we may pause * or kill. We will send them a signal every 10 ms until we can bind to all @@ -920,8 +921,8 @@ void run_poll_loop() * numbers of proxies. */ maintain_proxies(&next); - /* stop when there's no connection left and we don't allow them anymore */ - if (!actconn && listeners == 0) + /* stop when there's nothing left to do */ + if (jobs == 0) break; /* The poller will ensure it returns around */ diff --git a/src/proxy.c b/src/proxy.c index 346d0b3e3..f25216c0e 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -615,6 +615,7 @@ void stop_proxy(struct proxy *p) if (l->state >= LI_ASSIGNED) { delete_listener(l); listeners--; + jobs--; } } p->state = PR_STSTOPPED; diff --git a/src/session.c b/src/session.c index 0574c0ba5..dd130e025 100644 --- a/src/session.c +++ b/src/session.c @@ -1999,6 +1999,7 @@ struct task *process_session(struct task *t) if (s->flags & SN_BE_ASSIGNED) s->be->beconn--; actconn--; + jobs--; s->listener->nbconn--; if (s->listener->state == LI_FULL && s->listener->nbconn < s->listener->maxconn) { diff --git a/src/stream_sock.c b/src/stream_sock.c index 1a824bd71..d72d0e5a5 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -1191,6 +1191,7 @@ int stream_sock_accept(int fd) goto out_close; } + jobs++; actconn++; totalconn++; l->nbconn++; @@ -1207,12 +1208,14 @@ int stream_sock_accept(int fd) EV_FD_CLR(fd, DIR_RD); p->state = PR_STIDLE; } + jobs--; actconn--; l->nbconn--; goto out_close; } else if (unlikely(ret == 0)) { /* ignore this connection */ + jobs--; actconn--; l->nbconn--; close(cfd);