}
}
+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
*/
sigh->worker->srv->server_pool->tag.tagname,
sigh->worker->srv->server_pool->tag.uid,
G_STRFUNC,
- "terminating after receiving signal %s",
+ "terminating in %.0f second after receiving signal %s",
+ shutdown_ts,
g_strsignal(sigh->signo));
rspamd_worker_stop_accept(sigh->worker);
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 */