]> source.dussan.org Git - rspamd.git/commitdiff
* Add determining page size function to mem_pool library
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Sun, 26 Oct 2008 04:14:48 +0000 (07:14 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Sun, 26 Oct 2008 04:14:48 +0000 (07:14 +0300)
* Add simple statistic structure that is placed in shared memory and used for gathering server's stats

controller.c
main.c
main.h
mem_pool.c
mem_pool.h
worker.c

index 3f4f9b358d77a33da055b56fc7db103e17015dc4..1efb8c35c053b5042c86332b0d3594d8b17bee52 100644 (file)
@@ -282,12 +282,9 @@ accept_socket (int fd, short what, void *arg)
        new_session->worker = worker;
        new_session->sock = nfd;
        new_session->cfg = worker->srv->cfg;
-#ifdef HAVE_GETPAGESIZE
-       new_session->session_pool = memory_pool_new (getpagesize () - 1);
-#else
-       new_session->session_pool = memory_pool_new (4095);
-#endif
+       new_session->session_pool = memory_pool_new (memory_pool_get_size () - 1);
        memory_pool_add_destructor (new_session->session_pool, (pool_destruct_func)bufferevent_free, new_session->bev);
+       worker->srv->stat->control_connections_count ++;
 
        /* Read event */
        new_session->bev = bufferevent_new (nfd, read_socket, write_socket, err_socket, (void *)new_session);
diff --git a/main.c b/main.c
index 81effd61dd22045d4ab30745907d53f6815d18ee..d2dec7e47613f77535ce1e65233d79944f24f5fa 100644 (file)
--- a/main.c
+++ b/main.c
@@ -172,6 +172,7 @@ main (int argc, char **argv)
 
        rspamd = (struct rspamd_main *)g_malloc (sizeof (struct rspamd_main));
        bzero (rspamd, sizeof (struct rspamd_main));
+       rspamd->server_pool = memory_pool_new (memory_pool_get_size ());
        cfg = (struct config_file *)g_malloc (sizeof (struct config_file));
        rspamd->cfg = cfg;
        if (!rspamd || !rspamd->cfg) {
@@ -186,8 +187,11 @@ main (int argc, char **argv)
        do_reopen_log = 0;
        active_worker = NULL;
 
+       rspamd->stat = memory_pool_alloc_shared (rspamd->server_pool, sizeof (struct rspamd_stat));
+       bzero (rspamd->stat, sizeof (struct rspamd_stat));
+
        bzero (rspamd->cfg, sizeof (struct config_file));
-       rspamd->cfg->cfg_pool = memory_pool_new (32768);
+       rspamd->cfg->cfg_pool = memory_pool_new (memory_pool_get_size ());
        init_defaults (rspamd->cfg);
 
        bzero (&signals, sizeof (struct sigaction));
diff --git a/main.h b/main.h
index 3a4671bfb1669c0ecf5add048e9e7a9e0361740f..efb716ab0054c9a4f7e1962ece069ca40d1fdf68 100644 (file)
--- a/main.h
+++ b/main.h
@@ -82,6 +82,16 @@ struct rspamd_worker {
 struct pidfh;
 struct config_file;
 
+/* Server statistics */
+struct rspamd_stat {
+       unsigned int messages_scanned;
+       unsigned int messages_spam;
+       unsigned int messages_ham;
+       unsigned int connections_count;
+       unsigned int control_connections_count;
+       unsigned int messages_learned;
+};
+
 /* Struct that determine main server object (for logging purposes) */
 struct rspamd_main {
        struct config_file *cfg;
@@ -89,7 +99,10 @@ struct rspamd_main {
        /* Pid file structure */
        struct pidfh *pfh;
        enum process_type type;
-       unsigned ev_initialized:1;
+       unsigned int ev_initialized;
+       struct rspamd_stat *stat;
+
+       memory_pool_t *server_pool;
 
        TAILQ_HEAD (workq, rspamd_worker) workers;
 };
index f720138dcd30b9fbf79fb1e1919c02768d38b213..f116fff7328572d67a322c3539b7bfd6cdc5126a 100644 (file)
@@ -344,6 +344,17 @@ memory_pool_stat (memory_pool_stat_t *st)
        st->chunks_freed = chunks_freed;
 }
 
+#define FIXED_POOL_SIZE 4095
+size_t
+memory_pool_get_size ()
+{
+#ifdef HAVE_GETPAGESIZE
+       return getpagesize () - 1;
+#else
+       return FIXED_POOL_SIZE;
+#endif
+}
+
 /*
  * vi:ts=4
  */
index 70678e9fc761dd7297132619a5a67cdca58d9db0..4027b5de27a446d77a5479a9910e877297c34b4e 100644 (file)
@@ -53,6 +53,9 @@ void memory_pool_delete (memory_pool_t* pool);
 
 void memory_pool_stat (memory_pool_stat_t *st);
 
+/* Get optimal pool size based on page size for this system */
+size_t memory_pool_get_size ();
+
 #define memory_pool_free(x) ((x)->len - ((x)->pos - (x)->begin))
 
 #endif
index 741a351a1f444eb69a9cc21d5831d2d067e5f4a7..268e8123b0d40612285ad95feba7b8f8b71b2685 100644 (file)
--- a/worker.c
+++ b/worker.c
@@ -190,6 +190,8 @@ process_message (struct worker_task *task)
        
        msg_info ("process_message: found %d parts in message", task->parts_count);
 
+       task->worker->srv->stat->messages_scanned ++;
+
        return process_filters (task);
 }
 
@@ -313,13 +315,10 @@ accept_socket (int fd, short what, void *arg)
        new_task->cfg = worker->srv->cfg;
        TAILQ_INIT (&new_task->urls);
        TAILQ_INIT (&new_task->parts);
-#ifdef HAVE_GETPAGESIZE
-       new_task->task_pool = memory_pool_new (getpagesize () - 1);
-#else
-       new_task->task_pool = memory_pool_new (TASK_POOL_SIZE);
-#endif
+       new_task->task_pool = memory_pool_new (memory_pool_get_size ());
        /* Add destructor for recipients list (it would be better to use anonymous function here */
        memory_pool_add_destructor (new_task->task_pool, (pool_destruct_func)rcpt_destruct, new_task);
+       worker->srv->stat->connections_count ++;
 
        /* Read event */
        new_task->bev = bufferevent_new (nfd, read_socket, write_socket, err_socket, (void *)new_task);