Browse Source

[Minor] Skeleton for redis fuzzy backend

tags/1.4.0
Vsevolod Stakhov 7 years ago
parent
commit
f206fff327

+ 2
- 2
src/fuzzy_storage.c View File

@@ -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);

+ 1
- 0
src/libserver/CMakeLists.txt View File

@@ -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

+ 13
- 5
src/libserver/fuzzy_backend.c View File

@@ -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);
}


+ 4
- 1
src/libserver/fuzzy_backend.h View File

@@ -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);


/**

+ 175
- 0
src/libserver/fuzzy_backend_redis.c View File

@@ -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)
{

}

+ 49
- 0
src/libserver/fuzzy_backend_redis.h View File

@@ -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_ */

Loading…
Cancel
Save