From: Vsevolod Stakhov Date: Fri, 2 Sep 2016 15:01:55 +0000 (+0100) Subject: [Minor] Skeleton for redis fuzzy backend X-Git-Tag: 1.4.0~501 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f206fff3277fbda728a608653636072f1c8ba411;p=rspamd.git [Minor] Skeleton for redis fuzzy backend --- diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c index 56f62ba54..c49a9f277 100644 --- a/src/fuzzy_storage.c +++ b/src/fuzzy_storage.c @@ -1520,7 +1520,7 @@ rspamd_fuzzy_storage_reload (struct rspamd_main *rspamd_main, rep.type = RSPAMD_CONTROL_RELOAD; if ((ctx->backend = rspamd_fuzzy_backend_create (ctx->ev_base, - worker->cf->options, + worker->cf->options, rspamd_main->cfg, &err)) == NULL) { msg_err ("cannot open backend after reload: %e", err); g_error_free (err); @@ -2258,7 +2258,7 @@ start_fuzzy (struct rspamd_worker *worker) * Open DB and perform VACUUM */ if ((ctx->backend = rspamd_fuzzy_backend_create (ctx->ev_base, - worker->cf->options, &err)) == NULL) { + worker->cf->options, cfg, &err)) == NULL) { msg_err ("cannot open backend: %e", err); g_error_free (err); exit (EXIT_SUCCESS); diff --git a/src/libserver/CMakeLists.txt b/src/libserver/CMakeLists.txt index 4f3b9a260..53e59be8a 100644 --- a/src/libserver/CMakeLists.txt +++ b/src/libserver/CMakeLists.txt @@ -9,6 +9,7 @@ SET(LIBRSPAMDSERVERSRC ${CMAKE_CURRENT_SOURCE_DIR}/dynamic_cfg.c ${CMAKE_CURRENT_SOURCE_DIR}/events.c ${CMAKE_CURRENT_SOURCE_DIR}/fuzzy_backend.c + ${CMAKE_CURRENT_SOURCE_DIR}/fuzzy_backend_redis.c ${CMAKE_CURRENT_SOURCE_DIR}/fuzzy_backend_sqlite.c ${CMAKE_CURRENT_SOURCE_DIR}/html.c ${CMAKE_CURRENT_SOURCE_DIR}/monitored.c diff --git a/src/libserver/fuzzy_backend.c b/src/libserver/fuzzy_backend.c index 36f448989..12c506eb5 100644 --- a/src/libserver/fuzzy_backend.c +++ b/src/libserver/fuzzy_backend.c @@ -17,16 +17,18 @@ #include "config.h" #include "fuzzy_backend.h" #include "fuzzy_backend_sqlite.h" +#include "fuzzy_backend_redis.h" +#include "cfg_file.h" #define DEFAULT_EXPIRE 172800L enum rspamd_fuzzy_backend_type { RSPAMD_FUZZY_BACKEND_SQLITE = 0, - // RSPAMD_FUZZY_BACKEND_REDIS + RSPAMD_FUZZY_BACKEND_REDIS = 1, }; static void* rspamd_fuzzy_backend_init_sqlite (struct rspamd_fuzzy_backend *bk, - const ucl_object_t *obj, GError **err); + const ucl_object_t *obj, struct rspamd_config *cfg, GError **err); static void rspamd_fuzzy_backend_check_sqlite (struct rspamd_fuzzy_backend *bk, const struct rspamd_fuzzy_cmd *cmd, rspamd_fuzzy_check_cb cb, void *ud, @@ -51,6 +53,7 @@ static void rspamd_fuzzy_backend_close_sqlite (struct rspamd_fuzzy_backend *bk, struct rspamd_fuzzy_backend_subr { void* (*init) (struct rspamd_fuzzy_backend *bk, const ucl_object_t *obj, + struct rspamd_config *cfg, GError **err); void (*check) (struct rspamd_fuzzy_backend *bk, const struct rspamd_fuzzy_cmd *cmd, @@ -105,7 +108,7 @@ rspamd_fuzzy_backend_quark (void) static void* rspamd_fuzzy_backend_init_sqlite (struct rspamd_fuzzy_backend *bk, - const ucl_object_t *obj, GError **err) + const ucl_object_t *obj, struct rspamd_config *cfg, GError **err) { const ucl_object_t *elt; @@ -249,7 +252,9 @@ rspamd_fuzzy_backend_close_sqlite (struct rspamd_fuzzy_backend *bk, struct rspamd_fuzzy_backend * rspamd_fuzzy_backend_create (struct event_base *ev_base, - const ucl_object_t *config, GError **err) + const ucl_object_t *config, + struct rspamd_config *cfg, + GError **err) { struct rspamd_fuzzy_backend *bk; enum rspamd_fuzzy_backend_type type = RSPAMD_FUZZY_BACKEND_SQLITE; @@ -263,6 +268,9 @@ rspamd_fuzzy_backend_create (struct event_base *ev_base, if (strcmp (ucl_object_tostring (elt), "sqlite") == 0) { type = RSPAMD_FUZZY_BACKEND_SQLITE; } + else if (strcmp (ucl_object_tostring (elt), "redis") == 0) { + type = RSPAMD_FUZZY_BACKEND_REDIS; + } else { g_set_error (err, rspamd_fuzzy_backend_quark (), EINVAL, "invalid backend type: %s", @@ -284,7 +292,7 @@ rspamd_fuzzy_backend_create (struct event_base *ev_base, bk->type = type; bk->subr = &fuzzy_subrs[type]; - if ((bk->subr_ud = bk->subr->init (bk, config, err)) == NULL) { + if ((bk->subr_ud = bk->subr->init (bk, config, cfg, err)) == NULL) { g_slice_free1 (sizeof (*bk), bk); } diff --git a/src/libserver/fuzzy_backend.h b/src/libserver/fuzzy_backend.h index a9385c2f6..21b873581 100644 --- a/src/libserver/fuzzy_backend.h +++ b/src/libserver/fuzzy_backend.h @@ -21,6 +21,7 @@ #include "fuzzy_wire.h" struct rspamd_fuzzy_backend; +struct rspamd_config; /* * Callbacks for fuzzy methods @@ -39,7 +40,9 @@ typedef gboolean (*rspamd_fuzzy_periodic_cb) (void *ud); * @return */ struct rspamd_fuzzy_backend * rspamd_fuzzy_backend_create (struct event_base *ev_base, - const ucl_object_t *config, GError **err); + const ucl_object_t *config, + struct rspamd_config *cfg, + GError **err); /** diff --git a/src/libserver/fuzzy_backend_redis.c b/src/libserver/fuzzy_backend_redis.c new file mode 100644 index 000000000..a5e9ea846 --- /dev/null +++ b/src/libserver/fuzzy_backend_redis.c @@ -0,0 +1,175 @@ +/*- + * Copyright 2016 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "config.h" +#include "fuzzy_backend.h" +#include "fuzzy_backend_redis.h" +#include "redis_pool.h" +#include "contrib/hiredis/hiredis.h" +#include "contrib/hiredis/async.h" + +#define REDIS_DEFAULT_PORT 6379 +#define REDIS_DEFAULT_OBJECT "fuzzy" +#define REDIS_DEFAULT_TIMEOUT 2.0 + +struct rspamd_fuzzy_backend_redis { + struct upstream_list *read_servers; + struct upstream_list *write_servers; + const gchar *redis_object; + const gchar *password; + const gchar *dbname; + gdouble timeout; +}; + +static gboolean +rspamd_redis_try_ucl (struct rspamd_fuzzy_backend_redis *backend, + const ucl_object_t *obj, + struct rspamd_config *cfg) +{ + const ucl_object_t *elt, *relt; + + elt = ucl_object_lookup_any (obj, "read_servers", "servers", NULL); + + if (elt == NULL) { + return FALSE; + } + + backend->read_servers = rspamd_upstreams_create (cfg->ups_ctx); + if (!rspamd_upstreams_from_ucl (backend->read_servers, elt, + REDIS_DEFAULT_PORT, NULL)) { + msg_err_config ("cannot get read servers configuration"); + return FALSE; + } + + relt = elt; + + elt = ucl_object_lookup (obj, "write_servers"); + if (elt == NULL) { + /* Use read servers as write ones */ + g_assert (relt != NULL); + backend->write_servers = rspamd_upstreams_create (cfg->ups_ctx); + if (!rspamd_upstreams_from_ucl (backend->write_servers, relt, + REDIS_DEFAULT_PORT, NULL)) { + msg_err_config ("cannot get write servers configuration"); + return FALSE; + } + } + else { + backend->write_servers = rspamd_upstreams_create (cfg->ups_ctx); + if (!rspamd_upstreams_from_ucl (backend->write_servers, elt, + REDIS_DEFAULT_PORT, NULL)) { + msg_err_config ("cannot get write servers configuration"); + rspamd_upstreams_destroy (backend->write_servers); + backend->write_servers = NULL; + } + } + + elt = ucl_object_lookup (obj, "prefix"); + if (elt == NULL || ucl_object_type (elt) != UCL_STRING) { + backend->redis_object = REDIS_DEFAULT_OBJECT; + } + else { + backend->redis_object = ucl_object_tostring (elt); + } + + elt = ucl_object_lookup (obj, "timeout"); + if (elt) { + backend->timeout = ucl_object_todouble (elt); + } + else { + backend->timeout = REDIS_DEFAULT_TIMEOUT; + } + + elt = ucl_object_lookup (obj, "password"); + if (elt) { + backend->password = ucl_object_tostring (elt); + } + else { + backend->password = NULL; + } + + elt = ucl_object_lookup_any (obj, "db", "database", "dbname", NULL); + if (elt) { + backend->dbname = ucl_object_tostring (elt); + } + else { + backend->dbname = NULL; + } + + return TRUE; +} + +void* +rspamd_fuzzy_backend_init_redis (struct rspamd_fuzzy_backend *bk, + const ucl_object_t *obj, struct rspamd_config *cfg, GError **err) +{ + +} + +void +rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk, + const struct rspamd_fuzzy_cmd *cmd, + rspamd_fuzzy_check_cb cb, void *ud, + void *subr_ud) +{ + +} + +void +rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk, + GQueue *updates, const gchar *src, + rspamd_fuzzy_update_cb cb, void *ud, + void *subr_ud) +{ + +} + +void +rspamd_fuzzy_backend_count_redis (struct rspamd_fuzzy_backend *bk, + rspamd_fuzzy_count_cb cb, void *ud, + void *subr_ud) +{ + +} +void +rspamd_fuzzy_backend_version_redis (struct rspamd_fuzzy_backend *bk, + const gchar *src, + rspamd_fuzzy_version_cb cb, void *ud, + void *subr_ud) +{ + +} + +const gchar* +rspamd_fuzzy_backend_id_redis (struct rspamd_fuzzy_backend *bk, + void *subr_ud) +{ + +} + +void +rspamd_fuzzy_backend_expire_redis (struct rspamd_fuzzy_backend *bk, + void *subr_ud) +{ + +} + +void +rspamd_fuzzy_backend_close_redis (struct rspamd_fuzzy_backend *bk, + void *subr_ud) +{ + +} diff --git a/src/libserver/fuzzy_backend_redis.h b/src/libserver/fuzzy_backend_redis.h new file mode 100644 index 000000000..083bccafe --- /dev/null +++ b/src/libserver/fuzzy_backend_redis.h @@ -0,0 +1,49 @@ +/*- + * Copyright 2016 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef SRC_LIBSERVER_FUZZY_BACKEND_REDIS_H_ +#define SRC_LIBSERVER_FUZZY_BACKEND_REDIS_H_ + +#include "config.h" +#include "fuzzy_backend.h" + +/* + * Subroutines for fuzzy_backend + */ +void* rspamd_fuzzy_backend_init_redis (struct rspamd_fuzzy_backend *bk, + const ucl_object_t *obj, struct rspamd_config *cfg, GError **err); +void rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk, + const struct rspamd_fuzzy_cmd *cmd, + rspamd_fuzzy_check_cb cb, void *ud, + void *subr_ud); +void rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk, + GQueue *updates, const gchar *src, + rspamd_fuzzy_update_cb cb, void *ud, + void *subr_ud); +void rspamd_fuzzy_backend_count_redis (struct rspamd_fuzzy_backend *bk, + rspamd_fuzzy_count_cb cb, void *ud, + void *subr_ud); +void rspamd_fuzzy_backend_version_redis (struct rspamd_fuzzy_backend *bk, + const gchar *src, + rspamd_fuzzy_version_cb cb, void *ud, + void *subr_ud); +const gchar* rspamd_fuzzy_backend_id_redis (struct rspamd_fuzzy_backend *bk, + void *subr_ud); +void rspamd_fuzzy_backend_expire_redis (struct rspamd_fuzzy_backend *bk, + void *subr_ud); +void rspamd_fuzzy_backend_close_redis (struct rspamd_fuzzy_backend *bk, + void *subr_ud); + +#endif /* SRC_LIBSERVER_FUZZY_BACKEND_REDIS_H_ */