getaddrinfo sends duplicate query and breaks dns round robin

Bug #966368 reported by Karl Pickett
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
eglibc (Ubuntu)
New
Undecided
Unassigned

Bug Description

This happens on 10.04 lts and 12.04 beta. Note that fedora 15 does NOT have this problem, so it appears to be eglibc specific. ipv6 is not enabled (only the auto link level addresses are on)

The host 'gridftp.nautilus.nics.xsede.org' has two ipv4 ips. when using ping,
each ping execution alternates hosts, and strace shows only one dns query is
sent.

however, another program using getaddrinfo() does not get the same rotation.
It appears that getaddrinfo inexplicably sends a redundant dns query (only
thing different is transaction id), thus causing an entire rotation through
both hosts each time. The returned ip will always be fairly constant - it will
be the last ip that 'ping' got. So, if a host has a power of 2 number of ips,
rotation is broken.. particularly badly if there are only two ips total.

note: nscd is not running, and it does not appear to fix the problem

test program:

int main(void)
{
    struct addrinfo *result;
    struct addrinfo *res;
    int error;

   /* nautilus has two hosts, we want to pick a random
     * one.
     * Note: problem occurs with or without final trailing '.' */
    error = getaddrinfo("gridftp.nautilus.nics.xsede.org", NULL, NULL, &result);
    // We just sent two DNS queries, which breaks rotation when a host has two ips and the nameserver rotates them per query

strace of c program:

strace -s 100 -e sendto ./a.out
sendto(3, "\24\0\0\0\26\0\1\3\276\301pO\0\0\0\0\0\0\0\0", 20, 0,
{sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
sendto(3,
"\360\342\1\0\0\1\0\0\0\0\0\0\7gridftp\10nautilus\4nics\5xsede\3org\0\0\1\0\1",
49, MSG_NOSIGNAL, NULL, 0) = 49
sendto(3,
"\2654\1\0\0\1\0\0\0\0\0\0\7gridftp\10nautilus\4nics\5xsede\3org\0\0\1\0\1",
49, MSG_NOSIGNAL, NULL, 0) = 49

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.