Browse Source

[Project] Refresh fuzzy hashes when matched

tags/1.7.8
Vsevolod Stakhov 5 years ago
parent
commit
a09cd72d58
2 changed files with 53 additions and 1 deletions
  1. 50
    0
      src/fuzzy_storage.c
  2. 3
    1
      src/libserver/fuzzy_wire.h

+ 50
- 0
src/fuzzy_storage.c View File

@@ -17,6 +17,7 @@
* Rspamd fuzzy storage server
*/

#include <src/libserver/fuzzy_wire.h>
#include "config.h"
#include "util.h"
#include "rspamd.h"
@@ -772,6 +773,7 @@ rspamd_fuzzy_check_callback (struct rspamd_fuzzy_reply *result, void *ud)
struct fuzzy_session *session = ud;
gboolean encrypted = FALSE, is_shingle = FALSE;
struct rspamd_fuzzy_cmd *cmd = NULL;
const struct rspamd_shingle *shingle = NULL;

switch (session->cmd_type) {
case CMD_NORMAL:
@@ -779,6 +781,7 @@ rspamd_fuzzy_check_callback (struct rspamd_fuzzy_reply *result, void *ud)
break;
case CMD_SHINGLE:
cmd = &session->cmd.shingle.basic;
shingle = &session->cmd.shingle.sgl;
is_shingle = TRUE;
break;
case CMD_ENCRYPTED_NORMAL:
@@ -787,12 +790,59 @@ rspamd_fuzzy_check_callback (struct rspamd_fuzzy_reply *result, void *ud)
break;
case CMD_ENCRYPTED_SHINGLE:
cmd = &session->cmd.enc_shingle.cmd.basic;
shingle = &session->cmd.enc_shingle.cmd.sgl;
encrypted = TRUE;
is_shingle = TRUE;
break;
}

rspamd_fuzzy_make_reply (cmd, result, session, encrypted, is_shingle);

/* Refresh hash if found with strong confidence */
if (result->v1.prob > 0.9) {
struct fuzzy_peer_cmd up_cmd;
struct fuzzy_peer_request *up_req;

if (session->worker->index == 0 || session->ctx->peer_fd == -1) {
/* Just add to the queue */
memset (&up_cmd, 0, sizeof (up_cmd));
up_cmd.is_shingle = is_shingle;
memcpy (up_cmd.cmd.normal.digest, result->digest,
sizeof (up_cmd.cmd.normal.digest));
up_cmd.cmd.normal.flag = result->v1.flag;
up_cmd.cmd.normal.cmd = FUZZY_REFRESH;
up_cmd.cmd.normal.shingles_count = cmd->shingles_count;

if (is_shingle && shingle) {
memcpy (&up_cmd.cmd.shingle.sgl, shingle,
sizeof (up_cmd.cmd.shingle.sgl));
}

g_array_append_val (session->ctx->updates_pending, up_cmd);
}
else {
/* We need to send request to the peer */
up_req = g_malloc0 (sizeof (*up_req));
up_req->cmd.is_shingle = is_shingle;

memcpy (up_req->cmd.cmd.normal.digest, result->digest,
sizeof (up_req->cmd.cmd.normal.digest));
up_req->cmd.cmd.normal.flag = result->v1.flag;
up_req->cmd.cmd.normal.cmd = FUZZY_REFRESH;
up_req->cmd.cmd.normal.shingles_count = cmd->shingles_count;

if (is_shingle && shingle) {
memcpy (&up_req->cmd.cmd.shingle.sgl, shingle,
sizeof (up_req->cmd.cmd.shingle.sgl));
}

event_set (&up_req->io_ev, session->ctx->peer_fd, EV_WRITE,
fuzzy_peer_send_io, up_req);
event_base_set (session->ctx->ev_base, &up_req->io_ev);
event_add (&up_req->io_ev, NULL);
}
}

REF_RELEASE (session);
}


+ 3
- 1
src/libserver/fuzzy_wire.h View File

@@ -14,7 +14,9 @@
#define FUZZY_WRITE 1
#define FUZZY_DEL 2
#define FUZZY_STAT 3

#define FUZZY_CLIENT_MAX 3
/* Internal commands */
#define FUZZY_REFRESH 100

/**
* The epoch of the fuzzy client

Loading…
Cancel
Save