getaddrinfo performance problems
Ed W
lists at wildgooses.com
Mon Apr 16 22:02:44 UTC 2012
On 16/04/2012 18:32, Rich Felker wrote:
> On Mon, Apr 16, 2012 at 05:57:47PM +0100, Ed W wrote:
>> Rich, disregarding posix for a moment, what does glibc do? Options
>> are: canonname=NULL or IP as string?
> If the AI_CANONNAME flag is not specified, the value of the
> ai_canonname field in the returned structure is unspecified; in this
> case it should not be filled in at all unless there's no cost to
> filling it (IIRC musl always fills it because filling it is free if
> done right).
>
>> At present uclibc is returning the reverse dns lookup or textual IP
>> format. It should be trivial for me to supply a patch to make this
>> whatever we want - can someone define what we want? (Posix or
>> emulate some other wierdness?)
> Per POSIX:
>
> If nodename is not null, and if requested by the AI_CANONNAME
> flag, the ai_canonname field of the first returned addrinfo
> structure shall point to a null-terminated string containing the
> canonical name corresponding to the input nodename; if the
> canonical name is not available, then ai_canonname shall refer to
> the nodename argument or a string with the same contents. The
> contents of the ai_flags field of the returned structures are
> undefined.
>
> My reading is that in the numeric case, since there is no canonical
> name, the text about storing a pointer to the input nodename, or a
> duplicate of the same, applies.
>
OK, please see attached version 2 of my patch which I believe implements
this satisfactorarily
As before the motivation is to avoid making DNS queries when calling
getaddrinfo with a numerical IP address. Performance improves
dramatically in such situations
Grateful if others with more experience will verify and commit
Thanks
Ed W
-------------- next part --------------
Posix says that canonname should use the text representation of an IP address
when a numerical nodename given
See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html
Signed-off-by: Ed Wildgoose <lists at wildgooses.com>
---
--- libc/inet/getaddrinfo.c.orig 2012-04-16 18:28:05.000000000 +0100
+++ libc/inet/getaddrinfo.c 2012-04-16 22:51:58.000000000 +0100
@@ -628,13 +628,20 @@
char buffer[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
while (at2 != NULL) {
- if (req->ai_flags & AI_CANONNAME) {
+ c = inet_ntop(at2->family, at2->addr, buffer, sizeof(buffer));
+ if (c) {
+ namelen = strlen(c) + 1;
+ } else if (req->ai_flags & AI_CANONNAME) {
struct hostent *h = NULL;
int herrno;
struct hostent th;
size_t tmpbuflen = 512;
char *tmpbuf;
+ /* Hint says numeric, but address is not */
+ if (req->ai_flags & AI_NUMERICSERV)
+ return -EAI_NONAME;
+
do {
tmpbuflen *= 2;
tmpbuf = alloca(tmpbuflen);
@@ -656,9 +663,7 @@
return -EAI_SYSTEM;
}
- if (h == NULL)
- c = inet_ntop(at2->family, at2->addr, buffer, sizeof(buffer));
- else
+ if (h != NULL)
c = h->h_name;
if (c == NULL)
More information about the uClibc
mailing list