From: Vsevolod Stakhov Date: Fri, 1 Feb 2019 12:14:34 +0000 (+0000) Subject: [Minor] LRU: Mark fresh node as immportal to avoid its early eviction X-Git-Tag: 1.9.0~228 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c40899832e2194fd78bd9d7dc64e5f791e3de24f;p=thirdparty%2Frspamd.git [Minor] LRU: Mark fresh node as immportal to avoid its early eviction --- diff --git a/src/libutil/hash.c b/src/libutil/hash.c index 086eba8d1a..b42dc6c51e 100644 --- a/src/libutil/hash.c +++ b/src/libutil/hash.c @@ -48,6 +48,7 @@ struct rspamd_lru_hash_s { enum rspamd_lru_element_flags { RSPAMD_LRU_ELEMENT_NORMAL = 0, RSPAMD_LRU_ELEMENT_VOLATILE = (1 << 0), + RSPAMD_LRU_ELEMENT_IMMORTAL = (1 << 1), }; struct rspamd_lru_element_s { @@ -444,7 +445,6 @@ rspamd_lru_hash_evict (rspamd_lru_hash_t *hash, time_t now) * or, at some probability scan all table and update eviction * list first */ - r = rspamd_random_double_fast (); if (r < ((double)eviction_candidates) / hash->maxsize) { @@ -455,6 +455,10 @@ rspamd_lru_hash_evict (rspamd_lru_hash_t *hash, time_t now) kh_foreach_value_ptr (hash, cur, { rspamd_lru_element_t *node = &cur->e; + if (node->flags & RSPAMD_LRU_ELEMENT_IMMORTAL) { + continue; + } + if (node->flags & RSPAMD_LRU_ELEMENT_VOLATILE) { /* If element is expired, just remove it */ if (now - cur->creation_time > cur->ttl) { @@ -596,7 +600,7 @@ rspamd_lru_hash_insert (rspamd_lru_hash_t *hash, node = &vnode->e; if (ret == 0) { - /* Existing element, be carefull about destructors */ + /* Existing element, be careful about destructors */ if (hash->value_destroy) { /* Remove old data */ hash->value_destroy (vnode->e.data); @@ -629,7 +633,9 @@ rspamd_lru_hash_insert (rspamd_lru_hash_t *hash, if (ret != 0) { /* Also need to check maxsize */ if (kh_size (hash) >= hash->maxsize) { + node->flags |= RSPAMD_LRU_ELEMENT_IMMORTAL; rspamd_lru_hash_evict (hash, now); + node->flags &= ~RSPAMD_LRU_ELEMENT_IMMORTAL; } }