aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2022-01-30 12:24:31 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2022-01-30 12:24:31 +0000
commitfe4d6835d133f29fe084ca2e918ab0aa67328117 (patch)
treebbff17600387adbff5403d24ea201be49aa80ae1
parente4f52703c82924eeb3240a457ac819451b835468 (diff)
downloadrspamd-fe4d6835d133f29fe084ca2e918ab0aa67328117.tar.gz
rspamd-fe4d6835d133f29fe084ca2e918ab0aa67328117.zip
[Minor] Try to fix on-termination race
-rw-r--r--src/fuzzy_storage.c62
1 files 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) {