From db16e7734918c63589fe607be94699449a618b5a Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Thu, 11 Jun 2009 19:00:15 +0000 Subject: [PATCH] Remove our inadequate kluge that tried to get AIX's various broken versions of getaddrinfo() to work. Instead, recommend updating the OS to get a working version of getaddrinfo. Per recent discussions. --- doc/src/sgml/installation.sgml | 115 ++++++++++++++++++--------------- src/backend/libpq/ip.c | 38 +---------- 2 files changed, 65 insertions(+), 88 deletions(-) diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index e91f34538aa..c272bade96b 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.321 2009/04/27 16:27:35 momjian Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.322 2009/06/11 19:00:14 tgl Exp $ --> <chapter id="installation"> <title><![%standalone-include[<productname>PostgreSQL</>]]> @@ -2090,7 +2090,7 @@ kill `cat /usr/local/pgsql/data/postmaster.pid` <para> On AIX 4.3.2, you need <filename>libm.a</filename> that is in the - fileset bos.adt.libm. Try the following command: + fileset <literal>bos.adt.libm</>. Try the following command: <screen> $ lslpp -l bos.adt.libm </screen> @@ -2120,11 +2120,11 @@ $ lslpp -l bos.adt.libm <para> AIX 5.3 has a problem - where <structname>sockadr_storage</structname> is not defined to + where <structname>sockaddr_storage</structname> is not defined to be large enough. In version 5.3, IBM increased the size of <structname>sockaddr_un</structname>, the address structure for Unix-domain sockets, but did not correspondingly increase the - size of <structname>sockadr_storage</structname>. The result of + size of <structname>sockaddr_storage</structname>. The result of this is that attempts to use Unix-domain sockets with PostgreSQL lead to libpq overflowing the data structure. TCP/IP connections work OK, but not Unix-domain sockets, which prevents the @@ -2142,7 +2142,66 @@ $ lslpp -l bos.adt.libm </sect3> <sect3> - <title>Memory Management</title> + <title>Internet address issues</title> + + <para> + PostgreSQL relies on the system's <function>getaddrinfo</> function + to parse IP addresses in <varname>listen_addresses</>, + <filename>pg_hba.conf</>, etc. Older versions of AIX have assorted + bugs in this function. If you have problems related to these settings, + updating to the latest fix pack for your AIX release should fix it. + </para> + + <!-- http://archives.postgresql.org/message-id/6064jt6cfm.fsf_-_@dba2.int.libertyrms.com --> + + <para> + One user reports: + </para> + + <para> + When implementing PostgreSQL version 8.1 on AIX 5.3, we + periodically ran into problems where the statistics collector + would <quote>mysteriously</quote> not come up successfully. This + appears to be the result of unexpected behaviour in the IPv6 + implementation. It looks like PostgreSQL and IPv6 do not play + very well together at this time on AIX. + </para> + + <para> + Any of the following actions <quote>fix</quote> the problem. + <itemizedlist> + <listitem> + <para> + Delete the IPv6 address for localhost: +<screen> +(as root) +# ifconfig lo0 inet6 ::1/0 delete +</screen> + </para> + </listitem> + + <listitem> + <para> + Remove IPv6 from net services. The + file <filename>/etc/netsvc.conf</filename> on AIX is roughly + equivalent to <filename>/etc/nsswitch.conf</filename> on + Solaris/Linux. The default, on AIX, is thus: +<programlisting> +hosts=local,bind +</programlisting> + Replace this with: +<programlisting> +hosts=local4,bind4 +</programlisting> + to deactivate searching for IPv6 addresses. + </para> + </listitem> + </itemizedlist> + </para> + </sect3> + + <sect3> + <title>Memory management</title> <!-- http://archives.postgresql.org/message-id/603bgqmpl9.fsf@dba2.int.libertyrms.com --> <para> @@ -2292,52 +2351,6 @@ createlang: language installation failed: ERROR: could not load library "/opt/d </biblioentry> </bibliography> </sect3> - - <sect3> - <title>Statistics Collector Issues</title> - <!-- http://archives.postgresql.org/message-id/6064jt6cfm.fsf_-_@dba2.int.libertyrms.com --> - - <para> - When implementing PostgreSQL version 8.1 on AIX 5.3, we - periodically ran into problems where the statistics collector - would <quote>mysteriously</quote> not come up successfully. This - appears to be the result of unexpected behaviour in the IPv6 - implementation. It looks like PostgreSQL and IPv6 do not play - very well together at this time on AIX. - </para> - - <para> - Any of the following actions <quote>fix</quote> the problem. - <itemizedlist> - <listitem> - <para> - Delete the IPv6 address for localhost: -<screen> -(as root) -# ifconfig lo0 inet6 ::1/0 delete -</screen> - </para> - </listitem> - - <listitem> - <para> - Remove IPv6 from net services. The - file <filename>/etc/netsvc.conf</filename> on AIX is roughly - equivalent to <filename>/etc/nsswitch.conf</filename> on - Solaris/Linux. The default, on AIX, is thus: -<programlisting> -hosts=local,bind -</programlisting> - Replace this with: -<programlisting> -hosts=local4,bind4 -</programlisting> - to deactivate searching for IPv6 addresses. - </para> - </listitem> - </itemizedlist> - </para> - </sect3> </sect2> <sect2 id="installation-notes-cygwin"> diff --git a/src/backend/libpq/ip.c b/src/backend/libpq/ip.c index 80880b38070..90ec119d79d 100644 --- a/src/backend/libpq/ip.c +++ b/src/backend/libpq/ip.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/libpq/ip.c,v 1.46 2009/06/11 14:48:58 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/ip.c,v 1.47 2009/06/11 19:00:15 tgl Exp $ * * This file and the IPV6 implementation were initially provided by * Nigel Kukard <nkukard@lbsd.net>, Linux Based Systems Design @@ -74,45 +74,9 @@ pg_getaddrinfo_all(const char *hostname, const char *servname, return getaddrinfo_unix(servname, hintp, result); #endif -#ifndef _AIX /* NULL has special meaning to getaddrinfo(). */ rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname, servname, hintp, result); -#else /* _AIX */ - - /* - * Various versions of AIX have various bugs in getaddrinfo()'s handling - * of the servname parameter, including failing entirely if it's not NULL - * and failing to zero sin_port when it is NULL :-(. Avoid these by - * always passing NULL and handling the port number for ourselves. - */ - rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname, - NULL, hintp, result); - - if (rc == 0) - { - struct addrinfo *addr; - unsigned short port = 0; - - if (servname && *servname) - port = atoi(servname); - - for (addr = *result; addr; addr = addr->ai_next) - { - switch (addr->ai_family) - { - case AF_INET: - ((struct sockaddr_in *) addr->ai_addr)->sin_port = htons(port); - break; -#ifdef HAVE_IPV6 - case AF_INET6: - ((struct sockaddr_in6 *) addr->ai_addr)->sin6_port = htons(port); - break; -#endif - } - } - } -#endif /* _AIX */ return rc; } -- GitLab