From 14495547dea7e4a0c14cf1507ba7def74b58a4ce Mon Sep 17 00:00:00 2001 From: resec Date: Fri, 8 Nov 2019 16:05:36 +0800 Subject: [PATCH] [Fix] #3129 Multiple classifiers on redis working incorrectly --- src/libstat/backends/redis_backend.c | 20 ++++++++++++++++++-- src/libstat/learn_cache/redis_cache.c | 12 +++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index 08edf1a4f..70011a628 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -1425,13 +1425,29 @@ rspamd_redis_parse_classifier_opts (struct redis_stat_ctx *backend, elt = ucl_object_lookup (obj, "prefix"); if (elt == NULL || ucl_object_type (elt) != UCL_STRING) { + gchar *redis_object; + /* Default non-users statistics */ if (backend->enable_users || backend->cbref_user != -1) { - backend->redis_object = REDIS_DEFAULT_USERS_OBJECT; + redis_object = REDIS_DEFAULT_USERS_OBJECT; } else { - backend->redis_object = REDIS_DEFAULT_OBJECT; + redis_object = REDIS_DEFAULT_OBJECT; + } + + /* Prepend classifier name if defined */ + elt = ucl_object_lookup (obj, "name"); + if (elt != NULL && ucl_object_type (elt) == UCL_STRING) { + const gchar *cl_name = ucl_object_tostring (elt); + gchar *temp; + temp = g_malloc (strlen (cl_name) + strlen (redis_object) + 2); + strcpy (temp, cl_name); + strcat (temp, "_"); + strcat (temp, redis_object); + redis_object = temp; } + + backend->redis_object = redis_object; } else { /* XXX: sanity check */ diff --git a/src/libstat/learn_cache/redis_cache.c b/src/libstat/learn_cache/redis_cache.c index 0df3783ab..320f422dd 100644 --- a/src/libstat/learn_cache/redis_cache.c +++ b/src/libstat/learn_cache/redis_cache.c @@ -292,7 +292,17 @@ rspamd_stat_cache_redis_init (struct rspamd_stat_ctx *ctx, cache_ctx->redis_object = ucl_object_tostring (obj); } else { - cache_ctx->redis_object = DEFAULT_REDIS_KEY; + gchar *cl_name = st->classifier->cfg->name; + if (cl_name) { + gchar *redis_object; + redis_object = g_malloc (strlen (cl_name) + strlen (DEFAULT_REDIS_KEY) + 2); + strcpy (redis_object, cl_name); + strcat (redis_object, "_"); + strcat (redis_object, DEFAULT_REDIS_KEY); + cache_ctx->redis_object = redis_object; + } else { + cache_ctx->redis_object = DEFAULT_REDIS_KEY; + } } cache_ctx->conf_ref = conf_ref; -- 2.39.5