Module: kamailio Branch: master Commit: f257fb1cc678085b904d84cabfbbfc87985cbb7e URL: https://github.com/kamailio/kamailio/commit/f257fb1cc678085b904d84cabfbbfc87985cbb7e
Author: Daniel-Constantin Mierla <mico...@gmail.com> Committer: Daniel-Constantin Mierla <mico...@gmail.com> Date: 2025-07-18T13:00:31+02:00 core: dns cache - added rm delay of entries with high refcnt --- Modified: src/core/dns_cache.c --- Diff: https://github.com/kamailio/kamailio/commit/f257fb1cc678085b904d84cabfbbfc87985cbb7e.diff Patch: https://github.com/kamailio/kamailio/commit/f257fb1cc678085b904d84cabfbbfc87985cbb7e.patch --- diff --git a/src/core/dns_cache.c b/src/core/dns_cache.c index 9ea774705ee..b84c628cb3c 100644 --- a/src/core/dns_cache.c +++ b/src/core/dns_cache.c @@ -72,6 +72,7 @@ #define DNS_SRV_ZERO_W_CHANCE \ 1000 /* one in a 1000*weight_sum chance for selecting a 0-weight record */ +#define DNS_CACHE_RMDELAY 300 int dns_cache_init = 1; /* if 0, the DNS cache is not initialized at startup */ static gen_lock_t *dns_hash_lock = 0; @@ -561,7 +562,20 @@ inline static struct dns_hash_entry *_dns_hash_find( /* automatically remove expired elements */ ((e->ent_flags & DNS_FLAG_PERMANENT) == 0) && ((s_ticks_t)(now - e->expire) >= 0)) { - _dns_hash_remove(e); + if(atomic_get(&e->refcnt) > 1) { + if((s_ticks_t)(now - e->expire - S_TO_TICKS(DNS_CACHE_RMDELAY)) + >= 0) { + LM_DBG("delayed removal: %p (%d)\n", e, + (int)atomic_get(&e->refcnt)); + _dns_hash_remove(e); + } else { + LM_DBG("delaying removal: %p (%d)\n", e, + (int)atomic_get(&e->refcnt)); + } + } else { + LM_DBG("immediate removal: %p\n", e); + _dns_hash_remove(e); + } } else if((e->type == type) && (e->name_len == name->len) && (strncasecmp(e->name, name->s, e->name_len) == 0)) { e->last_used = now; @@ -632,8 +646,22 @@ inline static int dns_cache_clean(unsigned int no, int expired_only) ->last_used_lst); if(((e->ent_flags & DNS_FLAG_PERMANENT) == 0) && (!expired_only || ((s_ticks_t)(now - e->expire) >= 0))) { - _dns_hash_remove(e); - deleted++; + if(atomic_get(&e->refcnt) > 1) { + if((s_ticks_t)(now - e->expire - S_TO_TICKS(DNS_CACHE_RMDELAY)) + >= 0) { + LM_DBG("delayed removal: %p (%d)\n", e, + (int)atomic_get(&e->refcnt)); + _dns_hash_remove(e); + deleted++; + } else { + LM_DBG("delaying removal: %p (%d)\n", e, + (int)atomic_get(&e->refcnt)); + } + } else { + LM_DBG("immediate removal: %p\n", e); + _dns_hash_remove(e); + deleted++; + } } n++; if(n >= no) @@ -669,8 +697,22 @@ inline static int dns_cache_free_mem(unsigned int target, int expired_only) ->last_used_lst); if(((e->ent_flags & DNS_FLAG_PERMANENT) == 0) && (!expired_only || ((s_ticks_t)(now - e->expire) >= 0))) { - _dns_hash_remove(e); - deleted++; + if(atomic_get(&e->refcnt) > 1) { + if((s_ticks_t)(now - e->expire - S_TO_TICKS(DNS_CACHE_RMDELAY)) + >= 0) { + LM_DBG("delayed removal: %p (%d)\n", e, + (int)atomic_get(&e->refcnt)); + _dns_hash_remove(e); + deleted++; + } else { + LM_DBG("delaying removal: %p (%d)\n", e, + (int)atomic_get(&e->refcnt)); + } + } else { + LM_DBG("immediate removal: %p\n", e); + _dns_hash_remove(e); + deleted++; + } } } UNLOCK_DNS_HASH(); _______________________________________________ Kamailio - Development Mailing List -- sr-dev@lists.kamailio.org To unsubscribe send an email to sr-dev-le...@lists.kamailio.org Important: keep the mailing list in the recipients, do not reply only to the sender!