commit c408998: [Minor] LRU: Mark fresh node as immportal to avoid its early eviction

Vsevolod Stakhov vsevolod at highsecure.ru
Fri Feb 1 12:21:03 UTC 2019


Author: Vsevolod Stakhov
Date: 2019-02-01 12:14:34 +0000
URL: https://github.com/rspamd/rspamd/commit/c40899832e2194fd78bd9d7dc64e5f791e3de24f

[Minor] LRU: Mark fresh node as immportal to avoid its early eviction

---
 src/libutil/hash.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/libutil/hash.c b/src/libutil/hash.c
index 086eba8d1..b42dc6c51 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;
 		}
 	}
 


More information about the Commits mailing list