Re: [Fwd: DBD::Pg on HP-UX 11.31 64bit] - Mailing list pgsql-bugs

From H.Merijn Brand
Subject Re: [Fwd: DBD::Pg on HP-UX 11.31 64bit]
Date
Msg-id 20101216174803.20b2b6db@pc09.procura.nl
Whole thread Raw
In response to Re: [Fwd: DBD::Pg on HP-UX 11.31 64bit]  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
On Tue, 14 Dec 2010 15:16:36 -0500, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Thanks for the answer. I think all of this makes sense in reading
further into the HP-UX 11.31 socket docs. Please read on as I found a
workaround, but that is probably NOT *the* solution.

> Simon Riggs <simon@2ndQuadrant.com> writes:
> > FW
> > From: H.Merijn Brand <h.m.brand@xs4all.nl>
> > I have postgres running on most my HP-UX varieties, ranging from HP-UX
> > 10.20/32bit through 11.31/64bit. It works fine everywhere, except on
> > HP-UX 11.31-ipf in 64bit mode. Note that this is Itanium architecture.
>
> > postgres' own test suite passes, but all connects fail with DBD::Pg.
>
> That's pretty odd.  What seems to be failing here:
>
> > This is perl, v5.10.1 (*) built for IA64.ARCHREV_0-LP64
> > getsockopt (3, SOL_SOCKET, SO_ERROR, 0x9fffffffffffdb84, 0x9fffffffffffdb98)               ERR#22 EINVAL
>
> is this bit of code in libpq:
>
>                 int            optval;
>                 ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
>                 ...
>                 if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,
>                                (char *) &optval, &optlen) == -1)
>                 {
>                     appendPQExpBuffer(&conn->errorMessage,
>                     libpq_gettext("could not get socket error status: %s\n"),
>                             SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
>                     goto error_return;
>                 }

This is what the docs on HP-UX say:

      int getsockopt (
          int         s,
          int         level,
          int         optname,
          void       *optval,
          int        *optlen
          );

    UNIX 03 Only (X/Open Sockets)

      int getsockopt (
          int                    s,
          int                    level,
          int                    optname,
          void       *__restrict optval,
          socklen_t  *__restrict optlen
          );

the includes tell me

src/include/pg_config.h:#define ACCEPT_TYPE_ARG3 size_t

That is already some sort of inconsistency

    AF_CCITT only
      #include <x25/x25addrstr.h>

      int accept (int s, void *addr, int *addrlen);

    UNIX 03 only (X/Open Sockets)
           int accept (
               int                         s,
               struct sockaddr *__restrict addr,
               socklen_t       *__restrict addrlen
               );

To use X/Open sockets, which seems to me the better option for
postgresql, I changed scr/Makefile.global =>

CC = cc
CFLAGS = -O2 -g -Ae -z +Z +DD64 -D_XOPEN_SOURCE=600
LIBS = -lssl -lcrypto -lxnet -lz -lm
LDFLAGS = -Wl,+vnocompatwarnings +DD64  -L/usr/local/ia64/lib \
    -L/usr/lib/hpux64 -L/usr/contrib/X11R6/lib/hpux64 -s \
    -L/usr/local/lib -L/usr/lib/X11R6 -L/usr/contrib/X11R6/lib

To ensure optimal alignment, I also added

#pragma pack 16

to all header files

However that made no difference in the end-result:

connect (3, 0x6000000000849280, 16)                                          ERR#245 EINPROGRESS
poll (0x9fffffffffffdba0, 1, -1)                                             = 1
getsockopt (3, SOL_SOCKET, SO_ERROR, 0x9fffffffffffdb94, 0x9fffffffffffdba8) ERR#22 EINVAL

HOWEVER

With

tcsh> setenv LD_PRELOAD /usr/lib/hpux64/libxnet.so.1
bash> export LD_PRELOAD=/usr/lib/hpux64/libxnet.so.1

DBD-Pg-2.17.1 559 > make test
PGINITDB="/pro/pgsql-8.4.5/bin/initdb" PERL_DL_NONLAZY=1 /pro/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0,
'blib/lib','blib/arch')" t/*.t 
t/00-signature.t .... skipped: Set the environment variable TEST_SIGNATURE to enable this test
t/00basic.t ......... ok
t/01connect.t ....... 4/13 #
# DBI                         Version 1.615
# DBD::Pg                     Version 2.17.1
# Perl                        Version 5.10.1
# OS                          hpux
# PostgreSQL (compiled)       80405
# PostgreSQL (target)         80404
# PostgreSQL (reported)       PostgreSQL 8.4.4 on x86_64-unknown-linux-gnu, compiled by GCC gcc (SUSE Linux) 4.4.1
[gcc-4_4-branchrevision 150839], 64-bit 
# Default port                5432
# DBI_DSN                     dbi:Pg:
# DBI_USER                    postgres
# Test schema                 dbd_pg_testschema
# PGDATABASE                  testdb
# PGHOST                      12.13.14.15
# array_nulls                 on
# backslash_quote             safe_encoding
# client_encoding             UTF8
# server_encoding             UTF8
# standard_conforming_strings off
t/01connect.t ....... ok
t/01constants.t ..... ok
t/02attribs.t ....... 48/249
#   Failed test 'Failed ping returns a SQLSTATE code of 08000'
#   at t/02attribs.t line 1597.
#          got: '22000'
#     expected: '08000'
t/02attribs.t ....... 247/249 # Looks like you failed 1 test of 249.
t/02attribs.t ....... Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/249 subtests
        (less 1 skipped subtest: 247 okay)
