aboutsummaryrefslogtreecommitdiffstats
path: root/src/controller.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-08-03 15:00:01 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-08-03 15:00:01 +0100
commita829e43304c479e6eceecdf5d5d7322a2b5dc65c (patch)
treea69b0011b4e8b5dde5697d28c07c3e0e089200c7 /src/controller.c
parent05ca72e767b9e90b82b21685299017cf39416a7e (diff)
downloadrspamd-a829e43304c479e6eceecdf5d5d7322a2b5dc65c.tar.gz
rspamd-a829e43304c479e6eceecdf5d5d7322a2b5dc65c.zip
Rework stat get function to allow async behaviour.
Diffstat (limited to 'src/controller.c')
-rw-r--r--src/controller.c79
1 files changed, 69 insertions, 10 deletions
diff --git a/src/controller.c b/src/controller.c
index 5f8710132..f37620501 100644
--- a/src/controller.c
+++ b/src/controller.c
@@ -1465,6 +1465,48 @@ rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent,
return 0;
}
+struct rspamd_stat_cbdata {
+ struct rspamd_http_connection_entry *conn_ent;
+ ucl_object_t *top;
+ ucl_object_t *stat;
+ struct rspamd_task *task;
+ guint64 learned;
+};
+
+static gboolean
+rspamd_controller_stat_fin_task (void *ud)
+{
+ struct rspamd_stat_cbdata *cbdata = ud;
+ struct rspamd_controller_session *session;
+ struct rspamd_http_connection_entry *conn_ent;
+ ucl_object_t *top;
+
+ conn_ent = cbdata->conn_ent;
+ session = conn_ent->ud;
+ top = cbdata->top;
+
+ ucl_object_insert_key (top,
+ ucl_object_fromint (cbdata->learned), "total_learns", 0, false);
+
+ if (cbdata->stat) {
+ ucl_object_insert_key (top, cbdata->stat, "statfiles", 0, false);
+ }
+
+ rspamd_controller_send_ucl (conn_ent, top);
+
+
+ return TRUE;
+}
+
+static void
+rspamd_controller_stat_cleanup_task (void *ud)
+{
+ struct rspamd_stat_cbdata *cbdata = ud;
+
+ rspamd_task_free_hard (cbdata->task);
+ ucl_object_unref (cbdata->top);
+}
+
/*
* Stat command handler:
* request: /stat (/resetstat)
@@ -1480,14 +1522,35 @@ rspamd_controller_handle_stat_common (
struct rspamd_controller_session *session = conn_ent->ud;
ucl_object_t *top, *sub;
gint i;
- guint64 learned = 0, spam = 0, ham = 0;
+ guint64 spam = 0, ham = 0;
rspamd_mempool_stat_t mem_st;
struct rspamd_stat *stat, stat_copy;
+ struct rspamd_controller_worker_ctx *ctx;
+ struct rspamd_task *task;
+ struct rspamd_stat_cbdata *cbdata;
rspamd_mempool_stat (&mem_st);
memcpy (&stat_copy, session->ctx->worker->srv->stat, sizeof (stat_copy));
stat = &stat_copy;
+ task = rspamd_task_new (session->ctx->worker);
+
+ ctx = session->ctx;
+ task->resolver = ctx->resolver;
+ task->ev_base = ctx->ev_base;
+ cbdata = rspamd_mempool_alloc0 (session->pool, sizeof (*cbdata));
+ cbdata->conn_ent = conn_ent;
+ cbdata->task = task;
top = ucl_object_typed_new (UCL_OBJECT);
+ cbdata->top = top;
+
+ task->s = rspamd_session_create (session->pool,
+ rspamd_controller_stat_fin_task,
+ NULL,
+ rspamd_controller_stat_cleanup_task,
+ cbdata);
+ task->fin_arg = cbdata;
+ task->http_conn = rspamd_http_connection_ref (conn_ent->conn);;
+ task->sock = conn_ent->conn->fd;
ucl_object_insert_key (top, ucl_object_fromint (
stat->messages_scanned), "scanned", 0, false);
@@ -1561,13 +1624,6 @@ rspamd_controller_handle_stat_common (
ucl_object_insert_key (top, sub, "fuzzy_found", 0, false);
- /* Now write statistics for each statfile */
-
- sub = rspamd_stat_statistics (session->ctx->cfg, &learned);
- ucl_object_insert_key (top, sub, "statfiles", 0, false);
- ucl_object_insert_key (top,
- ucl_object_fromint (learned), "total_learns", 0, false);
-
if (do_reset) {
session->ctx->srv->stat->messages_scanned = 0;
session->ctx->srv->stat->messages_learned = 0;
@@ -1580,8 +1636,11 @@ rspamd_controller_handle_stat_common (
rspamd_mempool_stat_reset ();
}
- rspamd_controller_send_ucl (conn_ent, top);
- ucl_object_unref (top);
+ /* Now write statistics for each statfile */
+ rspamd_stat_statistics (task, session->ctx->cfg, &cbdata->learned,
+ &cbdata->stat);
+ session->task = task;
+ rspamd_session_pending (task->s);
return 0;
}