Просмотр исходного кода

speed_check: reduce latency when remote server is slow or unreachable.

Nick Peng 1 месяц назад
Родитель
Сommit
7946a2f50a

+ 2 - 1
src/dns_server/dns_server.c

@@ -695,7 +695,8 @@ static void _dns_server_period_run(unsigned int msec)
 			continue;
 		}
 
-		if (request->send_tick < now - (check_order * DNS_PING_CHECK_INTERVAL) && request->has_ping_result == 0) {
+		if ((request->send_tick < now - (check_order * DNS_PING_CHECK_INTERVAL) && request->has_ping_result == 0) ||
+			request->ping_time > DNS_PING_RTT_CHECK_THRESHOLD) {
 			_dns_server_request_get(request);
 			list_add_tail(&request->check_list, &check_list);
 			request->check_order++;

+ 2 - 1
src/dns_server/dns_server.h

@@ -45,7 +45,8 @@ extern "C" {
 #define DNS_CONN_BUFF_SIZE 4096
 #define DNS_REQUEST_MAX_TIMEOUT 950
 #define DNS_PING_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT)
-#define DNS_PING_CHECK_INTERVAL (250)
+#define DNS_PING_CHECK_INTERVAL (100)
+#define DNS_PING_RTT_CHECK_THRESHOLD (100 * 10)
 #define DNS_PING_SECOND_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT - DNS_PING_CHECK_INTERVAL)
 #define SOCKET_IP_TOS (IPTOS_LOWDELAY | IPTOS_RELIABILITY)
 #define SOCKET_PRIORITY (6)

+ 20 - 4
src/dns_server/speed_check.c

@@ -210,10 +210,26 @@ int _dns_server_check_speed(struct dns_request *request, char *ip)
 	}
 
 	ping_timeout = ping_timeout - (now - request->send_tick);
-	if (ping_timeout > DNS_PING_TIMEOUT) {
-		ping_timeout = DNS_PING_TIMEOUT;
-	} else if (ping_timeout < 200) {
-		ping_timeout = 200;
+	switch (request->response_mode) {
+	case DNS_RESPONSE_MODE_FIRST_PING_IP:
+		if (ping_timeout > 200) {
+			ping_timeout = 200;
+		}
+		break;
+	case DNS_RESPONSE_MODE_FASTEST_IP:
+		if (ping_timeout > DNS_PING_TIMEOUT) {
+			ping_timeout = DNS_PING_TIMEOUT;
+		} else if (ping_timeout < 200) {
+			ping_timeout = 200;
+		}
+		break;
+	case DNS_RESPONSE_MODE_FASTEST_RESPONSE:
+		if (ping_timeout < 200) {
+			ping_timeout = 200;
+		}
+		break;
+	default:
+		break;
 	}
 
 	port = request->check_order_list->orders[order].tcp_port;

+ 1 - 1
test/cases/test-speed-check.cc

@@ -224,7 +224,7 @@ TEST_F(SpeedCheck, tcp_faster_than_ping)
 		return smartdns::SERVER_REQUEST_SOA;
 	});
 
-	server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 500);
+	server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 300);
 	server.MockPing(PING_TYPE_TCP, "5.6.7.8:80", 60, 10);
 	server.Start(R"""(bind [::]:60053
 server 127.0.0.1:61053