commit fe4d683: [Minor] Try to fix on-termination race
Vsevolod Stakhov
vsevolod at highsecure.ru
Sun Jan 30 12:28:04 UTC 2022
Author: Vsevolod Stakhov
Date: 2022-01-30 12:24:31 +0000
URL: https://github.com/rspamd/rspamd/commit/fe4d6835d133f29fe084ca2e918ab0aa67328117 (HEAD -> master)
[Minor] Try to fix on-termination race
---
src/fuzzy_storage.c | 62 +++++++++++++++++++++++++++++++----------------------
1 file changed, 36 insertions(+), 26 deletions(-)
diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c
index f1248dfcc..d38f9c0b6 100644
--- a/src/fuzzy_storage.c
+++ b/src/fuzzy_storage.c
@@ -458,24 +458,24 @@ rspamd_fuzzy_updates_cb (gboolean success,
source = cbdata->source;
if (success) {
- rspamd_fuzzy_backend_count (ctx->backend, fuzzy_count_callback, ctx);
+ rspamd_fuzzy_backend_count(ctx->backend, fuzzy_count_callback, ctx);
msg_info ("successfully updated fuzzy storage %s: %d updates in queue; "
"%d pending currently; "
"%d added; %d deleted; %d extended; %d duplicates",
ctx->worker->cf->bind_conf ?
- ctx->worker->cf->bind_conf->bind_line :
- "unknown",
+ ctx->worker->cf->bind_conf->bind_line :
+ "unknown",
cbdata->updates_pending->len,
ctx->updates_pending->len,
nadded, ndeleted, nextended, nignored);
- rspamd_fuzzy_backend_version (ctx->backend, source,
+ rspamd_fuzzy_backend_version(ctx->backend, source,
fuzzy_update_version_callback, NULL);
ctx->updates_failed = 0;
if (cbdata->final || ctx->worker->state != rspamd_worker_state_running) {
/* Plan exit */
- ev_break (ctx->event_loop, EVBREAK_ALL);
+ ev_break(ctx->event_loop, EVBREAK_ALL);
}
}
else {
@@ -483,36 +483,45 @@ rspamd_fuzzy_updates_cb (gboolean success,
msg_err ("cannot commit update transaction to fuzzy backend %s, discard "
"%ud updates after %d retries",
ctx->worker->cf->bind_conf ?
- ctx->worker->cf->bind_conf->bind_line :
- "unknown",
+ ctx->worker->cf->bind_conf->bind_line :
+ "unknown",
cbdata->updates_pending->len,
ctx->updates_maxfail);
ctx->updates_failed = 0;
if (cbdata->final || ctx->worker->state != rspamd_worker_state_running) {
/* Plan exit */
- ev_break (ctx->event_loop, EVBREAK_ALL);
+ ev_break(ctx->event_loop, EVBREAK_ALL);
}
}
else {
- msg_err ("cannot commit update transaction to fuzzy backend %s; "
- "%ud updates are still left; %ud currently pending;"
- " %d updates left",
- ctx->worker->cf->bind_conf ?
- ctx->worker->cf->bind_conf->bind_line :
- "unknown",
- cbdata->updates_pending->len,
- ctx->updates_pending->len,
- ctx->updates_maxfail - ctx->updates_failed);
- /* Move the remaining updates to ctx queue */
- g_array_append_vals (ctx->updates_pending,
- cbdata->updates_pending->data,
- cbdata->updates_pending->len);
-
- if (cbdata->final) {
- /* Try one more time */
- rspamd_fuzzy_process_updates_queue (cbdata->ctx, cbdata->source,
- cbdata->final);
+ if (ctx->updates_pending) {
+ msg_err ("cannot commit update transaction to fuzzy backend %s; "
+ "%ud updates are still left; %ud currently pending;"
+ " %d retries remaining",
+ ctx->worker->cf->bind_conf ?
+ ctx->worker->cf->bind_conf->bind_line : "unknown",
+ cbdata->updates_pending->len,
+ ctx->updates_pending->len,
+ ctx->updates_maxfail - ctx->updates_failed);
+ /* Move the remaining updates to ctx queue */
+ g_array_append_vals(ctx->updates_pending,
+ cbdata->updates_pending->data,
+ cbdata->updates_pending->len);
+
+ if (cbdata->final) {
+ /* Try one more time */
+ rspamd_fuzzy_process_updates_queue(cbdata->ctx, cbdata->source,
+ cbdata->final);
+ }
+ }
+ else {
+ /* We have lost our ctx, so it is a race condition case */
+ msg_err ("cannot commit update transaction to fuzzy backend %s; "
+ "%ud updates are still left; no more retries: a worker is terminated",
+ ctx->worker->cf->bind_conf ?
+ ctx->worker->cf->bind_conf->bind_line : "unknown",
+ cbdata->updates_pending->len);
}
}
}
@@ -2662,6 +2671,7 @@ start_fuzzy (struct rspamd_worker *worker)
if (worker->index == 0) {
g_array_free (ctx->updates_pending, TRUE);
+ ctx->updates_pending = NULL;
}
if (ctx->keypair_cache) {
More information about the Commits
mailing list