]> source.dussan.org Git - rspamd.git/commitdiff
Implement statistics closing.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 19 Jun 2015 14:25:10 +0000 (15:25 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 19 Jun 2015 14:25:10 +0000 (15:25 +0100)
src/controller.c
src/libstat/backends/backends.h
src/libstat/backends/mmaped_file.c
src/libstat/backends/sqlite3_backend.c
src/libstat/stat_api.h
src/libstat/stat_config.c
src/main.c
src/worker.c

index 18ce87cd085ce1ea5974a1a3ace4010982b64f8e..398c2307eaf7da3fc7409c12a10f0255baff4507 100644 (file)
@@ -1950,6 +1950,7 @@ start_controller_worker (struct rspamd_worker *worker)
        event_base_loop (ctx->ev_base, 0);
 
        g_mime_shutdown ();
+       rspamd_stat_close ();
        rspamd_http_router_free (ctx->http);
        rspamd_log_close (rspamd_main->logger);
        exit (EXIT_SUCCESS);
index 8180e1baf5c5b816d76d8c6084199b519cf3517a..18f4fce266296020cda4ed56344d21bfed83aaf2 100644 (file)
@@ -54,6 +54,7 @@ struct rspamd_stat_backend {
        gulong (*inc_learns)(struct rspamd_statfile_runtime *runtime, gpointer ctx);
        gulong (*dec_learns)(struct rspamd_statfile_runtime *runtime, gpointer ctx);
        ucl_object_t* (*get_stat)(struct rspamd_statfile_runtime *runtime, gpointer ctx);
+       void (*close)(gpointer ctx);
        gpointer ctx;
 };
 
@@ -79,7 +80,8 @@ struct rspamd_stat_backend {
                gulong rspamd_##name##_learns (struct rspamd_statfile_runtime *runtime, \
                                gpointer ctx); \
                ucl_object_t * rspamd_##name##_get_stat (struct rspamd_statfile_runtime *runtime, \
-                               gpointer ctx)
+                               gpointer ctx); \
+               void rspamd_##name##_close (gpointer ctx)
 
 RSPAMD_STAT_BACKEND_DEF(mmaped_file);
 RSPAMD_STAT_BACKEND_DEF(redis);
index 70452378ff74ab7a9e0ba1351ad5eb432e26466a..b4d60ad0dfaaf41f385cf87fde2d0541501f6d9c 100644 (file)
@@ -638,7 +638,7 @@ rspamd_mmaped_file_open (rspamd_mmaped_file_ctx * pool,
 }
 
 gint
