Thread

  1. keepalives on MacOS X

    Robert Haas <robertmhaas@gmail.com> — 2010-06-28T19:07:42Z

    It looks like the recent keepalives patch won't support MacOS X,
    because MacOS X does not have the TCP_KEEPIDLE, TCP_KEEPINTVL, and
    TCP_KEEPCNT socket parameters.  It does have this:
    
    #define TCP_KEEPALIVE           0x10    /* idle time used when
    SO_KEEPALIVE is enabled */
    
    Should we try to support that as a synonym for TCP_KEEPIDLE, if that's
    what it is?  Or not worry about it?  Or... what?
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise Postgres Company
    
    
  2. Re: keepalives on MacOS X

    Fujii Masao <masao.fujii@gmail.com> — 2010-06-29T03:48:08Z

    On Tue, Jun 29, 2010 at 4:07 AM, Robert Haas <robertmhaas@gmail.com> wrote:
    > It looks like the recent keepalives patch won't support MacOS X,
    > because MacOS X does not have the TCP_KEEPIDLE, TCP_KEEPINTVL, and
    > TCP_KEEPCNT socket parameters.  It does have this:
    >
    > #define TCP_KEEPALIVE           0x10    /* idle time used when
    > SO_KEEPALIVE is enabled */
    >
    > Should we try to support that as a synonym for TCP_KEEPIDLE, if that's
    > what it is?  Or not worry about it?  Or... what?
    
    I'm not sure that can be a synonym for TCP_KEEPIDLE, but if so we should
    change not only a client-side but also server-side.
    
    Regards,
    
    -- 
    Fujii Masao
    NIPPON TELEGRAPH AND TELEPHONE CORPORATION
    NTT Open Source Software Center
    
    
  3. Re: keepalives on MacOS X

    Tom Lane <tgl@sss.pgh.pa.us> — 2010-06-29T04:42:22Z

    Robert Haas <robertmhaas@gmail.com> writes:
    > It looks like the recent keepalives patch won't support MacOS X,
    > because MacOS X does not have the TCP_KEEPIDLE, TCP_KEEPINTVL, and
    > TCP_KEEPCNT socket parameters.  It does have this:
    
    It looks to me like there's support for setting KEEPIDLE and KEEPINTVL
    via sysctl, but of course that's system-wide and presumably requires
    root privilege to set.  (Apple seems to have inherited that from various
    BSDen, btw; it's not unique to Darwin.)
    
    > #define TCP_KEEPALIVE           0x10    /* idle time used when
    > SO_KEEPALIVE is enabled */
    
    > Should we try to support that as a synonym for TCP_KEEPIDLE, if that's
    > what it is?  Or not worry about it?  Or... what?
    
    Yeah, a bit of rooting around in the Darwin sources shows that this
    value is used as a per-connection override for tcp_keepidle.  So it
    is a synonym.  Not sure if it's worth supporting when the other value
    can't be set too.  Maybe it'd be more useful to document that people can
    set the system-wide values if they're desperate.
    
    			regards, tom lane
    
    
  4. Re: keepalives on MacOS X

    Robert Haas <robertmhaas@gmail.com> — 2010-06-29T14:28:33Z

    On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > Yeah, a bit of rooting around in the Darwin sources shows that this
    > value is used as a per-connection override for tcp_keepidle.  So it
    > is a synonym.  Not sure if it's worth supporting when the other value
    > can't be set too.  Maybe it'd be more useful to document that people can
    > set the system-wide values if they're desperate.
    
    Well, the default value for tcp_keepidle is 2 hours, and the default
    value for tcp_keepintvl is 75 seconds.  Assuming that tcp_keepcount
    defaults to something reasonable (I think the default on Linux is 9),
    the lion's share of the time will be waiting for tcp_keepidle - so
    just the ability to reduce that value to something reasonable should
    help a lot.  It's also not much code - proposed patch attached.
    
    Some documentation of how to change this stuff via sysctl on various
    OSes wouldn't be a bad thing either - anyone feel like writing
    something up?
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise Postgres Company
    
  5. Re: keepalives on MacOS X

    Fujii Masao <masao.fujii@gmail.com> — 2010-06-30T02:53:33Z

    On Tue, Jun 29, 2010 at 11:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:
    > On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >> Yeah, a bit of rooting around in the Darwin sources shows that this
    >> value is used as a per-connection override for tcp_keepidle.  So it
    >> is a synonym.  Not sure if it's worth supporting when the other value
    >> can't be set too.  Maybe it'd be more useful to document that people can
    >> set the system-wide values if they're desperate.
    >
    > Well, the default value for tcp_keepidle is 2 hours, and the default
    > value for tcp_keepintvl is 75 seconds.  Assuming that tcp_keepcount
    > defaults to something reasonable (I think the default on Linux is 9),
    > the lion's share of the time will be waiting for tcp_keepidle - so
    > just the ability to reduce that value to something reasonable should
    > help a lot.  It's also not much code - proposed patch attached.
    
    src/interfaces/libpq/fe-connect.c
    +		appendPQExpBuffer(&conn->errorMessage,
    +						  libpq_gettext("setsockopt(TCP_KEEPIDLE) failed: %s\n"),
    +						  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
    
    s/TCP_KEEPIDLE/TCP_KEEPALIVE
    
    Don't we need to change pq_getkeepalivesidle?
    
    In pq_setkeepalivesidle, if neither TCP_KEEPIDLE nor TCP_KEEPALIVE are
    supported, the following message is output.
    
        setsockopt(TCP_KEEPIDLE) not supported
    
    We should change it to something like?
    
        neither setsockopt(TCP_KEEPIDLE) nor setsockopt(TCP_KEEPALIVE) are supported
    
    Regards,
    
    -- 
    Fujii Masao
    NIPPON TELEGRAPH AND TELEPHONE CORPORATION
    NTT Open Source Software Center
    
    
  6. Re: keepalives on MacOS X

    Robert Haas <robertmhaas@gmail.com> — 2010-07-02T21:44:14Z

    On Tue, Jun 29, 2010 at 10:53 PM, Fujii Masao <masao.fujii@gmail.com> wrote:
    > On Tue, Jun 29, 2010 at 11:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:
    >> On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >>> Yeah, a bit of rooting around in the Darwin sources shows that this
    >>> value is used as a per-connection override for tcp_keepidle.  So it
    >>> is a synonym.  Not sure if it's worth supporting when the other value
    >>> can't be set too.  Maybe it'd be more useful to document that people can
    >>> set the system-wide values if they're desperate.
    >>
    >> Well, the default value for tcp_keepidle is 2 hours, and the default
    >> value for tcp_keepintvl is 75 seconds.  Assuming that tcp_keepcount
    >> defaults to something reasonable (I think the default on Linux is 9),
    >> the lion's share of the time will be waiting for tcp_keepidle - so
    >> just the ability to reduce that value to something reasonable should
    >> help a lot.  It's also not much code - proposed patch attached.
    >
    > src/interfaces/libpq/fe-connect.c
    > +               appendPQExpBuffer(&conn->errorMessage,
    > +                                                 libpq_gettext("setsockopt(TCP_KEEPIDLE) failed: %s\n"),
    > +                                                 SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
    >
    > s/TCP_KEEPIDLE/TCP_KEEPALIVE
    
    Fixed.
    
    > Don't we need to change pq_getkeepalivesidle?
    
    I changed this, but it doesn't seem to have done much.  When I do
    "show tcp_keepalives_idle" on MacOS X, I still get 0.  gdb says
    getsockopt is getting called, though.  Am I doing something boneheaded
    here, or is this just the behavior?
    
    > In pq_setkeepalivesidle, if neither TCP_KEEPIDLE nor TCP_KEEPALIVE are
    > supported, the following message is output.
    >
    >    setsockopt(TCP_KEEPIDLE) not supported
    
    Fixed.
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise Postgres Company
    
  7. Re: keepalives on MacOS X

    Robert Haas <robertmhaas@gmail.com> — 2010-07-06T21:20:40Z

    On Fri, Jul 2, 2010 at 5:44 PM, Robert Haas <robertmhaas@gmail.com> wrote:
    > On Tue, Jun 29, 2010 at 10:53 PM, Fujii Masao <masao.fujii@gmail.com> wrote:
    >> On Tue, Jun 29, 2010 at 11:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:
    >>> On Tue, Jun 29, 2010 at 12:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >>>> Yeah, a bit of rooting around in the Darwin sources shows that this
    >>>> value is used as a per-connection override for tcp_keepidle.  So it
    >>>> is a synonym.  Not sure if it's worth supporting when the other value
    >>>> can't be set too.  Maybe it'd be more useful to document that people can
    >>>> set the system-wide values if they're desperate.
    >>>
    >>> Well, the default value for tcp_keepidle is 2 hours, and the default
    >>> value for tcp_keepintvl is 75 seconds.  Assuming that tcp_keepcount
    >>> defaults to something reasonable (I think the default on Linux is 9),
    >>> the lion's share of the time will be waiting for tcp_keepidle - so
    >>> just the ability to reduce that value to something reasonable should
    >>> help a lot.  It's also not much code - proposed patch attached.
    >>
    >> src/interfaces/libpq/fe-connect.c
    >> +               appendPQExpBuffer(&conn->errorMessage,
    >> +                                                 libpq_gettext("setsockopt(TCP_KEEPIDLE) failed: %s\n"),
    >> +                                                 SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
    >>
    >> s/TCP_KEEPIDLE/TCP_KEEPALIVE
    >
    > Fixed.
    >
    >> Don't we need to change pq_getkeepalivesidle?
    >
    > I changed this, but it doesn't seem to have done much.  When I do
    > "show tcp_keepalives_idle" on MacOS X, I still get 0.  gdb says
    > getsockopt is getting called, though.  Am I doing something boneheaded
    > here, or is this just the behavior?
    >
    >> In pq_setkeepalivesidle, if neither TCP_KEEPIDLE nor TCP_KEEPALIVE are
    >> supported, the following message is output.
    >>
    >>    setsockopt(TCP_KEEPIDLE) not supported
    >
    > Fixed.
    
    Committed, after some further testing.
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise Postgres Company