#include "libstat/stat_api.h"
#include "rspamd.h"
#include "libserver/worker_util.h"
+#include "worker_private.h"
#include "lua/lua_common.h"
#include "cryptobox.h"
#include "ottery.h"
struct rspamd_rrd_file *rrd;
struct event save_stats_event;
struct rspamd_lang_detector *lang_det;
+ gdouble task_timeout;
};
struct rspamd_controller_plugin_cbdata {
goto end;
}
+ if (ctx->task_timeout > 0.0) {
+ struct timeval task_tv;
+
+ event_set (&task->timeout_ev, -1, EV_TIMEOUT, rspamd_task_timeout,
+ task);
+ event_base_set (ctx->ev_base, &task->timeout_ev);
+ double_to_tv (ctx->task_timeout, &task_tv);
+ event_add (&task->timeout_ev, &task_tv);
+ }
+
end:
session->task = task;
rspamd_session_pending (task->s);
ctx->magic = rspamd_controller_ctx_magic;
ctx->timeout = DEFAULT_WORKER_IO_TIMEOUT;
+ ctx->task_timeout = NAN;
rspamd_rcl_register_worker_option (cfg,
type,
0,
"Directory where controller saves server's statistics between restarts");
+ rspamd_rcl_register_worker_option (cfg,
+ type,
+ "task_timeout",
+ rspamd_rcl_parse_struct_time,
+ ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx,
+ task_timeout),
+ RSPAMD_CL_FLAG_TIME_FLOAT,
+ "Maximum task processing time, default: 8.0 seconds");
+
return ctx;
}
rspamd_strcase_equal, g_free,
rspamd_plugin_cbdata_dtor);
+ if (isnan (ctx->task_timeout)) {
+ if (isnan (ctx->cfg->task_timeout)) {
+ ctx->task_timeout = 0;
+ }
+ else {
+ ctx->task_timeout = ctx->cfg->task_timeout;
+ }
+ }
+
if (ctx->secure_ip != NULL) {
rspamd_config_radix_from_ucl (ctx->cfg, ctx->secure_ip,
"Allow unauthenticated requests from these addresses",
gboolean disable_lua_squeeze; /**< Disable lua rules squeezing */
gboolean own_lua_state; /**< True if we have created lua_state internally */
- gsize max_diff; /**< maximum diff size for text parts */
gsize max_cores_size; /**< maximum size occupied by rspamd core files */
gsize max_cores_count; /**< maximum number of core files */
gchar *cores_dir; /**< directory for core files */
gsize max_pic_size; /**< maximum size for a picture to process */
gsize images_cache_size; /**< size of LRU cache for DCT data from images */
gint default_max_shots; /**< default maximum count of symbols hits permitted (-1 for unlimited) */
+ gdouble task_timeout; /**< maximum message processing time */
enum rspamd_log_type log_type; /**< log type */
gint log_facility; /**< log facility in case of syslog */
guint32 log_buf_size; /**< length of log buffer */
const ucl_object_t *debug_ip_map; /**< turn on debugging for specified ip addresses */
gboolean log_urls; /**< whether we should log URLs */
- GList *debug_symbols; /**< symbols to debug */
GHashTable *debug_modules; /**< logging modules to debug */
struct rspamd_cryptobox_pubkey *log_encryption_key; /**< encryption key for logs */
guint log_flags; /**< logging flags */
G_STRUCT_OFFSET (struct rspamd_config, debug_ip_map),
0,
"Enable debugging log for the specified IP addresses");
- rspamd_rcl_add_default_handler (sub,
- "debug_symbols",
- rspamd_rcl_parse_struct_string_list,
- G_STRUCT_OFFSET (struct rspamd_config, debug_symbols),
- 0,
- "Enable debug for the specified symbols");
rspamd_rcl_add_default_handler (sub,
"debug_modules",
rspamd_rcl_parse_struct_string_list,
G_STRUCT_OFFSET (struct rspamd_config, filters),
0,
"List of internal filters enabled");
- rspamd_rcl_add_default_handler (sub,
- "max_diff",
- rspamd_rcl_parse_struct_integer,
- G_STRUCT_OFFSET (struct rspamd_config, max_diff),
- RSPAMD_CL_FLAG_INT_SIZE,
- "Legacy option, do not use");
rspamd_rcl_add_default_handler (sub,
"map_watch_interval",
rspamd_rcl_parse_struct_time,
G_STRUCT_OFFSET (struct rspamd_config, max_sessions_cache),
0,
"Maximum number of sessions in cache before warning (default: 100)");
+ rspamd_rcl_add_default_handler (sub,
+ "task_timeout",
+ rspamd_rcl_parse_struct_time,
+ G_STRUCT_OFFSET (struct rspamd_config, task_timeout),
+ RSPAMD_CL_FLAG_TIME_FLOAT,
+ "Maximum time for checking a message");
+ rspamd_rcl_add_default_handler (sub,
+ "check_timeout",
+ rspamd_rcl_parse_struct_time,
+ G_STRUCT_OFFSET (struct rspamd_config, task_timeout),
+ RSPAMD_CL_FLAG_TIME_FLOAT,
+ "Maximum time for checking a message (alias for task_timeout)");
/* Neighbours configuration */
rspamd_rcl_add_section_doc (&sub->subsections, "neighbours", "name",
#define DEFAULT_MAX_SHOTS 100
#define DEFAULT_MAX_SESSIONS 100
#define DEFAULT_MAX_WORKERS 4
+/* Timeout for task processing */
+#define DEFAULT_TASK_TIMEOUT 8.0
struct rspamd_ucl_map_cbdata {
struct rspamd_config *cfg;
/* 16 sockets per DNS server */
cfg->dns_io_per_server = 16;
- /* 20 Kb */
- cfg->max_diff = 20480;
+ /* Disable timeout */
+ cfg->task_timeout = DEFAULT_TASK_TIMEOUT;
+
rspamd_config_init_metric (cfg);
cfg->composite_symbols =
event_add (&task->timeout_ev, &task_tv);
}
+ if (session->ctx->has_self_scan) {
+ if (!isnan (session->ctx->cfg->task_timeout) &&
+ session->ctx->cfg->task_timeout > 0) {
+ struct timeval task_tv;
+
+ event_set (&task->timeout_ev, -1, EV_TIMEOUT, rspamd_task_timeout,
+ task);
+ event_base_set (session->ctx->ev_base, &task->timeout_ev);
+ double_to_tv (session->ctx->default_upstream->timeout, &task_tv);
+ event_add (&task->timeout_ev, &task_tv);
+ }
+ }
+
session->master_conn->task = task;
rspamd_task_process (task, RSPAMD_TASK_PROCESS_ALL);
#include "utlist.h"
#include "libutil/http_private.h"
#include "libmime/lang_detection.h"
+#include <math.h>
#include "unix-std.h"
#include "lua/lua_common.h"
/* 60 seconds for worker's IO */
#define DEFAULT_WORKER_IO_TIMEOUT 60000
-/* Timeout for task processing */
-#define DEFAULT_TASK_TIMEOUT 8.0
gpointer init_worker (struct rspamd_config *cfg);
void start_worker (struct rspamd_worker *worker);
ctx->is_mime = TRUE;
ctx->timeout = DEFAULT_WORKER_IO_TIMEOUT;
ctx->cfg = cfg;
- ctx->task_timeout = DEFAULT_TASK_TIMEOUT;
+ ctx->task_timeout = NAN;
rspamd_rcl_register_worker_option (cfg,
type,
G_STRUCT_OFFSET (struct rspamd_worker_ctx,
task_timeout),
RSPAMD_CL_FLAG_TIME_FLOAT,
- "Maximum task processing time, default: "
- G_STRINGIFY(DEFAULT_TASK_TIMEOUT)
- " seconds");
+ "Maximum task processing time, default: 8.0 seconds");
rspamd_rcl_register_worker_option (cfg,
type,
rspamd_symcache_start_refresh (worker->srv->cfg->cache, ctx->ev_base,
worker);
+ if (isnan (ctx->task_timeout)) {
+ if (isnan (ctx->cfg->task_timeout)) {
+ ctx->task_timeout = 0;
+ }
+ else {
+ ctx->task_timeout = ctx->cfg->task_timeout;
+ }
+ }
+
ctx->resolver = dns_resolver_init (worker->srv->logger,
ctx->ev_base,
worker->srv->cfg);