pending-server: retry for 2 minutes when add pending server.
This commit is contained in:
@@ -59,6 +59,7 @@
|
|||||||
#define DNS_TCP_CONNECT_TIMEOUT (5)
|
#define DNS_TCP_CONNECT_TIMEOUT (5)
|
||||||
#define DNS_QUERY_TIMEOUT (500)
|
#define DNS_QUERY_TIMEOUT (500)
|
||||||
#define DNS_QUERY_RETRY (3)
|
#define DNS_QUERY_RETRY (3)
|
||||||
|
#define DNS_PENDING_SERVER_RETRY 40
|
||||||
#define SOCKET_PRIORITY (6)
|
#define SOCKET_PRIORITY (6)
|
||||||
#define SOCKET_IP_TOS (IPTOS_LOWDELAY | IPTOS_RELIABILITY)
|
#define SOCKET_IP_TOS (IPTOS_LOWDELAY | IPTOS_RELIABILITY)
|
||||||
|
|
||||||
@@ -147,6 +148,7 @@ struct dns_server_pending {
|
|||||||
unsigned int query_v6;
|
unsigned int query_v6;
|
||||||
/* server type */
|
/* server type */
|
||||||
dns_server_type_t type;
|
dns_server_type_t type;
|
||||||
|
int retry_cnt;
|
||||||
|
|
||||||
int port;
|
int port;
|
||||||
|
|
||||||
@@ -2681,16 +2683,16 @@ static int _dns_client_pending_server_resolve(char *domain, dns_rtcode_t rtcode,
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (addr_type == DNS_T_A) {
|
if (addr_type == DNS_T_A) {
|
||||||
pending->has_v4 = 1;
|
|
||||||
pending->ping_time_v4 = -1;
|
pending->ping_time_v4 = -1;
|
||||||
if (rtcode == DNS_RC_NOERROR) {
|
if (rtcode == DNS_RC_NOERROR) {
|
||||||
|
pending->has_v4 = 1;
|
||||||
pending->ping_time_v4 = ping_time;
|
pending->ping_time_v4 = ping_time;
|
||||||
safe_strncpy(pending->ipv4, ip, DNS_HOSTNAME_LEN);
|
safe_strncpy(pending->ipv4, ip, DNS_HOSTNAME_LEN);
|
||||||
}
|
}
|
||||||
} else if (addr_type == DNS_T_AAAA) {
|
} else if (addr_type == DNS_T_AAAA) {
|
||||||
pending->has_v6 = 1;
|
|
||||||
pending->ping_time_v6 = -1;
|
pending->ping_time_v6 = -1;
|
||||||
if (rtcode == DNS_RC_NOERROR) {
|
if (rtcode == DNS_RC_NOERROR) {
|
||||||
|
pending->has_v6 = 1;
|
||||||
pending->ping_time_v6 = ping_time;
|
pending->ping_time_v6 = ping_time;
|
||||||
safe_strncpy(pending->ipv6, ip, DNS_HOSTNAME_LEN);
|
safe_strncpy(pending->ipv6, ip, DNS_HOSTNAME_LEN);
|
||||||
}
|
}
|
||||||
@@ -2732,11 +2734,14 @@ static void _dns_client_add_pending_servers(void)
|
|||||||
if (++dely < 3) {
|
if (++dely < 3) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
dely = 0;
|
||||||
|
|
||||||
pthread_mutex_lock(&pending_server_mutex);
|
pthread_mutex_lock(&pending_server_mutex);
|
||||||
list_for_each_entry_safe(pending, tmp, &pending_servers, list)
|
list_for_each_entry_safe(pending, tmp, &pending_servers, list)
|
||||||
{
|
{
|
||||||
/* send dns type A, AAAA query to bootstrap DNS server */
|
/* send dns type A, AAAA query to bootstrap DNS server */
|
||||||
|
int add_success = 0;
|
||||||
|
|
||||||
if (pending->query_v4 == 0) {
|
if (pending->query_v4 == 0) {
|
||||||
pending->query_v4 = 1;
|
pending->query_v4 = 1;
|
||||||
_dns_client_server_pending_get(pending);
|
_dns_client_server_pending_get(pending);
|
||||||
@@ -2748,7 +2753,9 @@ static void _dns_client_add_pending_servers(void)
|
|||||||
if (pending->query_v6 == 0) {
|
if (pending->query_v6 == 0) {
|
||||||
pending->query_v6 = 1;
|
pending->query_v6 = 1;
|
||||||
_dns_client_server_pending_get(pending);
|
_dns_client_server_pending_get(pending);
|
||||||
dns_server_query(pending->host, DNS_T_AAAA, _dns_client_pending_server_resolve, pending);
|
if (dns_server_query(pending->host, DNS_T_AAAA, _dns_client_pending_server_resolve, pending) != 0) {
|
||||||
|
_dns_client_server_pending_release_lck(pending);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if both A, AAAA has query result, select fastest IP address */
|
/* if both A, AAAA has query result, select fastest IP address */
|
||||||
@@ -2761,12 +2768,22 @@ static void _dns_client_add_pending_servers(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ip[0]) {
|
if (ip[0]) {
|
||||||
if (_dns_client_add_pendings(pending, ip) != 0) {
|
if (_dns_client_add_pendings(pending, ip) == 0) {
|
||||||
tlog(TLOG_WARN, "add pending DNS server %s failed.", pending->host);
|
add_success = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pending->retry_cnt++;
|
||||||
|
if (pending->retry_cnt >= DNS_PENDING_SERVER_RETRY || add_success) {
|
||||||
|
if (add_success == 0) {
|
||||||
|
tlog(TLOG_WARN, "add pending DNS server %s failed.", pending->host);
|
||||||
|
}
|
||||||
_dns_client_server_pending_release_lck(pending);
|
_dns_client_server_pending_release_lck(pending);
|
||||||
|
} else {
|
||||||
|
tlog(TLOG_DEBUG, "add pending DNS server %s failed, retry %d...", pending->host, pending->retry_cnt);
|
||||||
|
pending->query_v4 = 0;
|
||||||
|
pending->query_v6 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if has no bootstrap DNS, just call getaddrinfo to get address */
|
/* if has no bootstrap DNS, just call getaddrinfo to get address */
|
||||||
|
|||||||
Reference in New Issue
Block a user