mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-03-02 09:30:36 +00:00
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.
This commit is contained in:
parent
3c0544efbf
commit
a719926cf8
@ -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;
|
||||
|
@ -290,6 +290,7 @@ enum info_field {
|
||||
INF_DESCRIPTION,
|
||||
INF_STOPPING,
|
||||
INF_JOBS,
|
||||
INF_UNSTOPPABLE_JOBS,
|
||||
INF_LISTENERS,
|
||||
INF_ACTIVE_PEERS,
|
||||
INF_CONNECTED_PEERS,
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user