cache: fix dns cache prefetch issue

This commit is contained in:
Nick Peng
2022-06-25 20:24:27 +08:00
parent 883116708b
commit 5006059074
4 changed files with 78 additions and 41 deletions

View File

@@ -56,6 +56,7 @@
#define SOCKET_PRIORITY (6)
#define CACHE_AUTO_ENABLE_SIZE (1024 * 1024 * 128)
#define EXPIRED_DOMAIN_PREFTCH_TIME (3600 * 8)
#define DNS_MAX_DOMAIN_REFETCH_NUM 16
#define RECV_ERROR_AGAIN 1
#define RECV_ERROR_OK 0
@@ -556,14 +557,14 @@ static void _dns_rrs_result_log(struct dns_server_post_context *context, struct
}
if (addr_map->addr_type == DNS_T_A) {
tlog(TLOG_INFO, "result: %s, id: %d, index: %d, rtt: %d, %d.%d.%d.%d", request->domain, request->id,
context->ip_num, addr_map->ping_time, addr_map->ip_addr[0], addr_map->ip_addr[1], addr_map->ip_addr[2],
addr_map->ip_addr[3]);
tlog(TLOG_INFO, "result: %s, id: %d, index: %d, rtt: %.1f ms, %d.%d.%d.%d", request->domain, request->id,
context->ip_num, ((float)addr_map->ping_time) / 10, addr_map->ip_addr[0], addr_map->ip_addr[1],
addr_map->ip_addr[2], addr_map->ip_addr[3]);
} else if (addr_map->addr_type == DNS_T_AAAA) {
tlog(TLOG_INFO,
"result: %s, id: %d, index: %d, rtt: %d, "
"result: %s, id: %d, index: %d, rtt: %.1f ms, "
"%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
request->domain, request->id, context->ip_num, addr_map->ping_time, addr_map->ip_addr[0],
request->domain, request->id, context->ip_num, ((float)addr_map->ping_time) / 10, addr_map->ip_addr[0],
addr_map->ip_addr[1], addr_map->ip_addr[2], addr_map->ip_addr[3], addr_map->ip_addr[4],
addr_map->ip_addr[5], addr_map->ip_addr[6], addr_map->ip_addr[7], addr_map->ip_addr[8],
addr_map->ip_addr[9], addr_map->ip_addr[10], addr_map->ip_addr[11], addr_map->ip_addr[12],
@@ -689,7 +690,7 @@ static int _dns_add_rrs(struct dns_server_post_context *context)
context->ip_num++;
if (context->qtype == DNS_T_A) {
ret |= dns_add_A(context->packet, DNS_RRS_AN, domain, request->ip_ttl, request->ip_addr);
tlog(TLOG_DEBUG, "result: %s, rtt: %d, %d.%d.%d.%d", request->domain, request->ping_time,
tlog(TLOG_DEBUG, "result: %s, rtt: %.1f ms, %d.%d.%d.%d", request->domain, ((float)request->ping_time) / 10,
request->ip_addr[0], request->ip_addr[1], request->ip_addr[2], request->ip_addr[3]);
}
@@ -697,13 +698,13 @@ static int _dns_add_rrs(struct dns_server_post_context *context)
if (context->qtype == DNS_T_AAAA) {
ret |= dns_add_AAAA(context->packet, DNS_RRS_AN, domain, request->ip_ttl, request->ip_addr);
tlog(TLOG_DEBUG,
"result: %s, rtt: %d, "
"result: %s, rtt: %.1f ms, "
"%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
request->domain, request->ping_time, request->ip_addr[0], request->ip_addr[1], request->ip_addr[2],
request->ip_addr[3], request->ip_addr[4], request->ip_addr[5], request->ip_addr[6],
request->ip_addr[7], request->ip_addr[8], request->ip_addr[9], request->ip_addr[10],
request->ip_addr[11], request->ip_addr[12], request->ip_addr[13], request->ip_addr[14],
request->ip_addr[15]);
request->domain, ((float)request->ping_time) / 10, request->ip_addr[0], request->ip_addr[1],
request->ip_addr[2], request->ip_addr[3], request->ip_addr[4], request->ip_addr[5],
request->ip_addr[6], request->ip_addr[7], request->ip_addr[8], request->ip_addr[9],
request->ip_addr[10], request->ip_addr[11], request->ip_addr[12], request->ip_addr[13],
request->ip_addr[14], request->ip_addr[15]);
}
}
@@ -1539,18 +1540,18 @@ static int _dns_server_request_complete(struct dns_request *request)
tlog(TLOG_INFO, "result: %s, qtype: %d, SOA", request->domain, request->qtype);
} else {
if (request->qtype == DNS_T_A) {
tlog(TLOG_INFO, "result: %s, qtype: %d, rtt: %d, %d.%d.%d.%d", request->domain, request->qtype,
request->ping_time, request->ip_addr[0], request->ip_addr[1], request->ip_addr[2],
tlog(TLOG_INFO, "result: %s, qtype: %d, rtt: %.1f ms, %d.%d.%d.%d", request->domain, request->qtype,
((float)request->ping_time) / 10, request->ip_addr[0], request->ip_addr[1], request->ip_addr[2],
request->ip_addr[3]);
} else if (request->qtype == DNS_T_AAAA) {
tlog(TLOG_INFO,
"result: %s, qtype: %d, rtt: %d, "
"result: %s, qtype: %d, rtt: %.1f ms, "
"%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
request->domain, request->qtype, request->ping_time, request->ip_addr[0], request->ip_addr[1],
request->ip_addr[2], request->ip_addr[3], request->ip_addr[4], request->ip_addr[5],
request->ip_addr[6], request->ip_addr[7], request->ip_addr[8], request->ip_addr[9],
request->ip_addr[10], request->ip_addr[11], request->ip_addr[12], request->ip_addr[13],
request->ip_addr[14], request->ip_addr[15]);
request->domain, request->qtype, ((float)request->ping_time) / 10, request->ip_addr[0],
request->ip_addr[1], request->ip_addr[2], request->ip_addr[3], request->ip_addr[4],
request->ip_addr[5], request->ip_addr[6], request->ip_addr[7], request->ip_addr[8],
request->ip_addr[9], request->ip_addr[10], request->ip_addr[11], request->ip_addr[12],
request->ip_addr[13], request->ip_addr[14], request->ip_addr[15]);
}
}
@@ -2649,7 +2650,7 @@ void _dns_server_query_end(struct dns_request *request)
if (request->dualstack_selection_has_ip && request->dualstack_selection_ping_time > 0) {
goto out;
}
request->has_ping_result = 1;
_dns_server_request_complete(request);
}
@@ -4560,7 +4561,7 @@ static void _dns_server_period_run_second(void)
}
if (now - 180 > last) {
dns_cache_invalidate(NULL, 0, NULL, 0);
dns_cache_invalidate(NULL, 0, 0, NULL, 0);
tlog(TLOG_WARN, "Service paused for 180s, force invalidate cache.");
}
@@ -4578,12 +4579,13 @@ static void _dns_server_period_run_second(void)
prefetch_time = EXPIRED_DOMAIN_PREFTCH_TIME;
}
}
dns_cache_invalidate(NULL, 0, _dns_server_prefetch_expired_domain, prefetch_time);
dns_cache_invalidate(NULL, 0, DNS_MAX_DOMAIN_REFETCH_NUM, _dns_server_prefetch_expired_domain,
prefetch_time);
} else {
dns_cache_invalidate(_dns_server_prefetch_domain, 3, NULL, 0);
dns_cache_invalidate(_dns_server_prefetch_domain, 3, DNS_MAX_DOMAIN_REFETCH_NUM, NULL, 0);
}
} else {
dns_cache_invalidate(NULL, 0, NULL, 0);
dns_cache_invalidate(NULL, 0, 0, NULL, 0);
}
}
@@ -4806,6 +4808,8 @@ static int _dns_create_socket(const char *host_ip, int type)
}
}
fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
freeaddrinfo(gai);
return fd;