From: resec Date: Fri, 8 Nov 2019 08:05:36 +0000 (+0800) Subject: [Fix] #3129 Multiple classifiers on redis working incorrectly X-Git-Tag: 2.2~22^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=14495547dea7e4a0c14cf1507ba7def74b58a4ce;p=thirdparty%2Frspamd.git [Fix] #3129 Multiple classifiers on redis working incorrectly --- diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index 08edf1a4f0..70011a6284 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 0df3783abd..320f422dda 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;