]> source.dussan.org Git - rspamd.git/commitdiff
* Add normalizer for fuzzy hashes
authorcebka@lenovo-laptop <cebka@lenovo-laptop>
Tue, 16 Mar 2010 13:32:12 +0000 (16:32 +0300)
committercebka@lenovo-laptop <cebka@lenovo-laptop>
Tue, 16 Mar 2010 13:32:12 +0000 (16:32 +0300)
* Fix fuzzy add and fuzzy del

rspamc.pl.in
src/controller.c
src/plugins/fuzzy_check.c

index 979c4a02ea0a90f4accd241d1bb2d1497c062a1f..1cf6dd45aed4181a9357a64890f2b47d3a0ce4c2 100755 (executable)
@@ -241,7 +241,6 @@ if (defined ($args{s})) {
 }
 if (defined ($args{h})) {
     $cfg{'hosts'} = [ $args{h} ];
-    $do_parse_config = 0;
 }
 if (defined ($args{P})) {
     $cfg{'password'} = $args{P};
index 3bafeaa05903bb63a8e7b41ed5e5e421fd686f1d..69b5608e76f38cc39f7aa43f3be83d9d8fe263f1 100644 (file)
@@ -862,7 +862,7 @@ controller_read_socket (f_str_t * in, void *arg)
                if (session->other_handler) {
                        session->other_handler (session, in);
                }
-               session->state = STATE_REPLY;
+               rspamd_dispatcher_pause (session->dispatcher);
                break;
        case STATE_WAIT:
                rspamd_dispatcher_pause (session->dispatcher);
index 0b5c43a575271dbe294ae0845fdc68fb4a2083e5..aad7f3b11691432585fa23acd86d505a5e4ebe38 100644 (file)
@@ -59,6 +59,7 @@ struct fuzzy_ctx {
        struct storage_server          *servers;
        int                             servers_num;
        memory_pool_t                  *fuzzy_pool;
+       double                          max_score;
 };
 
 struct fuzzy_client_session {
@@ -148,6 +149,27 @@ parse_servers_string (char *str)
 
 }
 
+static double
+fuzzy_normalize (int32_t in)
+{
+       double ms = fuzzy_module_ctx->max_score, ams = fabs (ms), ain = fabs (in);
+       
+       if (ams > 0.001) {
+               if (ain < ams / 2.) {
+                       return in;
+               }
+               else if (ain < ams * 2.) {
+                       ain = ain / 3. + ams / 3.;
+                       return in > 0 ? ain : -(ain);
+               }
+               else {
+                       return in > 0 ? ms : -(ms);
+               }
+       }
+       
+       return (double)in;
+}
+
 int
 fuzzy_check_module_init (struct config_file *cfg, struct module_ctx **ctx)
 {
@@ -185,6 +207,14 @@ fuzzy_check_module_config (struct config_file *cfg)
        else {
                fuzzy_module_ctx->symbol = DEFAULT_SYMBOL;
        }
+       if ((value = get_module_opt (cfg, "fuzzy_check", "max_score")) != NULL) {
+               fuzzy_module_ctx->max_score = strtod (value, NULL);
+               g_free (value);
+       }
+       else {
+               fuzzy_module_ctx->max_score = 0.;
+       }
+       
        if ((value = get_module_opt (cfg, "fuzzy_check", "servers")) != NULL) {
                parse_servers_string (value);
        }
@@ -242,6 +272,7 @@ fuzzy_io_callback (int fd, short what, void *arg)
        struct fuzzy_cmd                cmd;
        char                            buf[62], *err_str;
        int                             value;
+       double                          nval;
 
        if (what == EV_WRITE) {
                /* Send command to storage */
@@ -266,8 +297,10 @@ fuzzy_io_callback (int fd, short what, void *arg)
                        /* Now try to get value */
                        value = strtol (buf + 3, &err_str, 10);
                        *err_str = '\0';
-                       insert_result (session->task, fuzzy_module_ctx->metric, fuzzy_module_ctx->symbol, value, g_list_prepend (NULL, 
-                                               memory_pool_strdup (session->task->task_pool, buf + 3)));
+                       nval = fuzzy_normalize (value);
+                       snprintf (buf, sizeof (buf), "%d / %.2f", value, nval);
+                       insert_result (session->task, fuzzy_module_ctx->metric, fuzzy_module_ctx->symbol, nval, g_list_prepend (NULL, 
+                                               memory_pool_strdup (session->task->task_pool, buf)));
                }
                goto ok;
        }