]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Use specialized pool types for long-lived and short-lived allocations
authorVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 21 Oct 2025 09:56:57 +0000 (10:56 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 21 Oct 2025 09:56:57 +0000 (10:56 +0100)
Replace generic rspamd_mempool_new calls with specialized variants
to optimize allocation strategies based on pool lifetime.

Long-lived pools (RSPAMD_MEMPOOL_LONG_LIVED):
- server_pool (main server context, rspamadm)
- cfg_pool (configuration, 8MB)
- Module contexts (fuzzy_check, fuzzy_backend)
- Upstream context
- Radix trees
- Maps (hash, radix, regexp - 5 instances)
- Static Lua pools (url, regexp)

Short-lived pools (RSPAMD_MEMPOOL_SHORT_LIVED):
- HTTP/controller sessions
- Task pools (message processing)
- Milter sessions
- Proxy sessions (2 instances)
- Lua parsers (HTML, email - 2 instances)
- Lua mempool creation
- Lua worker control

Benefits:
- Long-lived pools: larger initial page size, fewer reallocations
- Short-lived pools: smaller initial size, faster allocation/deallocation
- Better memory efficiency based on usage patterns

17 files changed:
src/controller.c
src/libserver/cfg_utils.cxx
src/libserver/fuzzy_backend/fuzzy_backend_sqlite.c
src/libserver/maps/map_helpers.c
src/libserver/milter.c
src/libserver/task.c
src/libutil/radix.c
src/libutil/upstream.c
src/lua/lua_mempool.c
src/lua/lua_parsers.c
src/lua/lua_regexp.c
src/lua/lua_url.c
src/lua/lua_worker.c
src/plugins/fuzzy_check.c
src/rspamadm/rspamadm.c
src/rspamd.c
src/rspamd_proxy.c

index 31d8bd90044a7f29f3918870e462215e341333e0..98ff12453ddd2ace2c69566ced4de76105dd98d9 100644 (file)
@@ -3636,8 +3636,7 @@ rspamd_controller_accept_socket(EV_P_ ev_io *w, int revents)
        }
 
        session = g_malloc0(sizeof(struct rspamd_controller_session));
-       session->pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                          "csession", 0);
+       session->pool = rspamd_mempool_new_short_lived("csession");
        session->ctx = ctx;
        session->cfg = ctx->cfg;
        session->lang_det = ctx->lang_det;
index 3ae7dbdfc54627c09ba4cada9266b36b5aa1f897..55ed5a18ba8997df32fce21e5124c1c8e3ba9cc7 100644 (file)
@@ -226,7 +226,7 @@ rspamd_config_new(enum rspamd_config_init_flags flags)
        struct rspamd_config *cfg;
        rspamd_mempool_t *pool;
 
-       pool = rspamd_mempool_new(8 * 1024 * 1024, "cfg", 0);
+       pool = rspamd_mempool_new_long_lived(8 * 1024 * 1024, "cfg");
        cfg = rspamd_mempool_alloc0_type(pool, struct rspamd_config);
        /* Allocate larger pool for cfg */
        cfg->cfg_pool = pool;
index 8ba6254465009bcf24699537e23bcb13d03ba9bb..f3c1690e0646cc0b636391005c0dafc1160868bb 100644 (file)
@@ -396,8 +396,8 @@ rspamd_fuzzy_backend_sqlite_open_db(const char *path, GError **err)
        bk = g_malloc0(sizeof(*bk));
        bk->path = g_strdup(path);
        bk->expired = 0;
-       bk->pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                 "fuzzy_backend", 0);
+       bk->pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                        "fuzzy_backend");
        bk->db = rspamd_sqlite3_open_or_create(bk->pool, bk->path,
                                                                                   create_tables_sql, 1, err);
 
index bd2a2f369b7f169acbecea2621afbb3d278cf2e1..7e7d701740723e89e1c9bcd3a5778310cc9263ac 100644 (file)
@@ -746,12 +746,12 @@ rspamd_map_helper_new_hash(struct rspamd_map *map)
        rspamd_mempool_t *pool;
 
        if (map) {
-               pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                 map->tag, 0);
+               pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                        map->tag);
        }
        else {
-               pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                 NULL, 0);
+               pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                        "map");
        }
 
        htb = rspamd_mempool_alloc0_type(pool, struct rspamd_hash_map_helper);
@@ -804,13 +804,13 @@ rspamd_map_helper_new_radix(struct rspamd_map *map)
        const char *name = "unnamed";
 
        if (map) {
-               pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                 map->tag, 0);
+               pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                        map->tag);
                name = map->name;
        }
        else {
-               pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                 NULL, 0);
+               pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                        "radix_map");
        }
 
        r = rspamd_mempool_alloc0_type(pool, struct rspamd_radix_map_helper);
