From: Willy Tarreau Date: Tue, 31 Aug 2010 13:39:26 +0000 (+0200) Subject: [MINOR] support a global jobs counter X-Git-Tag: v1.5-dev8~477 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af7ad00a9953e9488c1765b42571af2945097b9b;p=thirdparty%2Fhaproxy.git [MINOR] support a global jobs counter This counter is incremented for each incoming connection and each active listener, and is used to prevent haproxy from stopping upon SIGUSR1. It will thus be possible for some tasks in increment this counter in order to prevent haproxy from dying until they have completed their job. --- diff --git a/include/types/global.h b/include/types/global.h index 12ba8d42c5..fdc1516323 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 258942ebf8..14171ce9fd 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 0bbed6f662..3ceb3980b2 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 346d0b3e30..f25216c0ea 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 0574c0ba5a..dd130e0258 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 1a824bd71b..d72d0e5a51 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);