Skip to content

Commit 28ab061

Browse files
committed
dns_cache: remove Loop to delete redundant records
1 parent 0cc0810 commit 28ab061

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

src/dns_cache.c

+24-8
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ static int _dns_cache_insert(struct dns_cache_info *info, struct dns_cache_data
305305
{
306306
uint32_t key = 0;
307307
struct dns_cache *dns_cache = NULL;
308+
int loop_count = 0;
308309

309310
if (cache_data == NULL || info == NULL) {
310311
goto errout;
@@ -324,7 +325,6 @@ static int _dns_cache_insert(struct dns_cache_info *info, struct dns_cache_data
324325
}
325326

326327
memset(dns_cache, 0, sizeof(*dns_cache));
327-
atomic_add(sizeof(*dns_cache), &dns_cache_head.mem_size);
328328
key = hash_string(info->domain);
329329
key = jhash(&info->qtype, sizeof(info->qtype), key);
330330
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
342342
pthread_mutex_lock(&dns_cache_head.lock);
343343
hash_table_add(dns_cache_head.cache_hash, &dns_cache->node, key);
344344
list_add_tail(&dns_cache->list, head);
345+
atomic_add(sizeof(*dns_cache), &dns_cache_head.mem_size);
346+
atomic_inc(&dns_cache_head.num);
345347

346348
/* Release extra cache, remove oldest cache record */
347-
if (atomic_inc_return(&dns_cache_head.num) > dns_cache_head.size ||
348-
(dns_cache_head.max_mem_size > 0 && atomic_read(&dns_cache_head.mem_size) > dns_cache_head.max_mem_size)) {
349-
struct dns_cache *del_cache = NULL;
350-
del_cache = _dns_cache_first();
351-
if (del_cache) {
352-
_dns_cache_remove(del_cache);
349+
do {
350+
int need_remove = 0;
351+
352+
if (dns_cache_head.max_mem_size > 0 && atomic_read(&dns_cache_head.mem_size) > dns_cache_head.max_mem_size) {
353+
need_remove = 1;
353354
}
354-
}
355+
356+
if (atomic_read(&dns_cache_head.num) > dns_cache_head.size) {
357+
need_remove = 1;
358+
}
359+
360+
if (need_remove == 0) {
361+
break;
362+
}
363+
364+
struct dns_cache *del_cache = _dns_cache_first();
365+
if (del_cache == NULL) {
366+
break;
367+
}
368+
369+
_dns_cache_remove(del_cache);
370+
} while (loop_count++ < 32);
355371

356372
dns_cache_get(dns_cache);
357373
dns_timer_add(&dns_cache->timer);

0 commit comments

Comments
 (0)