Quellcode durchsuchen

Merge pull request #4965 from rspamd/vstakhov-check-nconns-shutdown

[Fix] Check nconns when firing the final termination event
pull/4972/head
Vsevolod Stakhov vor 2 Wochen
Ursprung
Commit
f0ba143490
Es ist kein Account mit der E-Mail-Adresse des Committers verbunden
1 geänderte Dateien mit 44 neuen und 1 gelöschten Zeilen
  1. 44
    1
      src/libserver/worker_util.c

+ 44
- 1
src/libserver/worker_util.c Datei anzeigen

@@ -240,6 +240,41 @@ rspamd_worker_shutdown_check(EV_P_ ev_timer *w, int revents)
}
}

static void
rspamd_worker_shutdown_check_nconns(EV_P_ ev_timer *w, int revents)
{
struct rspamd_worker *worker = (struct rspamd_worker *) w->data;

if (worker->state != rspamd_worker_wanna_die) {
if (worker->state != rspamd_worker_wait_connections) {
rspamd_worker_terminate_handlers(worker);
}

/* Check again, as rspamd_worker_terminate_handlers could change the worker's state */
if (worker->state == rspamd_worker_wanna_die) {
/* We are done, kill event loop */
ev_timer_stop(EV_A_ w);
ev_break(EV_A_ EVBREAK_ALL);
}
else {
/* Try again later */

if (worker->nconns > 0) {
ev_timer_again(EV_A_ w);
}
else {
/* No connections left, can close everything */
ev_timer_stop(EV_A_ w);
ev_break(EV_A_ EVBREAK_ALL);
}
}
}
else {
ev_timer_stop(EV_A_ w);
ev_break(EV_A_ EVBREAK_ALL);
}
}

/*
* Config reload is designed by sending sigusr2 to active workers and pending shutdown of them
*/
@@ -326,7 +361,8 @@ rspamd_worker_term_handler(struct rspamd_worker_signal_handler *sigh, void *arg)
sigh->worker->srv->server_pool->tag.tagname,
sigh->worker->srv->server_pool->tag.uid,
G_STRFUNC,
"terminating after receiving signal %s",
"terminating in up to %.0f second after receiving signal %s",
shutdown_ts,
g_strsignal(sigh->signo));

rspamd_worker_stop_accept(sigh->worker);
@@ -347,6 +383,13 @@ rspamd_worker_term_handler(struct rspamd_worker_signal_handler *sigh, void *arg)
0.5, 0.5);
ev_timer_start(sigh->event_loop, &shutdown_check_ev);
}
else {
/* This timer checks if we have no active connections pending and terminates once all conns are done */
shutdown_check_ev.data = sigh->worker;
ev_timer_init(&shutdown_check_ev, rspamd_worker_shutdown_check_nconns,
0.5, 0.5);
ev_timer_start(sigh->event_loop, &shutdown_check_ev);
}
}
else {
/* Flag to die has been already set */

Laden…
Abbrechen
Speichern