[sr-dev] git:master: dns cache: dns_cache_rec_pref without #define CACHE_RELEVANT_RECS_ONLY

Miklos Tirpak miklos at iptel.org
Wed Jun 23 17:32:14 CEST 2010


Module: sip-router
Branch: master
Commit: 0ce55adcdf00d5a04faf8ed26e019a9fac3b7db6
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0ce55adcdf00d5a04faf8ed26e019a9fac3b7db6

Author: Miklos Tirpak <miklos at iptel.org>
Committer: Miklos Tirpak <miklos at iptel.org>
Date:   Wed Jun 23 17:27:41 2010 +0200

dns cache: dns_cache_rec_pref without #define CACHE_RELEVANT_RECS_ONLY

Added support for the dns_cache_rec_pref config variable
when CACHE_RELEVANT_RECS_ONLY is not defined.

---

 dns_cache.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/dns_cache.c b/dns_cache.c
index adf2940..a501e3e 100644
--- a/dns_cache.c
+++ b/dns_cache.c
@@ -2048,10 +2048,56 @@ inline static struct dns_hash_entry* dns_cache_do_request(str* name, int type)
 												  to it */
 				}
 			}
-			dns_cache_add_unsafe(r); /* refcnt++ inside */
-			if (atomic_get(&r->refcnt)==0){
-				/* if cache adding failed and nobody else is interested
-				 * destroy this entry */
+
+			/* add the new record to the cache by default */
+			add_record = 1;
+			if (cfg_get(core, core_cfg, dns_cache_rec_pref) > 0) {
+				/* check whether there is an old record with the
+				 * same type in the cache */
+				rec_name.s = r->name;
+				rec_name.len = r->name_len;
+				old = _dns_hash_find(&rec_name, r->type, &h, &err);
+				if (old) {
+					if (old->type != r->type) {
+						/* probably CNAME found */
+						old = NULL;
+
+					} else if (old->ent_flags & DNS_FLAG_PERMANENT) {
+						/* never overwrite permanent entries */
+						add_record = 0;
+
+					} else if ((old->ent_flags & DNS_FLAG_BAD_NAME) == 0) {
+						/* Non-negative, non-permanent entry found with
+						 * the same type. */
+						add_record =
+							/* prefer new records */
+							((cfg_get(core, core_cfg, dns_cache_rec_pref) == 2)
+							/* prefer the record with the longer lifetime */
+							|| ((cfg_get(core, core_cfg, dns_cache_rec_pref) == 3)
+								&& TICKS_LT(old->expire, r->expire)));
+					}
+				}
+			}
+			if (add_record) {
+				dns_cache_add_unsafe(r); /* refcnt++ inside */
+				if (atomic_get(&r->refcnt)==0){
+					/* if cache adding failed and nobody else is interested
+					 * destroy this entry */
+					dns_destroy_entry(r);
+				}
+				if (old) {
+					_dns_hash_remove(old);
+					old = NULL;
+				}
+			} else {
+				if (old) {
+					if (r == e) {
+						/* this entry has to be returned */
+						e = old;
+						atomic_inc(&e->refcnt);
+					}
+					old = NULL;
+				}
 				dns_destroy_entry(r);
 			}
 		}




More information about the sr-dev mailing list