summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2010-07-06 21:14:25 +0000
committerRobert Haas <rhaas@postgresql.org>2010-07-06 21:14:25 +0000
commit5acd417c8f0f720418560360d9b3e543d593e4f0 (patch)
treefc0adb50cf0229f721c42a3f05e2a232bb97cc0a /src
parent3f12653b73f8f2ffdfecfde3272caebdbdd4262f (diff)
Support setting the keepalive idle time on MacOS X.
MacOS X uses TCP_KEEPALIVE rather than TCP_KEEPIDLE for this purpose. Thanks to Fujii Masao for the review.
Diffstat (limited to 'src')
-rw-r--r--src/backend/libpq/pqcomm.c27
-rw-r--r--src/interfaces/libpq/fe-connect.c16
2 files changed, 38 insertions, 5 deletions
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 7bf82933d5c..46577f379ac 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -30,7 +30,7 @@
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.209 2010/03/21 00:17:58 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.210 2010/07/06 21:14:25 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1317,7 +1317,7 @@ pq_endcopyout(bool errorAbort)
int
pq_getkeepalivesidle(Port *port)
{
-#ifdef TCP_KEEPIDLE
+#if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE)
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return 0;
@@ -1328,6 +1328,7 @@ pq_getkeepalivesidle(Port *port)
{
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)
@@ -1335,6 +1336,15 @@ pq_getkeepalivesidle(Port *port)
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)
+ {
+ elog(LOG, "getsockopt(TCP_KEEPALIVE) failed: %m");
+ port->default_keepalives_idle = -1; /* don't know */
+ }
+#endif
}
return port->default_keepalives_idle;
@@ -1349,7 +1359,7 @@ pq_setkeepalivesidle(int idle, Port *port)
if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family))
return STATUS_OK;
-#ifdef TCP_KEEPIDLE
+#if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE)
if (idle == port->keepalives_idle)
return STATUS_OK;
@@ -1367,18 +1377,27 @@ pq_setkeepalivesidle(int idle, Port *port)
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)
+ {
+ elog(LOG, "setsockopt(TCP_KEEPALIVE) failed: %m");
+ return STATUS_ERROR;
+ }
+#endif
port->keepalives_idle = idle;
#else
if (idle != 0)
{
- elog(LOG, "setsockopt(TCP_KEEPIDLE) not supported");
+ elog(LOG, "setting the keepalive idle time is not supported");
return STATUS_ERROR;
}
#endif
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 2c8a0593471..5bb404fc27e 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.395 2010/07/06 19:19:00 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.396 2010/07/06 21:14:25 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1008,6 +1008,20 @@ setKeepalivesIdle(PGconn *conn)
SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
return 0;
}
+#else
+#ifdef TCP_KEEPALIVE
+ /* Darwin uses TCP_KEEPALIVE rather than TCP_KEEPIDLE */
+ if (setsockopt(conn->sock, IPPROTO_TCP, TCP_KEEPALIVE,
+ (char *) &idle, sizeof(idle)) < 0)
+ {
+ char sebuf[256];
+
+ appendPQExpBuffer(&conn->errorMessage,
+ libpq_gettext("setsockopt(TCP_KEEPALIVE) failed: %s\n"),
+ SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
+ return 0;
+ }
+#endif
#endif
return 1;