]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] LRU: Mark fresh node as immportal to avoid its early eviction
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 1 Feb 2019 12:14:34 +0000 (12:14 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 1 Feb 2019 12:14:34 +0000 (12:14 +0000)
src/libutil/hash.c

index 086eba8d1a2d31f8acc97ff807f4f3d4d8f072d2..b42dc6c51e894b236279c07b172a565b99d23639 100644 (file)
@@ -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;
                }
        }