@@ -863,8 +863,8 @@ rspamd_map_helper_new_regexp(struct rspamd_map *map,
        struct rspamd_regexp_map_helper *re_map;
        rspamd_mempool_t *pool;
 
-       pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                         map->tag, 0);
+       pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                map->tag);
 
        re_map = rspamd_mempool_alloc0_type(pool, struct rspamd_regexp_map_helper);
        re_map->pool = pool;
index b811521afed90fd370721d93ede36f64ee234295..3f2c67f8213c4aaa8fcfa001890357e1e799e0cc 100644 (file)
@@ -1398,7 +1398,7 @@ rspamd_milter_handle_socket(int fd, ev_tstamp timeout,
        priv->parser.buf = rspamd_fstring_sized_new(RSPAMD_MILTER_MESSAGE_CHUNK + 5);
        priv->event_loop = ev_base;
        priv->state = RSPAMD_MILTER_READ_MORE;
-       priv->pool = rspamd_mempool_new(rspamd_mempool_suggest_size(), "milter", 0);
+       priv->pool = rspamd_mempool_new_short_lived("milter");
        priv->discard_on_reject = milter_ctx->discard_on_reject;
        priv->quarantine_on_reject = milter_ctx->quarantine_on_reject;
        priv->ev.timeout = timeout;
index b38c07e264d6aa4129d5f2828b432f243ece8c14..7e90d661b5793e7dac14f0d205ffd745357086c6 100644 (file)
@@ -73,8 +73,10 @@ rspamd_task_new(struct rspamd_worker *worker,
        unsigned int flags = RSPAMD_TASK_FLAG_LEARN_AUTO;
 
        if (pool == NULL) {
-               task_pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                          "task", debug_mem ? RSPAMD_MEMPOOL_DEBUG : 0);
+               task_pool = rspamd_mempool_new_(rspamd_mempool_suggest_size_(G_STRLOC),
+                                                                               "task",
+                                                                               RSPAMD_MEMPOOL_SHORT_LIVED | (debug_mem ? RSPAMD_MEMPOOL_DEBUG : 0),
+                                                                               G_STRLOC);
                flags |= RSPAMD_TASK_FLAG_OWN_POOL;
        }
        else {
index bdd722b499acbca34485912bda82badb543e42a8..b9f09a1a0ab80eb165b27501ecd4b224efeba6f5 100644 (file)
@@ -172,7 +172,7 @@ radix_create_compressed(const char *tree_name)
                return NULL;
        }
 
-       tree->pool = rspamd_mempool_new(rspamd_mempool_suggest_size(), NULL, 0);
+       tree->pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(), "radix");
        tree->size = 0;
        tree->duplicates = 0;
        tree->tree = btrie_init(tree->pool);
index 1dd2d9f62e759c646e7baf9054de219346cfceca..85964c22a65754ff71413a1023a33385164fcc23 100644 (file)
@@ -301,8 +301,8 @@ rspamd_upstreams_library_init(void)
 
        ctx = g_malloc0(sizeof(*ctx));
        memcpy(&ctx->limits, &default_limits, sizeof(ctx->limits));
-       ctx->pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                  "upstreams", 0);
+       ctx->pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                         "upstreams");
 
        ctx->upstreams = g_queue_new();
        REF_INIT_RETAIN(ctx, rspamd_upstream_ctx_dtor);
index ddc9b25e9c2aa4ce805b9c21ee2774412db9d6cc..2c6c9943804b35b2879d26a3a831b4fcd652a4f2 100644 (file)
@@ -159,8 +159,7 @@ static int
 lua_mempool_create(lua_State *L)
 {
        LUA_TRACE_POINT;
-       struct memory_pool_s *mempool = rspamd_mempool_new(
-                                                        rspamd_mempool_suggest_size(), "lua", 0),
+       struct memory_pool_s *mempool = rspamd_mempool_new_short_lived("lua"),
                                                 **pmempool;
 
        if (mempool) {
index eb7fa6bf50ec360a0e6b9a6466762edca8881780..a3174d74f04a6fcd13e3ed201bd18c429585bcf3 100644 (file)
@@ -231,7 +231,7 @@ int lua_parsers_parse_html(lua_State *L)
        }
 
        if (start != NULL) {
-               pool = rspamd_mempool_new(rspamd_mempool_suggest_size(), NULL, 0);
+               pool = rspamd_mempool_new_short_lived("lua_parser");
                in = g_byte_array_sized_new(len);
                g_byte_array_append(in, start, len);
 
@@ -327,8 +327,7 @@ int lua_parsers_parse_mail_address(lua_State *L)
                        }
                }
                else {
-                       pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                         "lua parsers", 0);
+                       pool = rspamd_mempool_new_short_lived("lua_parsers");
                        own_pool = TRUE;
                }
 
index 4a209057e9870c9f098dd25799bc45aa8b39303f..bff19714dd7bfbc42b8380ec5f865ba1c3b86655 100644 (file)
@@ -846,8 +846,8 @@ lua_load_regexp(lua_State *L)
 void luaopen_regexp(lua_State *L)
 {
        if (!regexp_static_pool) {
-               regexp_static_pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                                               "regexp_lua_pool", 0);
+               regexp_static_pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                                                  "regexp_lua_pool");
        }
 
        rspamd_lua_new_class(L, rspamd_regexp_classname, regexplib_m);
