[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 12ba8d4..fdc1516 100644
--- a/include/types/global.h
+++ b/include/types/global.h
@@ -101,7 +101,8 @@
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 258942e..14171ce 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -267,6 +267,7 @@
tcpv4_add_listener(l);
}
+ jobs++;
listeners++;
} /* end for(port) */
} /* end while(next) */
diff --git a/src/haproxy.c b/src/haproxy.c
index 0bbed6f..3ceb398 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -124,6 +124,7 @@
/*********************************************************************/
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 @@
* 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 <next> */
diff --git a/src/proxy.c b/src/proxy.c
index 346d0b3..f25216c 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -615,6 +615,7 @@
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 0574c0b..dd130e0 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1999,6 +1999,7 @@
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 1a824bd..d72d0e5 100644
--- a/src/stream_sock.c
+++ b/src/stream_sock.c
@@ -1191,6 +1191,7 @@
goto out_close;
}
+ jobs++;
actconn++;
totalconn++;
l->nbconn++;
@@ -1207,12 +1208,14 @@
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);