commit 659b2f9: [Project] Add `http_context` debug module
Vsevolod Stakhov
vsevolod at highsecure.ru
Tue Mar 5 16:42:08 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-03-05 16:29:41 +0000
URL: https://github.com/rspamd/rspamd/commit/659b2f946e9b76315dad40525c2737c665926e9e
[Project] Add `http_context` debug module
---
src/libutil/http_context.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/src/libutil/http_context.c b/src/libutil/http_context.c
index 7f1de0c36..d9b6c0d50 100644
--- a/src/libutil/http_context.c
+++ b/src/libutil/http_context.c
@@ -22,10 +22,18 @@
#include "contrib/libottery/ottery.h"
#include "rspamd.h"
+INIT_LOG_MODULE(http_context)
+
+#define msg_debug_http_context(...) rspamd_conditional_debug_fast (NULL, NULL, \
+ rspamd_http_context_log_id, "http_context", NULL, \
+ G_STRFUNC, \
+ __VA_ARGS__)
+
static struct rspamd_http_context *default_ctx = NULL;
struct rspamd_http_keepalive_cbdata {
struct rspamd_http_connection *conn;
+ struct rspamd_http_context *ctx;
GQueue *queue;
GList *link;
struct event ev;
@@ -61,6 +69,10 @@ rspamd_http_context_client_rotate_ev (gint fd, short what, void *arg)
double_to_tv (ctx->config.client_key_rotate_time, &rot_tv);
rot_tv.tv_sec += ottery_rand_range (rot_tv.tv_sec);
+
+ msg_debug_http_context ("rotate local keypair, next rotate in %d seconds",
+ (int)rot_tv.tv_sec);
+
event_del (&ctx->client_rotate_ev);
event_add (&ctx->client_rotate_ev, &rot_tv);
@@ -229,6 +241,10 @@ rspamd_http_context_free (struct rspamd_http_context *ctx)
struct rspamd_keepalive_hash_key *hk;
kh_foreach_key (ctx->keep_alive_hash, hk, {
+ msg_debug_http_context ("cleanup keepalive elt %s (%s)",
+ rspamd_inet_address_to_string_pretty (hk->addr),
+ hk->host);
+
if (hk->host) {
g_free (hk->host);
}
@@ -314,6 +330,10 @@ rspamd_http_context_check_keepalive (struct rspamd_http_context *ctx,
/* Use stack based approach */
+ msg_debug_http_context ("check keepalive element %s (%s), %d elts",
+ rspamd_inet_address_to_string_pretty (phk->addr),
+ phk->host, conns->length);
+
if (g_queue_get_length (conns) > 0) {
struct rspamd_http_keepalive_cbdata *cbd;
struct rspamd_http_connection *conn;
@@ -348,6 +368,9 @@ rspamd_http_context_prepare_keepalive (struct rspamd_http_context *ctx,
if (k != kh_end (ctx->keep_alive_hash)) {
/* Reuse existing */
conn->keepalive_hash_key = kh_key (ctx->keep_alive_hash, k);
+ msg_debug_http_context ("use existing keepalive element %s (%s)",
+ rspamd_inet_address_to_string_pretty (conn->keepalive_hash_key->addr),
+ conn->keepalive_hash_key->host);
}
else {
/* Create new one */
@@ -361,6 +384,10 @@ rspamd_http_context_prepare_keepalive (struct rspamd_http_context *ctx,
kh_put (rspamd_keep_alive_hash, ctx->keep_alive_hash, phk, &r);
conn->keepalive_hash_key = phk;
+
+ msg_debug_http_context ("create new keepalive element %s (%s)",
+ rspamd_inet_address_to_string_pretty (conn->keepalive_hash_key->addr),
+ conn->keepalive_hash_key->host);
}
}
@@ -369,12 +396,18 @@ rspamd_http_keepalive_handler (gint fd, short what, gpointer ud)
{
struct rspamd_http_keepalive_cbdata *cbdata =
(struct rspamd_http_keepalive_cbdata *)ud;
+ struct rspamd_http_context *ctx;
/*
* We can get here if a remote side reported something or it has
* timed out. In both cases we just terminate keepalive connection.
*/
+ ctx = cbdata->ctx;
g_queue_delete_link (cbdata->queue, cbdata->link);
+ msg_debug_http_context ("remove keepalive element %s (%s), %d connections left",
+ rspamd_inet_address_to_string_pretty (cbdata->conn->keepalive_hash_key->addr),
+ cbdata->conn->keepalive_hash_key->host,
+ cbdata->queue->length);
rspamd_http_connection_unref (cbdata->conn);
g_free (cbdata);
}
@@ -400,6 +433,7 @@ rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx,
if (!tok) {
/* Server has not stated that it can do keep alive */
conn->finished = TRUE;
+ msg_debug_http_context ("no Connection header");
return;
}
@@ -407,6 +441,7 @@ rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx,
if (rspamd_ftok_casecmp (&cmp, tok) != 0) {
conn->finished = TRUE;
+ msg_debug_http_context ("connection header is not `keep-alive`");
return;
}
@@ -429,6 +464,7 @@ rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx,
(end_pos - tok->begin) - pos - 1, &real_timeout) &&
real_timeout > 0) {
timeout = real_timeout;
+ msg_debug_http_context ("got timeout attr %.2f", timeout);
}
}
else {
@@ -436,6 +472,7 @@ rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx,
tok->len - pos - 1, &real_timeout) &&
real_timeout > 0) {
timeout = real_timeout;
+ msg_debug_http_context ("got timeout attr %.2f", timeout);
}
}
}
@@ -449,12 +486,19 @@ rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx,
g_queue_push_tail (&conn->keepalive_hash_key->conns, cbdata);
cbdata->link = conn->keepalive_hash_key->conns.tail;
cbdata->queue = &conn->keepalive_hash_key->conns;
+ cbdata->ctx = ctx;
conn->finished = FALSE;
event_set (&cbdata->ev, conn->fd, EV_READ|EV_TIMEOUT,
rspamd_http_keepalive_handler,
cbdata);
+ msg_debug_http_context ("push keepalive element %s (%s), %d connections left, %.1f timeout",
+ rspamd_inet_address_to_string_pretty (cbdata->conn->keepalive_hash_key->addr),
+ cbdata->conn->keepalive_hash_key->host,
+ cbdata->queue->length,
+ timeout);
+
double_to_tv (timeout, &tv);
event_base_set (ev_base, &cbdata->ev);
event_add (&cbdata->ev, &tv);
More information about the Commits
mailing list