Re: [BUGS] BUG #14720: getsockopt(TCP_KEEPALIVE) failed: Option not supported by protocol - Mailing list pgsql-bugs
| From | Tom Lane |
|---|---|
| Subject | Re: [BUGS] BUG #14720: getsockopt(TCP_KEEPALIVE) failed: Option not supported by protocol |
| Date | |
| Msg-id | 1982.1498602401@sss.pgh.pa.us Whole thread Raw |
| In response to | Re: [BUGS] BUG #14720: getsockopt(TCP_KEEPALIVE) failed: Option not supported by protocol (Tom Lane <tgl@sss.pgh.pa.us>) |
| Responses |
Re: [BUGS] BUG #14720: getsockopt(TCP_KEEPALIVE) failed: Option notsupported by protocol
Re: [BUGS] BUG #14720: getsockopt(TCP_KEEPALIVE) failed: Option not supported by protocol |
| List | pgsql-bugs |
I wrote:
> So apparently, Linux's TCP_KEEPIDLE corresponds to Solaris'
> TCP_KEEPALIVE_THRESHOLD. TCP_KEEPINTVL and TCP_KEEPCNT seem to have no
> direct equivalent, although TCP_KEEPALIVE_ABORT_THRESHOLD would correspond
> to their product.
> I suggest that we ought to expand the keepalive code to know about this
> synonym.
Concretely, something like the attached. I have no way to test this
locally, so I'm thinking of just pushing it and seeing what the buildfarm
says.
regards, tom lane
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 261e9be..c62f7e9 100644
*** a/src/backend/libpq/pqcomm.c
--- b/src/backend/libpq/pqcomm.c
*************** pq_setkeepaliveswin32(Port *port, int id
*** 1676,1682 ****
int
pq_getkeepalivesidle(Port *port)
{
! #if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE) || defined(WIN32)
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return 0;
--- 1676,1682 ----
int
pq_getkeepalivesidle(Port *port)
{
! #if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE_THRESHOLD) || defined(TCP_KEEPALIVE) || defined(WIN32)
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return 0;
*************** pq_getkeepalivesidle(Port *port)
*** 1688,1694 ****
#ifndef WIN32
ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_idle);
! #ifdef TCP_KEEPIDLE
if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPIDLE,
(char *) &port->default_keepalives_idle,
&size) < 0)
--- 1688,1695 ----
#ifndef WIN32
ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_idle);
! #if defined(TCP_KEEPIDLE)
! /* TCP_KEEPIDLE is the name of this option on Linux and *BSD */
if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPIDLE,
(char *) &port->default_keepalives_idle,
&size) < 0)
*************** pq_getkeepalivesidle(Port *port)
*** 1696,1702 ****
elog(LOG, "getsockopt(TCP_KEEPIDLE) failed: %m");
port->default_keepalives_idle = -1; /* don't know */
}
! #else
if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPALIVE,
(char *) &port->default_keepalives_idle,
&size) < 0)
--- 1697,1713 ----
elog(LOG, "getsockopt(TCP_KEEPIDLE) failed: %m");
port->default_keepalives_idle = -1; /* don't know */
}
! #elif defined(TCP_KEEPALIVE_THRESHOLD)
! /* TCP_KEEPALIVE_THRESHOLD is the name of this option on Solaris */
! if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPALIVE_THRESHOLD,
! (char *) &port->default_keepalives_idle,
! &size) < 0)
! {
! elog(LOG, "getsockopt(TCP_KEEPALIVE_THRESHOLD) failed: %m");
! port->default_keepalives_idle = -1; /* don't know */
! }
! #else /* must have TCP_KEEPALIVE */
! /* TCP_KEEPALIVE is the name of this option on macOS */
if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPALIVE,
(char *) &port->default_keepalives_idle,
&size) < 0)
*************** pq_getkeepalivesidle(Port *port)
*** 1704,1710 ****
elog(LOG, "getsockopt(TCP_KEEPALIVE) failed: %m");
port->default_keepalives_idle = -1; /* don't know */
}
! #endif /* TCP_KEEPIDLE */
#else /* WIN32 */
/* We can't get the defaults on Windows, so return "don't know" */
port->default_keepalives_idle = -1;
--- 1715,1721 ----
elog(LOG, "getsockopt(TCP_KEEPALIVE) failed: %m");
port->default_keepalives_idle = -1; /* don't know */
}
! #endif /* KEEPIDLE/KEEPALIVE_THRESHOLD/KEEPALIVE */
#else /* WIN32 */
/* We can't get the defaults on Windows, so return "don't know" */
port->default_keepalives_idle = -1;
*************** pq_setkeepalivesidle(int idle, Port *por
*** 1723,1729 ****
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return STATUS_OK;
! #if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE) || defined(SIO_KEEPALIVE_VALS)
if (idle == port->keepalives_idle)
return STATUS_OK;
--- 1734,1741 ----
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return STATUS_OK;
! /* check SIO_KEEPALIVE_VALS here, not just WIN32, as some toolchains lack it */
! #if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE_THRESHOLD) || defined(TCP_KEEPALIVE) ||
defined(SIO_KEEPALIVE_VALS)
if (idle == port->keepalives_idle)
return STATUS_OK;
*************** pq_setkeepalivesidle(int idle, Port *por
*** 1742,1755 ****
if (idle == 0)
idle = port->default_keepalives_idle;
! #ifdef TCP_KEEPIDLE
if (setsockopt(port->sock, IPPROTO_TCP, TCP_KEEPIDLE,
(char *) &idle, sizeof(idle)) < 0)
{
elog(LOG, "setsockopt(TCP_KEEPIDLE) failed: %m");
return STATUS_ERROR;
}
! #else
if (setsockopt(port->sock, IPPROTO_TCP, TCP_KEEPALIVE,
(char *) &idle, sizeof(idle)) < 0)
{
--- 1754,1777 ----
if (idle == 0)
idle = port->default_keepalives_idle;
! #if defined(TCP_KEEPIDLE)
! /* TCP_KEEPIDLE is the name of this option on Linux and *BSD */
if (setsockopt(port->sock, IPPROTO_TCP, TCP_KEEPIDLE,
(char *) &idle, sizeof(idle)) < 0)
{
elog(LOG, "setsockopt(TCP_KEEPIDLE) failed: %m");
return STATUS_ERROR;
}
! #elif defined(TCP_KEEPALIVE_THRESHOLD)
! /* TCP_KEEPALIVE_THRESHOLD is the name of this option on Solaris */
! if (setsockopt(port->sock, IPPROTO_TCP, TCP_KEEPALIVE_THRESHOLD,
! (char *) &idle, sizeof(idle)) < 0)
! {
! elog(LOG, "setsockopt(TCP_KEEPALIVE_THRESHOLD) failed: %m");
! return STATUS_ERROR;
! }
! #else /* must have TCP_KEEPALIVE */
! /* TCP_KEEPALIVE is the name of this option on macOS */
if (setsockopt(port->sock, IPPROTO_TCP, TCP_KEEPALIVE,
(char *) &idle, sizeof(idle)) < 0)
{
*************** pq_setkeepalivesidle(int idle, Port *por
*** 1762,1768 ****
#else /* WIN32 */
return pq_setkeepaliveswin32(port, idle, port->keepalives_interval);
#endif
! #else /* TCP_KEEPIDLE || SIO_KEEPALIVE_VALS */
if (idle != 0)
{
elog(LOG, "setting the keepalive idle time is not supported");
--- 1784,1790 ----
#else /* WIN32 */
return pq_setkeepaliveswin32(port, idle, port->keepalives_interval);
#endif
! #else /* no way to set it */
if (idle != 0)
{
elog(LOG, "setting the keepalive idle time is not supported");
*************** pq_setkeepalivesinterval(int interval, P
*** 1812,1818 ****
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return STATUS_OK;
! #if defined(TCP_KEEPINTVL) || defined (SIO_KEEPALIVE_VALS)
if (interval == port->keepalives_interval)
return STATUS_OK;
--- 1834,1840 ----
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return STATUS_OK;
! #if defined(TCP_KEEPINTVL) || defined(SIO_KEEPALIVE_VALS)
if (interval == port->keepalives_interval)
return STATUS_OK;
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 764e960..e32c42b 100644
*** a/src/interfaces/libpq/fe-connect.c
--- b/src/interfaces/libpq/fe-connect.c
*************** setKeepalivesIdle(PGconn *conn)
*** 1470,1476 ****
if (idle < 0)
idle = 0;
! #ifdef TCP_KEEPIDLE
if (setsockopt(conn->sock, IPPROTO_TCP, TCP_KEEPIDLE,
(char *) &idle, sizeof(idle)) < 0)
{
--- 1470,1477 ----
if (idle < 0)
idle = 0;
! #if defined(TCP_KEEPIDLE)
! /* TCP_KEEPIDLE is the name of this option on Linux and *BSD */
if (setsockopt(conn->sock, IPPROTO_TCP, TCP_KEEPIDLE,
(char *) &idle, sizeof(idle)) < 0)
{
*************** setKeepalivesIdle(PGconn *conn)
*** 1481,1489 ****
SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
return 0;
}
! #else
! #ifdef TCP_KEEPALIVE
! /* macOS uses TCP_KEEPALIVE rather than TCP_KEEPIDLE */
if (setsockopt(conn->sock, IPPROTO_TCP, TCP_KEEPALIVE,
(char *) &idle, sizeof(idle)) < 0)
{
--- 1482,1501 ----
SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
return 0;
}
! #elif defined(TCP_KEEPALIVE_THRESHOLD)
! /* TCP_KEEPALIVE_THRESHOLD is the name of this option on Solaris */
! if (setsockopt(conn->sock, IPPROTO_TCP, TCP_KEEPALIVE_THRESHOLD,
! (char *) &idle, sizeof(idle)) < 0)
! {
! char sebuf[256];
!
! appendPQExpBuffer(&conn->errorMessage,
! libpq_gettext("setsockopt(TCP_KEEPALIVE_THRESHOLD) failed: %s\n"),
! SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
! return 0;
! }
! #elif defined(TCP_KEEPALIVE)
! /* TCP_KEEPALIVE is the name of this option on macOS */
if (setsockopt(conn->sock, IPPROTO_TCP, TCP_KEEPALIVE,
(char *) &idle, sizeof(idle)) < 0)
{
*************** setKeepalivesIdle(PGconn *conn)
*** 1495,1501 ****
return 0;
}
#endif
- #endif
return 1;
}
--- 1507,1512 ----
*************** setKeepalivesCount(PGconn *conn)
*** 1562,1568 ****
return 1;
}
! #else /* Win32 */
#ifdef SIO_KEEPALIVE_VALS
/*
* Enable keepalives and set the keepalive values on Win32,
--- 1573,1579 ----
return 1;
}
! #else /* WIN32 */
#ifdef SIO_KEEPALIVE_VALS
/*
* Enable keepalives and set the keepalive values on Win32,
--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs
pgsql-bugs by date: