Browse Source

[Minor] Store timestamp in the fuzzy session properly

tags/3.5
Vsevolod Stakhov 1 year ago
parent
commit
09f02278ba
No account linked to committer's email address
1 changed files with 13 additions and 13 deletions
  1. 13
    13
      src/fuzzy_storage.c

+ 13
- 13
src/fuzzy_storage.c View File

@@ -181,7 +181,7 @@ struct fuzzy_session {
enum rspamd_fuzzy_epoch epoch;
enum fuzzy_cmd_type cmd_type;
gint fd;
guint64 time;
ev_tstamp timestamp;
struct ev_io io;
ref_entry_t ref;
struct fuzzy_key *key;
@@ -225,7 +225,6 @@ rspamd_fuzzy_check_ratelimit (struct fuzzy_session *session)
{
rspamd_inet_addr_t *masked;
struct rspamd_leaky_bucket_elt *elt;
ev_tstamp now;

if (!session->addr) {
return TRUE;
@@ -256,9 +255,8 @@ rspamd_fuzzy_check_ratelimit (struct fuzzy_session *session)
MIN (MAX (session->ctx->leaky_bucket_mask * 4, 64), 128));
}

now = ev_now (session->ctx->event_loop);
elt = rspamd_lru_hash_lookup (session->ctx->ratelimit_buckets, masked,
now);
(time_t)session->timestamp);

if (elt) {
gboolean ratelimited = FALSE;
@@ -269,16 +267,16 @@ rspamd_fuzzy_check_ratelimit (struct fuzzy_session *session)
}
else {
/* Update bucket */
if (elt->last < now) {
elt->cur -= session->ctx->leaky_bucket_rate * (now - elt->last);
elt->last = now;
if (elt->last < session->timestamp) {
elt->cur -= session->ctx->leaky_bucket_rate * (session->timestamp - elt->last);
elt->last = session->timestamp;

if (elt->cur < 0) {
elt->cur = 0;
}
}
else {
elt->last = now;
elt->last = session->timestamp;
}

/* Check bucket */
@@ -308,12 +306,12 @@ rspamd_fuzzy_check_ratelimit (struct fuzzy_session *session)
elt = g_malloc (sizeof (*elt));
elt->addr = masked; /* transfer ownership */
elt->cur = 1;
elt->last = now;
elt->last = session->timestamp;

rspamd_lru_hash_insert (session->ctx->ratelimit_buckets,
masked,
elt,
now,
session->timestamp,
session->ctx->leaky_bucket_ttl);
}

@@ -1627,6 +1625,7 @@ static void
accept_fuzzy_socket (EV_P_ ev_io *w, int revents)
{
struct rspamd_worker *worker = (struct rspamd_worker *)w->data;
struct rspamd_fuzzy_storage_ctx *ctx;
struct fuzzy_session *session;
gssize r, msg_len;
guint64 *nerrors;
@@ -1643,6 +1642,7 @@ accept_fuzzy_socket (EV_P_ ev_io *w, int revents)
#endif

memset (msg, 0, sizeof (*msg) * MSGVEC_LEN);
ctx = (struct rspamd_fuzzy_storage_ctx *)worker->ctx;

/* Prepare messages to receive */
for (int i = 0; i < MSGVEC_LEN; i ++) {
@@ -1657,7 +1657,7 @@ accept_fuzzy_socket (EV_P_ ev_io *w, int revents)

/* Got some data */
if (revents == EV_READ) {
ev_now_update_if_cheap (ctx->event_loop);
for (;;) {
#ifdef HAVE_RECVMMSG
r = recvmmsg (w->fd, msg, MSGVEC_LEN, 0, NULL);
@@ -1705,8 +1705,8 @@ accept_fuzzy_socket (EV_P_ ev_io *w, int revents)
REF_INIT_RETAIN (session, fuzzy_session_destroy);
session->worker = worker;
session->fd = w->fd;
session->ctx = worker->ctx;
session->time = (guint64) time (NULL);
session->ctx = ctx;
session->timestamp = ev_now (ctx->event_loop);
session->addr = client_addr;
worker->nconns++;


Loading…
Cancel
Save