diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2022-01-30 12:24:31 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2022-01-30 12:24:31 +0000 |
commit | fe4d6835d133f29fe084ca2e918ab0aa67328117 (patch) | |
tree | bbff17600387adbff5403d24ea201be49aa80ae1 | |
parent | e4f52703c82924eeb3240a457ac819451b835468 (diff) | |
download | rspamd-fe4d6835d133f29fe084ca2e918ab0aa67328117.tar.gz rspamd-fe4d6835d133f29fe084ca2e918ab0aa67328117.zip |
[Minor] Try to fix on-termination race
-rw-r--r-- | src/fuzzy_storage.c | 62 |
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) { |