-rspamd_mmaped_file_close (rspamd_mmaped_file_ctx * pool,
+rspamd_mmaped_file_close_file (rspamd_mmaped_file_ctx * pool,
        rspamd_mmaped_file_t * file)
 {
        rspamd_mmaped_file_t *pos;
@@ -797,23 +797,6 @@ rspamd_mmaped_file_create (rspamd_mmaped_file_ctx * pool, const gchar *filename,
        return 0;
 }
 
-void
-rspamd_mmaped_file_destroy (rspamd_mmaped_file_ctx * pool)
-{
-       GHashTableIter it;
-       gpointer k, v;
-       rspamd_mmaped_file_t *f;
-
-       g_hash_table_iter_init (&it, pool->files);
-       while (g_hash_table_iter_next (&it, &k, &v)) {
-               f = (rspamd_mmaped_file_t *)v;
-               rspamd_mmaped_file_close (pool, f);
-       }
-
-       g_hash_table_destroy (pool->files);
-       rspamd_mempool_delete (pool->pool);
-}
-
 gpointer
 rspamd_mmaped_file_init (struct rspamd_stat_ctx *ctx, struct rspamd_config *cfg)
 {
@@ -883,6 +866,30 @@ rspamd_mmaped_file_init (struct rspamd_stat_ctx *ctx, struct rspamd_config *cfg)
        return (gpointer)new;
 }
 
+void
+rspamd_mmaped_file_close (gpointer p)
+{
+       rspamd_mmaped_file_ctx *ctx = (rspamd_mmaped_file_ctx *)p;
+       GHashTableIter it;
+       gpointer k, v;
+       rspamd_mmaped_file_t *mf;
+
+       g_assert (ctx != NULL);
+
+       rspamd_mempool_lock_mutex (ctx->lock);
+       g_hash_table_iter_init (&it, ctx->files);
+
+       while (g_hash_table_iter_next (&it, &k, &v)) {
+               mf = v;
+               rspamd_mmaped_file_close_file (ctx, mf);
+       }
+
+       g_hash_table_unref (ctx->files);
+       rspamd_mempool_unlock_mutex (ctx->lock);
+
+       rspamd_mempool_delete (ctx->pool);
+}
+
 gpointer
 rspamd_mmaped_file_runtime (struct rspamd_task *task,
                struct rspamd_statfile_config *stcf,
index 43c52483fee2cc0e2a604361f7de8157f1017168..e5471b436a2574e4bb708be9daaf5061bc61d61d 100644 (file)
@@ -63,7 +63,7 @@ static const char *create_tables_sql =
                ");"
                "CREATE UNIQUE INDEX IF NOT EXISTS un ON users(name);"
                "CREATE UNIQUE INDEX IF NOT EXISTS ln ON languages(name);"
-               "PRAGMA user_version=" SQLITE3_SCHEMA_VERSION
+               "PRAGMA user_version=" SQLITE3_SCHEMA_VERSION ";"
                "INSERT INTO users(id, name, learns) VALUES(0, '" SQLITE3_DEFAULT "',0);"
                "INSERT INTO languages(id, name, learns) VALUES(0, '" SQLITE3_DEFAULT "',0);"
                "COMMIT;";
@@ -302,7 +302,7 @@ rspamd_sqlite3_init (struct rspamd_stat_ctx *ctx,
                while (curst) {
                        stf = curst->data;
 
-                       if (strcmp (stf->backend, SQLITE3_BACKEND_TYPE) == 0) {
+                       if (stf->backend && strcmp (stf->backend, SQLITE3_BACKEND_TYPE) == 0) {
                                /*
                                 * Check configuration sanity
                                 */
@@ -349,6 +349,33 @@ rspamd_sqlite3_init (struct rspamd_stat_ctx *ctx,
        return (gpointer)new;
 }
 
+void
+rspamd_sqlite3_close (gpointer p)
+{
+       struct rspamd_stat_sqlite3_ctx *ctx = p;
+       struct rspamd_stat_sqlite3_db *bk;
+       GHashTableIter it;
+       gpointer k, v;
+
+       g_hash_table_iter_init (&it, ctx->files);
+
+       while (g_hash_table_iter_next (&it, &k, &v)) {
+               bk = v;
+
+               if (bk->sqlite) {
+                       if (bk->in_transaction) {
+                               rspamd_sqlite3_run_prstmt (bk, RSPAMD_STAT_BACKEND_TRANSACTION_COMMIT);
+                       }
+
+                       sqlite3_close (bk->sqlite);
+                       rspamd_sqlite3_close_prstmt (bk->prstmt);
+                       g_slice_free1 (sizeof (*bk), bk);
+               }
+       }
+
+       g_hash_table_destroy (ctx->files);
+}
+
 gpointer
 rspamd_sqlite3_runtime (struct rspamd_task *task,
                struct rspamd_statfile_config *stcf, gboolean learn, gpointer p)
index 48c7c53c605d8894b630e79514ef2243cb70d5d8..94734adef9f3788e0f449ecaa9323aa6ab5128ef 100644 (file)
@@ -50,6 +50,11 @@ typedef enum rspamd_stat_result_e {
  */
 void rspamd_stat_init (struct rspamd_config *cfg);
 
+/**
+ * Finalize statistics
+ */
+void rspamd_stat_close (void);
+
 /**
  * Classify the task specified and insert symbols if needed
  * @param task
index 91cca76c7c65f7b1408a55a2beb12eb974465566..c75b02fe0543a489d37d56970a2df290e109cdf7 100644 (file)
@@ -65,7 +65,8 @@ static struct rspamd_stat_tokenizer stat_tokenizers[] = {
                .total_learns = rspamd_##eltn##_total_learns, \
                .inc_learns = rspamd_##eltn##_inc_learns, \
                .dec_learns = rspamd_##eltn##_dec_learns, \
-               .get_stat = rspamd_##eltn##_get_stat \
+               .get_stat = rspamd_##eltn##_get_stat, \
+               .close = rspamd_##eltn##_close \
        }
 
 static struct rspamd_stat_backend stat_backends[] = {
@@ -113,6 +114,21 @@ rspamd_stat_init (struct rspamd_config *cfg)
        }
 }
 
+void
+rspamd_stat_close (void)
+{
+       guint i;
+
+       g_assert (stat_ctx != NULL);
+
+       for (i = 0; i < stat_ctx->backends_count; i ++) {
+               if (stat_ctx->backends[i].close != NULL) {
+                       stat_ctx->backends[i].close (stat_ctx->backends[i].ctx);
+                       msg_debug ("closed backend %s", stat_ctx->backends[i].name);
+               }
+       }
+}
+
 struct rspamd_stat_ctx *
 rspamd_stat_get_ctx (void)
 {
index 27e8c9ce7f8d57d81a538fd7cd32bd015dbf037b..5af2948d73d707ce624e442d411e8f00e1861dea 100644 (file)
@@ -1337,6 +1337,7 @@ main (gint argc, gchar **argv, gchar **env)
 
        msg_info ("terminating...");
        rspamd_symbols_cache_destroy (rspamd_main->cfg->cache);
+       rspamd_stat_close ();
        rspamd_log_close (rspamd_main->logger);
        rspamd_config_free (rspamd_main->cfg);
        g_free (rspamd_main->cfg);
index 61a40d25bab6ff0d3c71a3e6b12f966318b7d078..5c1fc396f9ef742372f8205efd695cb8f774a966 100644 (file)
@@ -306,6 +306,7 @@ start_worker (struct rspamd_worker *worker)
        event_base_loop (ctx->ev_base, 0);
 
        g_mime_shutdown ();
+       rspamd_stat_close ();
        rspamd_log_close (rspamd_main->logger);
 
        if (ctx->key) {