more resilient connection times among IP addresses

When connecting to a domain with multiple IP addresses, allow different,
decreasing connection timeout values. This should guarantee some
connections attempts with sufficiently long timeouts, while still
providing fallback.
This commit is contained in:
Pierre Ynard 2012-01-23 10:45:24 +01:00 committed by Daniel Stenberg
parent 4d2737bcb2
commit f4d3c0cbfb

@ -732,6 +732,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
} }
next: next:
conn->timeoutms_per_addr = conn->ip_addr->ai_next == NULL ?
allow : allow / 2;
code = trynextip(conn, sockindex, connected); code = trynextip(conn, sockindex, connected);
if(code) { if(code) {
@ -1012,9 +1014,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
return CURLE_OPERATION_TIMEDOUT; return CURLE_OPERATION_TIMEDOUT;
} }
/* Max time for each address */
conn->num_addr = Curl_num_addresses(remotehost->addr); conn->num_addr = Curl_num_addresses(remotehost->addr);
conn->timeoutms_per_addr = timeout_ms / conn->num_addr;
ai = remotehost->addr; ai = remotehost->addr;
@ -1026,14 +1026,17 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
* Connecting with a Curl_addrinfo chain * Connecting with a Curl_addrinfo chain
*/ */
for(curr_addr = ai; curr_addr; curr_addr = curr_addr->ai_next) { for(curr_addr = ai; curr_addr; curr_addr = curr_addr->ai_next) {
CURLcode res;
/* Max time for the next address */
conn->timeoutms_per_addr = curr_addr->ai_next == NULL ?
timeout_ms : timeout_ms / 2;
/* start connecting to the IP curr_addr points to */ /* start connecting to the IP curr_addr points to */
CURLcode res = res = singleipconnect(conn, curr_addr,
singleipconnect(conn, curr_addr, /* don't hang when doing multi */
/* don't hang when doing multi */ (data->state.used_interface == Curl_if_multi)?0:
(data->state.used_interface == Curl_if_multi)?0: conn->timeoutms_per_addr, &sockfd, connected);
conn->timeoutms_per_addr, &sockfd, connected);
if(res) if(res)
return res; return res;