commit 1f73de6: [Minor] Do not refork old workers that are due to be terminated
Vsevolod Stakhov
vsevolod at highsecure.ru
Wed Jul 28 09:35:04 UTC 2021
Author: Vsevolod Stakhov
Date: 2021-07-28 10:30:45 +0100
URL: https://github.com/rspamd/rspamd/commit/1f73de6e1075c0dd90d7639f01e018cc3c1f5922 (HEAD -> master)
[Minor] Do not refork old workers that are due to be terminated
---
src/libserver/worker_util.c | 34 ++++++++++++++++++++++------------
src/rspamd.c | 5 ++---
src/rspamd.h | 1 +
3 files changed, 25 insertions(+), 15 deletions(-)
diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c
index cf20d9591..474da2644 100644
--- a/src/libserver/worker_util.c
+++ b/src/libserver/worker_util.c
@@ -1700,7 +1700,8 @@ rspamd_check_termination_clause (struct rspamd_main *rspamd_main,
{
gboolean need_refork = TRUE;
- if (wrk->state != rspamd_worker_state_running || rspamd_main->wanna_die) {
+ if (wrk->state != rspamd_worker_state_running || rspamd_main->wanna_die ||
+ (wrk->flags & RSPAMD_WORKER_OLD_CONFIG)) {
/* Do not refork workers that are intended to be terminated */
need_refork = FALSE;
}
@@ -1708,21 +1709,30 @@ rspamd_check_termination_clause (struct rspamd_main *rspamd_main,
if (WIFEXITED (res) && WEXITSTATUS (res) == 0) {
/* Normal worker termination, do not fork one more */
- if (wrk->hb.nbeats < 0 && rspamd_main->cfg->heartbeats_loss_max > 0 &&
- -(wrk->hb.nbeats) >= rspamd_main->cfg->heartbeats_loss_max) {
- msg_info_main ("%s process %P terminated normally, but lost %L "
- "heartbeats, refork it",
- g_quark_to_string (wrk->type),
- wrk->pid,
- -(wrk->hb.nbeats));
- need_refork = TRUE;
- }
- else {
+ if (wrk->flags & RSPAMD_WORKER_OLD_CONFIG) {
+ /* Never re-fork old workers */
msg_info_main ("%s process %P terminated normally",
- g_quark_to_string (wrk->type),
+ g_quark_to_string(wrk->type),
wrk->pid);
need_refork = FALSE;
}
+ else {
+ if (wrk->hb.nbeats < 0 && rspamd_main->cfg->heartbeats_loss_max > 0 &&
+ -(wrk->hb.nbeats) >= rspamd_main->cfg->heartbeats_loss_max) {
+ msg_info_main ("%s process %P terminated normally, but lost %L "
+ "heartbeats, refork it",
+ g_quark_to_string(wrk->type),
+ wrk->pid,
+ -(wrk->hb.nbeats));
+ need_refork = TRUE;
+ }
+ else {
+ msg_info_main ("%s process %P terminated normally",
+ g_quark_to_string(wrk->type),
+ wrk->pid);
+ need_refork = FALSE;
+ }
+ }
}
else {
if (WIFSIGNALED (res)) {
diff --git a/src/rspamd.c b/src/rspamd.c
index cea6a11a8..978980706 100644
--- a/src/rspamd.c
+++ b/src/rspamd.c
@@ -781,13 +781,12 @@ static void
mark_old_workers (gpointer key, gpointer value, gpointer unused)
{
struct rspamd_worker *w = value;
- struct rspamd_main __attribute__ ((unused)) *rspamd_main;
-
- rspamd_main = w->srv;
if (w->state == rspamd_worker_state_running) {
w->state = rspamd_worker_state_wanna_die;
}
+
+ w->flags |= RSPAMD_WORKER_OLD_CONFIG;
}
static void
diff --git a/src/rspamd.h b/src/rspamd.h
index eb5ce541e..7924bf0ee 100644
--- a/src/rspamd.h
+++ b/src/rspamd.h
@@ -67,6 +67,7 @@ enum rspamd_worker_flags {
RSPAMD_WORKER_SCANNER = (1 << 5),
RSPAMD_WORKER_CONTROLLER = (1 << 6),
RSPAMD_WORKER_NO_TERMINATE_DELAY = (1 << 7),
+ RSPAMD_WORKER_OLD_CONFIG = (1 << 8),
};
struct rspamd_worker_accept_event {
More information about the Commits
mailing list