From: Vsevolod Stakhov Date: Sat, 12 Feb 2022 13:03:15 +0000 (+0000) Subject: [Fix] Fix http maps shared memory cache cleanup X-Git-Tag: 3.2~56 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4ebb7dcf7fce6459c6d60813d136074c75700240;p=rspamd.git [Fix] Fix http maps shared memory cache cleanup It must be initiated by active http worker as it really has the shm object available. --- diff --git a/src/libserver/maps/map.c b/src/libserver/maps/map.c index 6348ca8b2..19c6c6e6c 100644 --- a/src/libserver/maps/map.c +++ b/src/libserver/maps/map.c @@ -2521,20 +2521,25 @@ rspamd_map_backend_dtor (struct rspamd_map_backend *bk) rspamd_fstring_free (data->etag); } - if (g_atomic_int_compare_and_exchange (&data->cache->available, 1, 0)) { - if (data->cur_cache_cbd) { - msg_info ("clear shared memory cache for a map in %s on backend %s closing", - data->cur_cache_cbd->shm->shm_name, - bk->uri); - MAP_RELEASE (data->cur_cache_cbd->shm, - "rspamd_http_map_cached_cbdata"); - ev_timer_stop (data->cur_cache_cbd->event_loop, - &data->cur_cache_cbd->timeout); - g_free (data->cur_cache_cbd); - data->cur_cache_cbd = NULL; + /* + * Clear cached file, but check if a worker is an active http worker + * as cur_cache_cbd is meaningful merely for active worker, who actually + * owns the cache + */ + if (bk->map && bk->map->active_http) { + if (g_atomic_int_compare_and_exchange (&data->cache->available, 1, 0)) { + if (data->cur_cache_cbd) { + msg_info ("clear shared memory cache for a map in %s as backend \"%s\" is closing", + data->cur_cache_cbd->shm->shm_name, + bk->uri); + MAP_RELEASE (data->cur_cache_cbd->shm, + "rspamd_http_map_cached_cbdata"); + ev_timer_stop (data->cur_cache_cbd->event_loop, + &data->cur_cache_cbd->timeout); + g_free (data->cur_cache_cbd); + data->cur_cache_cbd = NULL; + } } - - unlink (data->cache->shmem_name); } g_free (bk->data.hd);