aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2011-11-30 17:48:08 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2011-11-30 17:48:08 +0300
commit632e13627f8ad4ebf632a8b616c62dc6622d375e (patch)
tree91654d26d1e76d8c677b0dec7be8059c0c1f86ef /src
parent2975827e40a8e7c6e820c42921fb8792cf637450 (diff)
downloadrspamd-632e13627f8ad4ebf632a8b616c62dc6622d375e.tar.gz
rspamd-632e13627f8ad4ebf632a8b616c62dc6622d375e.zip
Check for SIGUSR1 by libevent to avoid signals collisions.
Remove greylist_storage as it was never used and is actually replaced with basic kvstorage.
Diffstat (limited to 'src')
-rw-r--r--src/cfg_xml.c4
-rw-r--r--src/controller.c32
-rw-r--r--src/fuzzy_storage.c30
-rw-r--r--src/greylist.h48
-rw-r--r--src/greylist_storage.c359
-rw-r--r--src/lmtp.c32
-rw-r--r--src/main.c8
-rw-r--r--src/main.h5
-rw-r--r--src/smtp.c32
-rw-r--r--src/util.c5
-rw-r--r--src/util.h1
-rw-r--r--src/worker.c34
12 files changed, 123 insertions, 467 deletions
diff --git a/src/cfg_xml.c b/src/cfg_xml.c
index 3709b496a..4b3a7970d 100644
--- a/src/cfg_xml.c
+++ b/src/cfg_xml.c
@@ -916,10 +916,6 @@ worker_handle_type (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GH
wrk->type = TYPE_FUZZY;
wrk->has_socket = FALSE;
}
- else if (g_ascii_strcasecmp (data, "greylist") == 0) {
- wrk->type = TYPE_GREYLIST;
- wrk->has_socket = FALSE;
- }
else if (g_ascii_strcasecmp (data, "keystorage") == 0) {
wrk->type = TYPE_KVSTORAGE;
wrk->has_socket = TRUE;
diff --git a/src/controller.c b/src/controller.c
index 07eeef0ff..206e17f82 100644
--- a/src/controller.c
+++ b/src/controller.c
@@ -116,9 +116,6 @@ sig_handler (gint signo, siginfo_t *info, void *unused)
{
struct timeval tv;
switch (signo) {
- case SIGUSR1:
- reopen_log (rspamd_main->logger);
- break;
case SIGINT:
case SIGTERM:
if (!wanna_die) {
@@ -136,20 +133,34 @@ sig_handler (gint signo, siginfo_t *info, void *unused)
}
static void
-sigusr_handler (gint fd, short what, void *arg)
+sigusr2_handler (gint fd, short what, void *arg)
{
struct rspamd_worker *worker = (struct rspamd_worker *)arg;
/* Do not accept new connections, preparing to end worker's process */
struct timeval tv;
tv.tv_sec = 2;
tv.tv_usec = 0;
- event_del (&worker->sig_ev);
+ event_del (&worker->sig_ev_usr1);
+ event_del (&worker->sig_ev_usr2);
event_del (&worker->bind_ev);
msg_info ("controller's shutdown is pending in %d sec", 2);
event_loopexit (&tv);
return;
}
+/*
+ * Reopen log is designed by sending sigusr1 to active workers and pending shutdown of them
+ */
+static void
+sigusr1_handler (gint fd, short what, void *arg)
+{
+ struct rspamd_worker *worker = (struct rspamd_worker *) arg;
+
+ reopen_log (worker->srv->logger);
+
+ return;
+}
+
static void
free_session (void *ud)
{
@@ -1231,9 +1242,14 @@ start_controller (struct rspamd_worker *worker)
sigprocmask (SIG_UNBLOCK, &signals.sa_mask, NULL);
/* SIGUSR2 handler */
- signal_set (&worker->sig_ev, SIGUSR2, sigusr_handler, (void *)worker);
- event_base_set (ctx->ev_base, &worker->sig_ev);
- signal_add (&worker->sig_ev, NULL);
+ signal_set (&worker->sig_ev_usr2, SIGUSR2, sigusr2_handler, (void *) worker);
+ event_base_set (ctx->ev_base, &worker->sig_ev_usr2);
+ signal_add (&worker->sig_ev_usr2, NULL);
+
+ /* SIGUSR1 handler */
+ signal_set (&worker->sig_ev_usr1, SIGUSR1, sigusr1_handler, (void *) worker);
+ event_base_set (ctx->ev_base, &worker->sig_ev_usr1);
+ signal_add (&worker->sig_ev_usr1, NULL);
start_time = time (NULL);
diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c
index b9b05cb87..408d39960 100644
--- a/src/fuzzy_storage.c
+++ b/src/fuzzy_storage.c
@@ -102,9 +102,6 @@ sig_handler (gint signo, siginfo_t *info, void *unused)
#endif
{
switch (signo) {
- case SIGUSR1:
- reopen_log (rspamd_main->logger);
- break;
case SIGINT:
case SIGTERM:
/* Ignore SIGINT and SIGTERM as they are handled by libevent handler */
@@ -251,7 +248,7 @@ sigterm_handler (gint fd, short what, void *arg)
* Config reload is designed by sending sigusr to active workers and pending shutdown of them
*/
static void
-sigusr_handler (gint fd, short what, void *arg)
+sigusr2_handler (gint fd, short what, void *arg)
{
struct rspamd_worker *worker = (struct rspamd_worker *)arg;
/* Do not accept new connections, preparing to end worker's process */
@@ -261,7 +258,8 @@ sigusr_handler (gint fd, short what, void *arg)
ctx = worker->ctx;
tv.tv_sec = SOFT_SHUTDOWN_TIME;
tv.tv_usec = 0;
- event_del (&worker->sig_ev);
+ event_del (&worker->sig_ev_usr1);
+ event_del (&worker->sig_ev_usr2);
event_del (&worker->bind_ev);
close (worker->cf->listen_sock);
msg_info ("worker's shutdown is pending in %d sec", SOFT_SHUTDOWN_TIME);
@@ -271,6 +269,19 @@ sigusr_handler (gint fd, short what, void *arg)
return;
}
+/*
+ * Reopen log is designed by sending sigusr1 to active workers and pending shutdown of them
+ */
+static void
+sigusr1_handler (gint fd, short what, void *arg)
+{
+ struct rspamd_worker *worker = (struct rspamd_worker *) arg;
+
+ reopen_log (worker->srv->logger);
+
+ return;
+}
+
static gboolean
read_hashes_file (struct rspamd_worker *wrk)
{
@@ -790,8 +801,13 @@ start_fuzzy_storage (struct rspamd_worker *worker)
sigprocmask (SIG_UNBLOCK, &signals.sa_mask, NULL);
/* SIGUSR2 handler */
- signal_set (&worker->sig_ev, SIGUSR2, sigusr_handler, (void *)worker);
- signal_add (&worker->sig_ev, NULL);
+ signal_set (&worker->sig_ev_usr2, SIGUSR2, sigusr2_handler, (void *) worker);
+ signal_add (&worker->sig_ev_usr2, NULL);
+
+ /* SIGUSR1 handler */
+ signal_set (&worker->sig_ev_usr1, SIGUSR1, sigusr1_handler, (void *) worker);
+ signal_add (&worker->sig_ev_usr1, NULL);
+
signal_set (&sev, SIGTERM, sigterm_handler, (void *)worker);
signal_add (&sev, NULL);
diff --git a/src/greylist.h b/src/greylist.h
deleted file mode 100644
index e113d2e94..000000000
--- a/src/greylist.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef RSPAMD_GREYLIST_H
-#define RSPAMD_GREYLIST_H
-
-#include "config.h"
-
-#define CHECKSUM_SIZE 16
-/* 5 minutes */
-#define DEFAULT_GREYLIST_TIME 300
-/* 2 days */
-#define DEFAULT_EXPIRE_TIME 60 * 60 * 24 * 2
-
-/**
- * Item in storage
- */
-struct rspamd_grey_item {
- time_t age; /**< age of checksum */
- guint8 data[CHECKSUM_SIZE]; /**< checksum of triplet */
-};
-
-/**
- * Protocol command that is used to work with greylist storage
- */
-struct rspamd_grey_command {
- enum {
- GREY_CMD_ADD = 0,
- GREY_CMD_CHECK,
- GREY_CMD_DEL
- } cmd;
- gint version;
- guint8 data[CHECKSUM_SIZE];
-};
-
-/**
- * Reply packet
- */
-struct rspamd_grey_reply {
- enum {
- GREY_OK = 0,
- GREY_GREYLISTED,
- GREY_EXPIRED,
- GREY_NOT_FOUND,
- GREY_ERR
- } reply;
-};
-
-typedef void (*greylist_cb_t) (gboolean greylisted, struct worker_task *task, gpointer ud);
-
-#endif
diff --git a/src/greylist_storage.c b/src/greylist_storage.c
deleted file mode 100644
index 42e94320b..000000000
--- a/src/greylist_storage.c
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright (c) 2009, Rambler media
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY Rambler media ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL Rambler BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Store greylisting data in memory
- */
-
-#include "config.h"
-#include "util.h"
-#include "main.h"
-#include "protocol.h"
-#include "upstream.h"
-#include "cfg_file.h"
-#include "url.h"
-#include "modules.h"
-#include "message.h"
-#include "greylist.h"
-
-#ifdef WITH_JUDY
-#include <Judy.h>
-#endif
-
-/* Number of insuccessfull bind retries */
-#define MAX_RETRIES 40
-
-struct greylist_ctx {
-#ifdef WITH_JUDY
- Pvoid_t jtree;
-#else
- GTree *tree;
-#endif
- time_t greylist_time;
- time_t expire_time;
-};
-
-#ifndef HAVE_SA_SIGINFO
-static void
-sig_handler (gint signo)
-#else
-static void
-sig_handler (gint signo, siginfo_t *info, void *unused)
-#endif
-{
- switch (signo) {
- case SIGINT:
- /* Ignore SIGINT as we should got SIGTERM after it anyway */
- return;
- case SIGTERM:
-#ifdef WITH_PROFILER
- exit (0);
-#else
- _exit (1);
-#endif
- break;
- }
-}
-
-static void
-sigterm_handler (gint fd, short what, void *arg)
-{
- struct rspamd_worker *worker = (struct rspamd_worker *)arg;
- static struct timeval tv = {
- .tv_sec = 0,
- .tv_usec = 0
- };
-
- close (worker->cf->listen_sock);
- (void)event_loopexit (&tv);
-}
-
-/*
- * Config reload is designed by sending sigusr to active workers and pending shutdown of them
- */
-static void
-sigusr_handler (gint fd, short what, void *arg)
-{
- struct rspamd_worker *worker = (struct rspamd_worker *)arg;
- /* Do not accept new connections, preparing to end worker's process */
- struct timeval tv;
-
- tv.tv_sec = SOFT_SHUTDOWN_TIME;
- tv.tv_usec = 0;
- event_del (&worker->sig_ev);
- event_del (&worker->bind_ev);
- close (worker->cf->listen_sock);
- msg_info ("worker's shutdown is pending in %d sec", SOFT_SHUTDOWN_TIME);
- event_loopexit (&tv);
- return;
-}
-
-struct greylist_session {
- struct rspamd_worker *worker;
- gint fd;
- socklen_t salen;
- struct sockaddr_storage sa;
- guint8 *pos;
- struct rspamd_grey_command cmd;
-};
-
-static gint
-grey_cmp (gconstpointer a, gconstpointer b, gpointer unused)
-{
- return memcmp (a, b, CHECKSUM_SIZE);
-}
-
-static gint
-greylist_process_add_command (struct rspamd_grey_command *cmd, struct greylist_ctx *ctx)
-{
- struct rspamd_grey_reply reply;
- struct rspamd_grey_item *item, **pitem = NULL;
-
- item = g_malloc (sizeof (struct rspamd_grey_item));
- item->age = time (NULL);
- memcpy (item->data, cmd->data, CHECKSUM_SIZE);
-#ifdef WITH_JUDY
-
- JHSI (pitem, ctx->jtree, item->data, CHECKSUM_SIZE);
- if (pitem == PJERR) {
- reply.reply = GREY_ERR;
- }
- else if (*pitem != 0) {
- g_free (*pitem);
- *pitem = item;
- }
- else {
- *pitem = item;
- }
-#else
- g_tree_insert (ctx->tree, item->data, item);
- reply.reply = GREY_OK;
- (void)pitem;
-#endif
-
- return reply.reply;
-}
-
-static gint
-greylist_process_delete_command (struct rspamd_grey_command *cmd, struct greylist_ctx *ctx)
-{
- struct rspamd_grey_reply reply;
-#ifdef WITH_JUDY
- gint rc;
- struct rspamd_grey_item **pitem = NULL;
-
- JHSG (pitem, ctx->jtree, cmd->data, CHECKSUM_SIZE);
- if (pitem != NULL) {
- g_free (*pitem);
- JHSD (rc, ctx->jtree, cmd->data, CHECKSUM_SIZE);
- if (rc == 1) {
- reply.reply = GREY_OK;
- }
- else {
- reply.reply = GREY_NOT_FOUND;
- }
- }
- else {
- reply.reply = GREY_NOT_FOUND;
- }
-#else
- if(g_tree_remove (ctx->tree, cmd->data)) {
- reply.reply = GREY_OK;
- }
- else {
- reply.reply = GREY_NOT_FOUND;
- }
-#endif
- return reply.reply;
-}
-
-static gint
-greylist_process_check_command (struct rspamd_grey_command *cmd, struct greylist_ctx *ctx)
-{
- struct rspamd_grey_reply reply;
- struct rspamd_grey_item *item = NULL, **pitem = NULL;
- time_t now;
-
- now = time (NULL);
-#ifdef WITH_JUDY
- JHSG (pitem, ctx->jtree, cmd->data, CHECKSUM_SIZE);
- if (pitem != NULL) {
- item = *pitem;
- }
-#else
- item = g_tree_lookup (ctx->tree, cmd->data);
- (void)pitem;
-#endif
- if (item) {
- if (now - item->age > ctx->expire_time) {
- /* Remove expired item */
- reply.reply = GREY_EXPIRED;
- greylist_process_delete_command (cmd, ctx);
- }
- else if (now - item->age > ctx->greylist_time) {
- reply.reply = GREY_OK;
- }
- else {
- reply.reply = GREY_GREYLISTED;
- }
- }
- else {
- reply.reply = GREY_NOT_FOUND;
- }
-
- return reply.reply;
-}
-
-#define CMD_PROCESS(x) \
-do { \
- reply.reply = greylist_process_##x##_command (&session->cmd, (struct greylist_ctx *)session->worker->ctx); \
- if (sendto (session->fd, &reply, sizeof (reply), 0, (struct sockaddr *)&session->sa, session->salen) == -1) { \
- msg_err ("error while writing reply: %s", strerror (errno)); \
- } \
-} while(0)
-
-static void
-process_greylist_command (struct greylist_session *session)
-{
- struct rspamd_grey_reply reply;
-
- switch (session->cmd.cmd) {
- case GREY_CMD_CHECK:
- CMD_PROCESS (check);
- break;
- case GREY_CMD_ADD:
- CMD_PROCESS (add);
- break;
- case GREY_CMD_DEL:
- CMD_PROCESS (delete);
- break;
- }
-}
-
-#undef CMD_PROCESS
-
-/*
- * Accept new connection and construct task
- */
-static void
-accept_greylist_socket (gint fd, short what, void *arg)
-{
- struct rspamd_worker *worker = (struct rspamd_worker *)arg;
- struct greylist_session session;
- ssize_t r;
-
- session.worker = worker;
- session.fd = fd;
- session.pos = (guint8 *) & session.cmd;
- session.salen = sizeof (session.sa);
-
- /* Got some data */
- if (what == EV_READ) {
- if ((r = recvfrom (fd, session.pos, sizeof (struct rspamd_grey_command), MSG_WAITALL, (struct sockaddr *)&session.sa, &session.salen)) == -1) {
- msg_err ("got error while reading from socket: %d, %s", errno, strerror (errno));
- return;
- }
- else if (r == sizeof (struct rspamd_grey_command)) {
- /* Assume that the whole command was read */
- process_greylist_command (&session);
- }
- else {
- msg_err ("got incomplete data while reading from socket: %d, %s", errno, strerror (errno));
- return;
- }
- }
-}
-
-static gboolean
-config_greylist_worker (struct rspamd_worker *worker)
-{
- struct greylist_ctx *ctx;
- gchar *value;
-
- ctx = g_malloc0 (sizeof (struct greylist_ctx));
-#ifdef WITH_JUDY
- ctx->jtree = NULL;
-#else
- ctx->tree = g_tree_new_full (grey_cmp, NULL, NULL, g_free);
-#endif
-
- ctx->greylist_time = DEFAULT_GREYLIST_TIME;
- ctx->expire_time = DEFAULT_EXPIRE_TIME;
-
- if ((value = g_hash_table_lookup (worker->cf->params, "greylist_time")) != NULL) {
- ctx->greylist_time = cfg_parse_time (value, TIME_SECONDS) / 1000;
- }
- if ((value = g_hash_table_lookup (worker->cf->params, "expire_time")) != NULL) {
- ctx->expire_time = cfg_parse_time (value, TIME_SECONDS) / 1000;
- }
- worker->ctx = ctx;
-
- return TRUE;
-}
-
-/*
- * Start worker process
- */
-void
-start_greylist_storage (struct rspamd_worker *worker)
-{
- struct sigaction signals;
- struct event sev;
- gint retries = 0;
-
- worker->srv->pid = getpid ();
- worker->srv->type = TYPE_GREYLIST;
-
- event_init ();
-
- init_signals (&signals, sig_handler);
- sigprocmask (SIG_UNBLOCK, &signals.sa_mask, NULL);
-
- /* SIGUSR2 handler */
- signal_set (&worker->sig_ev, SIGUSR2, sigusr_handler, (void *)worker);
- signal_add (&worker->sig_ev, NULL);
- signal_set (&sev, SIGTERM, sigterm_handler, (void *)worker);
- signal_add (&sev, NULL);
-
- /* Accept event */
- while ((worker->cf->listen_sock = make_udp_socket (&worker->cf->bind_addr, worker->cf->bind_port, TRUE, TRUE)) == -1) {
- sleep (1);
- if (++retries > MAX_RETRIES) {
- msg_err ("cannot bind to socket, exiting");
- exit (EXIT_SUCCESS);
- }
- }
- event_set (&worker->bind_ev, worker->cf->listen_sock, EV_READ | EV_PERSIST, accept_greylist_socket, (void *)worker);
- event_add (&worker->bind_ev, NULL);
-
- gperf_profiler_init (worker->srv->cfg, "greylist");
-
- if (!config_greylist_worker (worker)) {
- msg_err ("cannot configure greylisting worker, exiting");
- exit (EXIT_SUCCESS);
- }
-
- event_loop (0);
- exit (EXIT_SUCCESS);
-}
diff --git a/src/lmtp.c b/src/lmtp.c
index 96dbb2bab..81b546d4f 100644
--- a/src/lmtp.c
+++ b/src/lmtp.c
@@ -47,9 +47,6 @@ sig_handler (gint signo, siginfo_t *info, void *unused)
#endif
{
switch (signo) {
- case SIGUSR1:
- reopen_log (rspamd_main->logger);
- break;
case SIGINT:
case SIGTERM:
_exit (1);
@@ -61,14 +58,15 @@ sig_handler (gint signo, siginfo_t *info, void *unused)
* Config reload is designed by sending sigusr to active workers and pending shutdown of them
*/
static void
-sigusr_handler (gint fd, short what, void *arg)
+sigusr2_handler (gint fd, short what, void *arg)
{
struct rspamd_worker *worker = (struct rspamd_worker *)arg;
/* Do not accept new connections, preparing to end worker's process */
struct timeval tv;
tv.tv_sec = SOFT_SHUTDOWN_TIME;
tv.tv_usec = 0;
- event_del (&worker->sig_ev);
+ event_del (&worker->sig_ev_usr1);
+ event_del (&worker->sig_ev_usr2);
event_del (&worker->bind_ev);
msg_info ("lmtp worker's shutdown is pending in %d sec", SOFT_SHUTDOWN_TIME);
event_loopexit (&tv);
@@ -76,6 +74,19 @@ sigusr_handler (gint fd, short what, void *arg)
}
/*
+ * Reopen log is designed by sending sigusr1 to active workers and pending shutdown of them
+ */
+static void
+sigusr1_handler (gint fd, short what, void *arg)
+{
+ struct rspamd_worker *worker = (struct rspamd_worker *) arg;
+
+ reopen_log (worker->srv->logger);
+
+ return;
+}
+
+/*
* Destructor for recipients list
*/
static void
@@ -284,9 +295,14 @@ start_lmtp_worker (struct rspamd_worker *worker)
sigprocmask (SIG_UNBLOCK, &signals.sa_mask, NULL);
/* SIGUSR2 handler */
- signal_set (&worker->sig_ev, SIGUSR2, sigusr_handler, (void *)worker);
- event_base_set (worker->ctx, &worker->sig_ev);
- signal_add (&worker->sig_ev, NULL);
+ signal_set (&worker->sig_ev_usr2, SIGUSR2, sigusr2_handler, (void *) worker);
+ event_base_set (worker->ctx, &worker->sig_ev_usr2);
+ signal_add (&worker->sig_ev_usr2, NULL);
+
+ /* SIGUSR1 handler */
+ signal_set (&worker->sig_ev_usr1, SIGUSR1, sigusr1_handler, (void *) worker);
+ event_base_set (worker->ctx, &worker->sig_ev_usr1);
+ signal_add (&worker->sig_ev_usr1, NULL);
/* Accept event */
event_set (&worker->bind_ev, worker->cf->listen_sock, EV_READ | EV_PERSIST, accept_socket, (void *)worker);
diff --git a/src/main.c b/src/main.c
index da6d76e48..f91bf9b34 100644
--- a/src/main.c
+++ b/src/main.c
@@ -374,12 +374,6 @@ fork_worker (struct rspamd_main *rspamd, struct worker_conf *cf)
msg_info ("starting fuzzy storage process %P", getpid ());
start_fuzzy_storage (cur);
break;
- case TYPE_GREYLIST:
- setproctitle ("greylist storage");
- rspamd_pidfile_close (rspamd->pfh);
- msg_info ("starting greylist storage process %P", getpid ());
- start_greylist_storage (cur);
- break;
case TYPE_KVSTORAGE:
setproctitle ("kv storage");
rspamd_pidfile_close (rspamd->pfh);
@@ -573,7 +567,7 @@ spawn_workers (struct rspamd_main *rspamd)
cf->listen_sock = listen_sock;
}
- if (cf->type == TYPE_FUZZY || cf->type == TYPE_GREYLIST) {
+ if (cf->type == TYPE_FUZZY) {
if (cf->count > 1) {
msg_err ("cannot spawn more than 1 fuzzy storage worker, so spawn one");
}
diff --git a/src/main.h b/src/main.h
index b7531fa83..c111752da 100644
--- a/src/main.h
+++ b/src/main.h
@@ -50,7 +50,8 @@ struct rspamd_worker {
gboolean pending; /**< if worker is pending to run */
struct rspamd_main *srv; /**< pointer to server structure */
enum process_type type; /**< process type */
- struct event sig_ev; /**< signals event */
+ struct event sig_ev_usr1; /**< signals event */
+ struct event sig_ev_usr2; /**< signals event */
struct event bind_ev; /**< socket events */
struct worker_conf *cf; /**< worker config data */
gpointer ctx; /**< worker's specific data */
@@ -272,8 +273,6 @@ gpointer init_worker (void);
void start_worker (struct rspamd_worker *worker);
gpointer init_controller (void);
void start_controller (struct rspamd_worker *worker);
-gpointer init_greylist (void);
-void start_greylist_storage (struct rspamd_worker *worker);
/**
* Register custom controller function
diff --git a/src/smtp.c b/src/smtp.c
index 3c6726d97..0c88df3b0 100644
--- a/src/smtp.c
+++ b/src/smtp.c
@@ -64,9 +64,6 @@ sig_handler (gint signo, siginfo_t *info, void *unused)
struct timeval tv;
switch (signo) {
- case SIGUSR1:
- reopen_log (rspamd_main->logger);
- break;
case SIGINT:
case SIGTERM:
if (!wanna_die) {
@@ -87,7 +84,7 @@ sig_handler (gint signo, siginfo_t *info, void *unused)
* Config reload is designed by sending sigusr to active workers and pending shutdown of them
*/
static void
-sigusr_handler (gint fd, short what, void *arg)
+sigusr2_handler (gint fd, short what, void *arg)
{
struct rspamd_worker *worker = (struct rspamd_worker *)arg;
/* Do not accept new connections, preparing to end worker's process */
@@ -95,7 +92,8 @@ sigusr_handler (gint fd, short what, void *arg)
if (! wanna_die) {
tv.tv_sec = SOFT_SHUTDOWN_TIME;
tv.tv_usec = 0;
- event_del (&worker->sig_ev);
+ event_del (&worker->sig_ev_usr1);
+ event_del (&worker->sig_ev_usr2);
event_del (&worker->bind_ev);
msg_info ("worker's shutdown is pending in %d sec", SOFT_SHUTDOWN_TIME);
event_loopexit (&tv);
@@ -103,6 +101,19 @@ sigusr_handler (gint fd, short what, void *arg)
return;
}
+/*
+ * Reopen log is designed by sending sigusr1 to active workers and pending shutdown of them
+ */
+static void
+sigusr1_handler (gint fd, short what, void *arg)
+{
+ struct rspamd_worker *worker = (struct rspamd_worker *) arg;
+
+ reopen_log (worker->srv->logger);
+
+ return;
+}
+
static gboolean
call_stage_filters (struct smtp_session *session, enum rspamd_smtp_stage stage)
{
@@ -993,9 +1004,14 @@ start_smtp_worker (struct rspamd_worker *worker)
sigprocmask (SIG_UNBLOCK, &signals.sa_mask, NULL);
/* SIGUSR2 handler */
- signal_set (&worker->sig_ev, SIGUSR2, sigusr_handler, (void *)worker);
- event_base_set (ctx->ev_base, &worker->sig_ev);
- signal_add (&worker->sig_ev, NULL);
+ signal_set (&worker->sig_ev_usr2, SIGUSR2, sigusr2_handler, (void *) worker);
+ event_base_set (ctx->ev_base, &worker->sig_ev_usr2);
+ signal_add (&worker->sig_ev_usr2, NULL);
+
+ /* SIGUSR1 handler */
+ signal_set (&worker->sig_ev_usr1, SIGUSR1, sigusr1_handler, (void *) worker);
+ event_base_set (ctx->ev_base, &worker->sig_ev_usr1);
+ signal_add (&worker->sig_ev_usr1, NULL);
/* Accept event */
event_set (&worker->bind_ev, worker->cf->listen_sock, EV_READ | EV_PERSIST, accept_socket, (void *)worker);
diff --git a/src/util.c b/src/util.c
index b39adfec1..0fe899fe0 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1231,8 +1231,6 @@ process_to_str (enum process_type type)
return "worker";
case TYPE_FUZZY:
return "fuzzy";
- case TYPE_GREYLIST:
- return "greylist";
case TYPE_CONTROLLER:
return "controller";
case TYPE_LMTP:
@@ -1260,9 +1258,6 @@ str_to_process (const gchar *str)
else if (g_ascii_strcasecmp (str, "fuzzy") == 0) {
return TYPE_FUZZY;
}
- else if (g_ascii_strcasecmp (str, "greylist") == 0) {
- return TYPE_GREYLIST;
- }
else if (g_ascii_strcasecmp (str, "controller") == 0) {
return TYPE_CONTROLLER;
}
diff --git a/src/util.h b/src/util.h
index 9d3d82416..bbe49db67 100644
--- a/src/util.h
+++ b/src/util.h
@@ -25,7 +25,6 @@ enum process_type {
TYPE_LMTP,
TYPE_SMTP,
TYPE_FUZZY,
- TYPE_GREYLIST,
TYPE_KVSTORAGE,
TYPE_MAX=255
};
diff --git a/src/worker.c b/src/worker.c
index b3e56c13f..d1aeea859 100644
--- a/src/worker.c
+++ b/src/worker.c
@@ -109,9 +109,6 @@ sig_handler (gint signo, siginfo_t * info, void *unused)
struct timeval tv;
switch (signo) {
- case SIGUSR1:
- reopen_log (rspamd_main->logger);
- break;
case SIGINT:
case SIGTERM:
if (!wanna_die) {
@@ -129,10 +126,10 @@ sig_handler (gint signo, siginfo_t * info, void *unused)
}
/*
- * Config reload is designed by sending sigusr to active workers and pending shutdown of them
+ * Config reload is designed by sending sigusr2 to active workers and pending shutdown of them
*/
static void
-sigusr_handler (gint fd, short what, void *arg)
+sigusr2_handler (gint fd, short what, void *arg)
{
struct rspamd_worker *worker = (struct rspamd_worker *) arg;
/* Do not accept new connections, preparing to end worker's process */
@@ -141,7 +138,8 @@ sigusr_handler (gint fd, short what, void *arg)
if (!wanna_die) {
tv.tv_sec = SOFT_SHUTDOWN_TIME;
tv.tv_usec = 0;
- event_del (&worker->sig_ev);
+ event_del (&worker->sig_ev_usr1);
+ event_del (&worker->sig_ev_usr2);
event_del (&worker->bind_ev);
msg_info ("worker's shutdown is pending in %d sec", SOFT_SHUTDOWN_TIME);
event_loopexit (&tv);
@@ -149,6 +147,19 @@ sigusr_handler (gint fd, short what, void *arg)
return;
}
+/*
+ * Reopen log is designed by sending sigusr1 to active workers and pending shutdown of them
+ */
+static void
+sigusr1_handler (gint fd, short what, void *arg)
+{
+ struct rspamd_worker *worker = (struct rspamd_worker *) arg;
+
+ reopen_log (worker->srv->logger);
+
+ return;
+}
+
#ifndef BUILD_STATIC
static void
fin_custom_filters (struct worker_task *task)
@@ -651,9 +662,14 @@ start_worker (struct rspamd_worker *worker)
sigprocmask (SIG_UNBLOCK, &signals.sa_mask, NULL);
/* SIGUSR2 handler */
- signal_set (&worker->sig_ev, SIGUSR2, sigusr_handler, (void *) worker);
- event_base_set (ctx->ev_base, &worker->sig_ev);
- signal_add (&worker->sig_ev, NULL);
+ signal_set (&worker->sig_ev_usr2, SIGUSR2, sigusr2_handler, (void *) worker);
+ event_base_set (ctx->ev_base, &worker->sig_ev_usr2);
+ signal_add (&worker->sig_ev_usr2, NULL);
+
+ /* SIGUSR1 handler */
+ signal_set (&worker->sig_ev_usr1, SIGUSR1, sigusr1_handler, (void *) worker);
+ event_base_set (ctx->ev_base, &worker->sig_ev_usr1);
+ signal_add (&worker->sig_ev_usr1, NULL);
/* Accept event */
event_set (&worker->bind_ev, worker->cf->listen_sock, EV_READ | EV_PERSIST,