aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstat
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-10-11 16:43:34 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-10-11 16:43:34 +0100
commit319f53a4b2c812ebd827d5e11c046423bc9feced (patch)
treea035217e6cc69ac133c53bdf84c85cec07426274 /src/libstat
parent196fc45d6b71c39453e1906920368ad9e0bb73e0 (diff)
downloadrspamd-319f53a4b2c812ebd827d5e11c046423bc9feced.tar.gz
rspamd-319f53a4b2c812ebd827d5e11c046423bc9feced.zip
[CritFix] Fix processing of learned tokens count for redis backend
Diffstat (limited to 'src/libstat')
-rw-r--r--src/libstat/backends/redis_backend.c4
-rw-r--r--src/libstat/stat_process.c39
2 files changed, 30 insertions, 13 deletions
diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c
index 4ff9b08b1..72b3a3491 100644
--- a/src/libstat/backends/redis_backend.c
+++ b/src/libstat/backends/redis_backend.c
@@ -749,7 +749,7 @@ rspamd_redis_connected (redisAsyncContext *c, gpointer r, gpointer priv)
if (c->err == 0) {
if (r != NULL) {
- if (G_LIKELY (reply->type == REDIS_REPLY_INTEGER)) {
+ if (G_UNLIKELY (reply->type == REDIS_REPLY_INTEGER)) {
val = reply->integer;
}
else if (reply->type == REDIS_REPLY_STRING) {
@@ -807,7 +807,7 @@ rspamd_redis_processed (redisAsyncContext *c, gpointer r, gpointer priv)
tok = g_ptr_array_index (task->tokens, i);
elt = reply->element[i];
- if (G_LIKELY (elt->type == REDIS_REPLY_INTEGER)) {
+ if (G_UNLIKELY (elt->type == REDIS_REPLY_INTEGER)) {
tok->values[rt->id] = elt->integer;
found ++;
}
diff --git a/src/libstat/stat_process.c b/src/libstat/stat_process.c
index ea0fcd601..ed24499ba 100644
--- a/src/libstat/stat_process.c
+++ b/src/libstat/stat_process.c
@@ -323,17 +323,6 @@ rspamd_stat_backends_process (struct rspamd_stat_ctx *st_ctx,
if (bk_run != NULL) {
st->backend->process_tokens (task, task->tokens, i, bk_run);
-
- if (st->stcf->is_spam) {
- cl->spam_learns = st->backend->total_learns (task,
- bk_run,
- st_ctx);
- }
- else {
- cl->ham_learns = st->backend->total_learns (task,
- bk_run,
- st_ctx);
- }
}
}
}
@@ -372,6 +361,8 @@ rspamd_stat_classifiers_process (struct rspamd_stat_ctx *st_ctx,
{
guint i;
struct rspamd_classifier *cl;
+ struct rspamd_statfile *st;
+ gpointer bk_run;
if (st_ctx->classifiers->len == 0) {
return;
@@ -391,8 +382,34 @@ rspamd_stat_classifiers_process (struct rspamd_stat_ctx *st_ctx,
return;
}
+ for (i = 0; i < st_ctx->statfiles->len; i++) {
+ st = g_ptr_array_index (st_ctx->statfiles, i);
+ cl = st->classifier;
+
+ if (cl->cfg->flags & RSPAMD_FLAG_CLASSIFIER_NO_BACKEND) {
+ continue;
+ }
+
+ bk_run = g_ptr_array_index (task->stat_runtimes, i);
+ g_assert (st != NULL);
+
+ if (bk_run != NULL) {
+ if (st->stcf->is_spam) {
+ cl->spam_learns += st->backend->total_learns (task,
+ bk_run,
+ st_ctx);
+ }
+ else {
+ cl->ham_learns += st->backend->total_learns (task,
+ bk_run,
+ st_ctx);
+ }
+ }
+ }
+
for (i = 0; i < st_ctx->classifiers->len; i++) {
cl = g_ptr_array_index (st_ctx->classifiers, i);
+
g_assert (cl != NULL);
if (cl->cfg->min_tokens > 0 && task->tokens->len < cl->cfg->min_tokens) {