]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix http maps shared memory cache cleanup
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 12 Feb 2022 13:03:15 +0000 (13:03 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 12 Feb 2022 13:03:58 +0000 (13:03 +0000)
It must be initiated by active http worker as it really has the shm object
available.

src/libserver/maps/map.c

index 6348ca8b2d922a5f4bb0c92508905ff9d3b53d9c..19c6c6e6c48a37d7e295e3a345e5eb8b7bb5cd09 100644 (file)
@@ -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);