Browse Source

dns_cache: remove Loop to delete redundant records

Nick Peng 1 year ago
parent
commit
28ab061c7e
1 changed files with 24 additions and 8 deletions
  1. 24 8
      src/dns_cache.c

+ 24 - 8
src/dns_cache.c

@@ -305,6 +305,7 @@ static int _dns_cache_insert(struct dns_cache_info *info, struct dns_cache_data
 {
 	uint32_t key = 0;
 	struct dns_cache *dns_cache = NULL;
+	int loop_count = 0;
 
 	if (cache_data == NULL || info == NULL) {
 		goto errout;
@@ -324,7 +325,6 @@ static int _dns_cache_insert(struct dns_cache_info *info, struct dns_cache_data
 	}
 
 	memset(dns_cache, 0, sizeof(*dns_cache));
-	atomic_add(sizeof(*dns_cache), &dns_cache_head.mem_size);
 	key = hash_string(info->domain);
 	key = jhash(&info->qtype, sizeof(info->qtype), key);
 	key = hash_string_initval(info->dns_group_name, key);
@@ -342,16 +342,32 @@ static int _dns_cache_insert(struct dns_cache_info *info, struct dns_cache_data
 	pthread_mutex_lock(&dns_cache_head.lock);
 	hash_table_add(dns_cache_head.cache_hash, &dns_cache->node, key);
 	list_add_tail(&dns_cache->list, head);
+	atomic_add(sizeof(*dns_cache), &dns_cache_head.mem_size);
+	atomic_inc(&dns_cache_head.num);
 
 	/* Release extra cache, remove oldest cache record */
-	if (atomic_inc_return(&dns_cache_head.num) > dns_cache_head.size ||
-		(dns_cache_head.max_mem_size > 0 && atomic_read(&dns_cache_head.mem_size) > dns_cache_head.max_mem_size)) {
-		struct dns_cache *del_cache = NULL;
-		del_cache = _dns_cache_first();
-		if (del_cache) {
-			_dns_cache_remove(del_cache);
+	do {
+		int need_remove = 0;
+
+		if (dns_cache_head.max_mem_size > 0 && atomic_read(&dns_cache_head.mem_size) > dns_cache_head.max_mem_size) {
+			need_remove = 1;
 		}
-	}
+
+		if (atomic_read(&dns_cache_head.num) > dns_cache_head.size) {
+			need_remove = 1;
+		}
+
+		if (need_remove == 0) {
+			break;
+		}
+
+		struct dns_cache *del_cache = _dns_cache_first();
+		if (del_cache == NULL) {
+			break;
+		}
+
+		_dns_cache_remove(del_cache);
+	} while (loop_count++ < 32);
 
 	dns_cache_get(dns_cache);
 	dns_timer_add(&dns_cache->timer);