commit 985a09c: [Feature] Allow to specify different timeouts/retransmits for fuzzy rules

Vsevolod Stakhov vsevolod at highsecure.ru
Wed May 12 20:49:04 UTC 2021


Author: Vsevolod Stakhov
Date: 2021-05-12 20:15:19 +0100
URL: https://github.com/rspamd/rspamd/commit/985a09cc101b06c3fb14e3bc33400ae1628f4b6e

[Feature] Allow to specify different timeouts/retransmits for fuzzy rules

---
 src/plugins/fuzzy_check.c | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c
index a14c4f7b9..bd45fd8d0 100644
--- a/src/plugins/fuzzy_check.c
+++ b/src/plugins/fuzzy_check.c
@@ -50,7 +50,7 @@
 
 #define DEFAULT_SYMBOL "R_FUZZY_HASH"
 
-#define DEFAULT_IO_TIMEOUT 500
+#define DEFAULT_IO_TIMEOUT 1.0
 #define DEFAULT_RETRANSMITS 3
 #define DEFAULT_MAX_ERRORS 4
 #define DEFAULT_REVIVE_TIME 60
@@ -79,6 +79,7 @@ struct fuzzy_rule {
 	GPtrArray *fuzzy_headers;
 	GString *hash_key;
 	GString *shingles_key;
+	gdouble io_timeout;
 	struct rspamd_cryptobox_keypair *local_key;
 	struct rspamd_cryptobox_pubkey *peer_key;
 	double max_score;
@@ -88,6 +89,7 @@ struct fuzzy_rule {
 	gboolean no_share;
 	gboolean no_subject;
 	gint learn_condition_cb;
+	guint32 retransmits;
 	struct rspamd_hash_map_helper *skip_map;
 	struct fuzzy_ctx *ctx;
 	gint lua_id;
@@ -101,13 +103,13 @@ struct fuzzy_ctx {
 	const gchar *default_symbol;
 	struct rspamd_radix_map_helper *whitelist;
 	struct rspamd_keypair_cache *keypairs_cache;
-	guint32 io_timeout;
-	guint32 retransmits;
 	guint   max_errors;
 	gdouble revive_time;
+	gdouble io_timeout;
 	gint check_mime_part_ref; /* Lua callback */
 	gint process_rule_ref; /* Lua callback */
 	gint cleanup_rules_ref;
+	guint32 retransmits;
 	gboolean enabled;
 };
 
@@ -419,6 +421,20 @@ fuzzy_parse_rule (struct rspamd_config *cfg, const ucl_object_t *obj,
 		rule->max_score = ucl_obj_todouble (value);
 	}
 
+	if ((value = ucl_object_lookup (obj, "retransmits")) != NULL) {
+		rule->retransmits = ucl_obj_toint (value);
+	}
+	else {
+		rule->retransmits = fuzzy_module_ctx->retransmits;
+	}
+
+	if ((value = ucl_object_lookup (obj, "timeout")) != NULL) {
+		rule->io_timeout = ucl_obj_todouble (value);
+	}
+	else {
+		rule->io_timeout = fuzzy_module_ctx->io_timeout;
+	}
+
 	if ((value = ucl_object_lookup (obj,  "symbol")) != NULL) {
 		rule->symbol = ucl_obj_tostring (value);
 	}
@@ -1054,7 +1070,7 @@ fuzzy_check_module_config (struct rspamd_config *cfg, bool validate)
 
 	if ((value =
 		rspamd_config_get_module_opt (cfg, "fuzzy_check", "timeout")) != NULL) {
-		fuzzy_module_ctx->io_timeout = ucl_obj_todouble (value) * 1000;
+		fuzzy_module_ctx->io_timeout = ucl_obj_todouble (value);
 	}
 	else {
 		fuzzy_module_ctx->io_timeout = DEFAULT_IO_TIMEOUT;
@@ -2543,12 +2559,13 @@ fuzzy_check_timer_callback (gint fd, short what, void *arg)
 		}
 	}
 
-	if (session->retransmits >= session->rule->ctx->retransmits) {
-		msg_err_task ("got IO timeout with server %s(%s), after %d retransmits",
+	if (session->retransmits >= session->rule->retransmits) {
+		msg_err_task ("got IO timeout with server %s(%s), after %d/%d retransmits",
 				rspamd_upstream_name (session->server),
 				rspamd_inet_address_to_string_pretty (
 						rspamd_upstream_addr_cur (session->server)),
-				session->retransmits);
+				session->retransmits,
+				session->rule->retransmits);
 		rspamd_upstream_fail (session->server, TRUE, "timeout");
 
 		if (session->item) {
@@ -2671,14 +2688,15 @@ fuzzy_controller_timer_callback (gint fd, short what, void *arg)
 
 	task = session->task;
 
-	if (session->retransmits >= session->rule->ctx->retransmits) {
+	if (session->retransmits >= session->rule->retransmits) {
 		rspamd_upstream_fail (session->server, TRUE, "timeout");
 		msg_err_task_check ("got IO timeout with server %s(%s), "
-							"after %d retransmits",
+							"after %d/%d retransmits",
 				rspamd_upstream_name (session->server),
 				rspamd_inet_address_to_string_pretty (
 						rspamd_upstream_addr_cur (session->server)),
-				session->retransmits);
+				session->retransmits,
+				session->rule->retransmits);
 
 		if (session->session) {
 			rspamd_session_remove_event (session->session, fuzzy_lua_fin,
@@ -3169,7 +3187,7 @@ register_fuzzy_client_call (struct rspamd_task *task,
 						fuzzy_check_io_callback,
 						session);
 				rspamd_ev_watcher_start (session->event_loop, &session->ev,
-						((double)rule->ctx->io_timeout) / 1000.0);
+						rule->io_timeout);
 
 				rspamd_session_add_event (task->s, fuzzy_io_fin, session, M);
 				session->item = rspamd_symcache_get_cur_item (task);
@@ -3295,8 +3313,7 @@ register_fuzzy_controller_call (struct rspamd_http_connection_entry *entry,
 					EV_WRITE,
 					fuzzy_controller_io_callback,
 					s);
-			rspamd_ev_watcher_start (s->event_loop, &s->ev,
-					((double)rule->ctx->io_timeout) / 1000.0);
+			rspamd_ev_watcher_start (s->event_loop, &s->ev, rule->io_timeout);
 
 			(*saved)++;
 			ret = 1;
@@ -3650,7 +3667,7 @@ fuzzy_check_send_lua_learn (struct fuzzy_rule *rule,
 						fuzzy_controller_io_callback,
 						s);
 				rspamd_ev_watcher_start (s->event_loop, &s->ev,
-						((double)rule->ctx->io_timeout) / 1000.0);
+						rule->io_timeout);
 
 				rspamd_session_add_event (task->s,
 						fuzzy_lua_fin,


More information about the Commits mailing list