index 8e62318ab6906bc5e81daf398c0d7499be485f1f..1d163dce0b773bc47a9352e9ba56728d5107925a 100644 (file)
@@ -831,8 +831,8 @@ static rspamd_mempool_t *static_lua_url_pool;
 
 RSPAMD_CONSTRUCTOR(rspamd_urls_static_pool_ctor)
 {
-       static_lua_url_pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                                        "static_lua_url", 0);
+       static_lua_url_pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                                               "static_lua_url");
 }
 
 RSPAMD_DESTRUCTOR(rspamd_urls_static_pool_dtor)
index b18e9e5151fcc4165f77e6582d9c60e1d27885e7..358727714d6470a767cd27fdcaef3fbfc0c83e64 100644 (file)
@@ -420,8 +420,7 @@ lua_worker_add_control_handler(lua_State *L)
                        return luaL_error(L, "invalid command type: %s", cmd_name);
                }
 
-               rspamd_mempool_t *pool = rspamd_mempool_new(
-                       rspamd_mempool_suggest_size(), "lua_control", 0);
+               rspamd_mempool_t *pool = rspamd_mempool_new_short_lived("lua_control");
                cbd = rspamd_mempool_alloc0(pool, sizeof(*cbd));
                cbd->pool = pool;
                cbd->event_loop = event_loop;
index 0c2f5a617f2101a8227b7811de84bdec0f667dd5..052ad092c4f34b50f693fca9ad79a6773994de21 100644 (file)
@@ -2038,8 +2038,8 @@ int fuzzy_check_module_init(struct rspamd_config *cfg, struct module_ctx **ctx)
        fuzzy_module_ctx = rspamd_mempool_alloc0(cfg->cfg_pool,
                                                                                         sizeof(struct fuzzy_ctx));
 
-       fuzzy_module_ctx->fuzzy_pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                                                         NULL, 0);
+       fuzzy_module_ctx->fuzzy_pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                                                                "fuzzy");
        /* TODO: this should match rules count actually */
        fuzzy_module_ctx->keypairs_cache = rspamd_keypair_cache_new(32);
        fuzzy_module_ctx->fuzzy_rules = g_ptr_array_new();
index e323880f3beb4c551da06f3581e503f58cd7fabb..4a19aa667e872c65ee3d9704c0d80eca916cdf7b 100644 (file)
@@ -393,8 +393,8 @@ int main(int argc, char **argv, char **env)
        rspamd_main->cfg = cfg;
        rspamd_main->pid = getpid();
        rspamd_main->type = process_quark;
-       rspamd_main->server_pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                                                 "rspamadm", 0);
+       rspamd_main->server_pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                                                        "rspamadm");
 
        rspamadm_fill_internal_commands(all_commands);
        help_command.command_data = all_commands;
index ba1ea1fb85ead10e4f95c013000cffdf4288ffe5..58e35b9822aca2ac287df3ec9360a82e38b697ec 100644 (file)
@@ -1438,8 +1438,8 @@ int main(int argc, char **argv, char **env)
 
        rspamd_main = (struct rspamd_main *) g_malloc0(sizeof(struct rspamd_main));
 
-       rspamd_main->server_pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                                                 "main", 0);
+       rspamd_main->server_pool = rspamd_mempool_new_long_lived(rspamd_mempool_suggest_size(),
+                                                                                                                        "main");
        rspamd_main->stat = rspamd_mempool_alloc0_shared_(rspamd_main->server_pool,
                                                                                                          sizeof(struct rspamd_stat),
                                                                                                          RSPAMD_ALIGNOF(struct rspamd_stat),
index 5321c8677236c92b4762d418dc878baf015a5878..aed9076e82c00d54263de81b047399b34aba54cd 100644 (file)
@@ -1513,7 +1513,7 @@ proxy_session_refresh(struct rspamd_proxy_session *session)
        session->client_addr = NULL;
        nsession->ctx = session->ctx;
        nsession->worker = session->worker;
-       nsession->pool = rspamd_mempool_new(rspamd_mempool_suggest_size(), "proxy", 0);
+       nsession->pool = rspamd_mempool_new_short_lived("proxy");
        nsession->client_sock = session->client_sock;
        session->client_sock = -1;
        nsession->mirror_conns = g_ptr_array_sized_new(nsession->ctx->mirrors->len);
@@ -2990,8 +2990,7 @@ proxy_accept_socket(EV_P_ ev_io *w, int revents)
        session->client_addr = addr;
        session->mirror_conns = g_ptr_array_sized_new(ctx->mirrors->len);
 
-       session->pool = rspamd_mempool_new(rspamd_mempool_suggest_size(),
-                                                                          "proxy", 0);
+       session->pool = rspamd_mempool_new_short_lived("proxy");
        session->ctx = ctx;
        session->worker = worker;