Multiple connection retries to the same IP address
Jan Blom <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Message-ID | <DB3PR05MB4289BCD46C2D24F2AE70A4AEE6B0@DB3PR05MB428.eurprd05.prod.outlook.com> |
Hello,
I'm using FreeTDS 0.95 and have been puzzled why the connection timeout setting seemed not to work. Digging into the problem I notice the same target IP address always appear three times, for instance looking at the config dump from osql. I have provided the fqdn name for the host in freetds.conf.
The FreeTDS implementation will loop over all IP addresses when trying to connect if there is a failure. This results in a 3x total timeout duration compared to the configuration. I cannot see a good reason for this logic, given it is the same IP address in all three attempts.
The reason is that the call to getaddrinfo (in tds/config.c) doesn't send in any preference regarding address type. Therefore we get back something like this:
1.
Family : AF_INET
Type : SOCK_STREAM
Protocol : IPPROTO_TCP
Socket address: ('23.235.43.223', 0)
2.
Family : AF_INET
Type : SOCK_DGRAM
Protocol : IPPROTO_UDP
Socket address: ('23.235.43.223', 0)
3.
Family : AF_INET
Type : SOCK_RAW
Protocol : IPPROTO_IP
Socket address: ('23.235.43.223', 0)
However, later on , when we actually connect the socket we will use SOCK_STREAM only. We don't care about UDP or raw sockets.
My assumption would be that the tds_lookup_host() function should set
hints.ai_socktype = SOCK_STREAM;
This will result in only #1 above in return.
Does this make sense or am I missing something here?
Thanks for your time and support!
Jan Blom