t/03dbmethod.t ...... ok
t/03smethod.t ....... ok
t/04misc.t .......... ok
t/06bytea.t ......... ok
t/07copy.t .......... ok
t/08async.t ......... ok
t/09arrays.t ........ ok
t/12placeholders.t .. ok
t/20savepoints.t .... ok
t/99cleanup.t ....... 1/1 Removing test database directory
t/99cleanup.t ....... ok

Test Summary Report
-------------------
t/02attribs.t     (Wstat: 256 Tests: 249 Failed: 1)
  Failed test:  244
  Non-zero exit status: 1
Files=15, Tests=1707, 21 wallclock secs ( 0.39 usr  0.09 sys +  2.62 cusr  0.90 csys =  4.00 CPU)
Result: FAIL
Failed 1/15 test programs. 1/1707 subtests failed.

As, at this point, there is no control over the library that perl itself is linked with:

Lib                                  Real path                            Size      Date                Refs
------------------------------------ ------------------------------------ --------- ------------------- ----
/pro/bin/perl                        /pro/bin/perl                          4419056 2009-10-05 09:30:15   13
/usr/lib/hpux64/libcl.so.1           /usr/lib/hpux64/libcl.so.1               69336 2007-02-15 22:47:27    3
/usr/lib/hpux64/libIO77.so.1         /usr/lib/hpux64/libIO77.so.1           3099480 2007-01-12 21:03:25    0
/usr/lib/hpux64/libunwind.so.1       /usr/lib/hpux64/libunwind.so.1          558120 2007-02-15 22:47:31    1
/usr/lib/hpux64/libuca.so.1          /usr/lib/hpux64/libuca.so.1              85680 2007-02-15 22:36:36    0
/usr/lib/hpux64/libpthread.so.1      /usr/lib/hpux64/libpthread.so.1        1528360 2008-07-09 23:24:48    0
/usr/lib/hpux64/libnsl.so.1          /usr/lib/hpux64/libnsl.so.1            1510840 2008-07-03 19:16:00    3
/usr/lib/hpux64/libc.so.1            /usr/lib/hpux64/libc.so.1              4898520 2009-06-06 01:23:40    1
/usr/lib/hpux64/libdl.so.1           /usr/lib/hpux64/libdl.so.1               78168 2010-06-24 20:02:37    0
/usr/lib/hpux64/libxti.so.1          /usr/lib/hpux64/libxti.so.1             298840 2008-06-28 11:59:19    0
/usr/lib/hpux64/libnm.so             /usr/lib/hpux64/libnm.so.1              244296 2007-02-15 22:32:55    0
/usr/lib/hpux64/libm.so.1            /usr/lib/hpux64/libm.so.1              2026976 2007-02-15 22:47:28    0
/usr/lib/hpux64/libsec.so.1          /usr/lib/hpux64/libsec.so.1             580112 2008-04-25 17:29:35    1

As getsockopt () is defined in libc.so.1, that one is used before it uses
the libxnet one as required/used by libpq.

> It's not clear at all how that would fail in the Perl environment if it
> works standalone.  I could believe getting EINVAL if we had determined
> the wrong datatype for ACCEPT_TYPE_ARG3, but that ought to fail
> standalone too, I should think.  Anyway it would be worth checking what
> configure identified as ACCEPT_TYPE_ARG3 and comparing that to the docs
> for getsockopt.

--
H.Merijn Brand  http://tux.nl      Perl Monger  http://amsterdam.pm.org/
using 5.00307 through 5.12 and porting perl5.13.x on HP-UX 10.20, 11.00,
11.11, 11.23 and 11.31, OpenSuSE 10.1, 11.0 .. 11.3 and AIX 5.2 and 5.3.
http://mirrors.develooper.com/hpux/           http://www.test-smoke.org/
http://qa.perl.org      http://www.goldmark.org/jeff/stupid-disclaimers/

pgsql-bugs by date:

Previous
From: "H.Merijn Brand"
Date:
Subject: Re: [Fwd: DBD::Pg on HP-UX 11.31 64bit]
Next
From: Tom Lane
Date:
Subject: Re: [Fwd: DBD::Pg on HP-UX 11.31 64bit]