diff --git a/include/types/global.h b/include/types/global.h index 344003a91..521032304 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -224,6 +224,7 @@ extern unsigned long pid_bit; /* bit corresponding to the process id */ extern int actconn; /* # of active sessions */ extern int listeners; extern int jobs; /* # of active jobs (listeners, sessions, open devices) */ +extern int unstoppable_jobs; /* # of active jobs that can't be stopped during a soft stop */ extern int active_peers; /* # of active peers (connection attempts and successes) */ extern int connected_peers; /* # of really connected peers */ extern THREAD_LOCAL struct buffer trash; diff --git a/include/types/stats.h b/include/types/stats.h index 75250447e..85cc906da 100644 --- a/include/types/stats.h +++ b/include/types/stats.h @@ -290,6 +290,7 @@ enum info_field { INF_DESCRIPTION, INF_STOPPING, INF_JOBS, + INF_UNSTOPPABLE_JOBS, INF_LISTENERS, INF_ACTIVE_PEERS, INF_CONNECTED_PEERS, diff --git a/src/haproxy.c b/src/haproxy.c index 494160ad8..f066ec978 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -177,6 +177,7 @@ struct activity activity[MAX_THREADS] __attribute__((aligned(64))) = { }; 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 @@ static void run_poll_loop() 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 07a5ef74e..0574260d9 100644 --- a/src/stats.c +++ b/src/stats.c @@ -132,6 +132,7 @@ const char *info_field_names[INF_TOTAL_FIELDS] = { [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 @@ int stats_fill_info(struct field *info, int len) 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);