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!

Reply via email to