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.
This commit is contained in:
Tom Lane 2009-06-11 19:00:15 +00:00
parent d94582f4f8
commit db16e77349
2 changed files with 65 additions and 88 deletions

View file

@ -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">

View file

@ -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;
}