MEDIUM: jobs: support unstoppable jobs for soft stop
This patch allows a process to properly quit when some jobs are still
active, this feature is handled by the unstoppable_jobs variable, which
must be atomically incremented.
During each new iteration of run_poll_loop() the break condition of the
loop is now (jobs - unstoppable_jobs) == 0.
The unique usage of this at the moment is to handle the socketpair CLI
of a the worker during the stopping of the process. During the soft
stop, we could mark the CLI listener as an unstoppable job and still
handle new connections till every other jobs are stopped.
diff --git a/src/haproxy.c b/src/haproxy.c
index 494160a..f066ec9 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -177,6 +177,7 @@
int stopping; /* non zero means stopping in progress */
int killed; /* non zero means a hard-stop is triggered */
int jobs = 0; /* number of active jobs (conns, listeners, active tasks, ...) */
+int unstoppable_jobs = 0; /* number of active jobs that can't be stopped during a soft stop */
int active_peers = 0; /* number of active peers (connection attempts and connected) */
int connected_peers = 0; /* number of connected peers (verified ones) */
@@ -2617,7 +2618,7 @@
next = wake_expired_tasks();
/* stop when there's nothing left to do */
- if (jobs == 0)
+ if ((jobs - unstoppable_jobs) == 0)
break;
/* expire immediately if events are pending */
diff --git a/src/stats.c b/src/stats.c
index 07a5ef7..0574260 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -132,6 +132,7 @@
[INF_DESCRIPTION] = "description",
[INF_STOPPING] = "Stopping",
[INF_JOBS] = "Jobs",
+ [INF_UNSTOPPABLE_JOBS] = "Unstoppable Jobs",
[INF_LISTENERS] = "Listeners",
[INF_ACTIVE_PEERS] = "ActivePeers",
[INF_CONNECTED_PEERS] = "ConnectedPeers",
@@ -3300,6 +3301,7 @@
info[INF_DESCRIPTION] = mkf_str(FO_CONFIG|FN_OUTPUT|FS_SERVICE, global.desc);
info[INF_STOPPING] = mkf_u32(0, stopping);
info[INF_JOBS] = mkf_u32(0, jobs);
+ info[INF_UNSTOPPABLE_JOBS] = mkf_u32(0, unstoppable_jobs);
info[INF_LISTENERS] = mkf_u32(0, listeners);
info[INF_ACTIVE_PEERS] = mkf_u32(0, active_peers);
info[INF_CONNECTED_PEERS] = mkf_u32(0, connected_peers);