Thread: pgsql: Make PQcancel use the PGconn's tcp_user_timeout and keepalives s

pgsql: Make PQcancel use the PGconn's tcp_user_timeout and keepalives s

From
Tom Lane
Date:
Make PQcancel use the PGconn's tcp_user_timeout and keepalives settings.

If connectivity to the server has been lost or become flaky, the
user might well try to send a query cancel.  It's highly annoying
if PQcancel hangs up in such a case, but that's exactly what's likely
to happen.  To ameliorate this problem, apply the PGconn's
tcp_user_timeout and keepalives settings to the TCP connection used
to send the cancel.  This should be safe on Unix machines, since POSIX
specifies that setsockopt() is async-signal-safe.  We are guessing
that WSAIoctl(SIO_KEEPALIVE_VALS) is similarly safe on Windows.
(Note that at least in psql and our other frontend programs, there's
no safety issue involved anyway, since we run PQcancel in its own
thread rather than in a signal handler.)

Most of the value here comes from the expectation that tcp_user_timeout
will be applied as a connection timeout.  That appears to happen on
Linux, even though its tcp(7) man page claims differently.  The
keepalive options probably won't help much, but as long as we can
apply them for not much code, we might as well.

Jelte Fennema, reviewed by Fujii Masao and myself

Discussion: https://postgr.es/m/AM5PR83MB017870DE81FC84D5E21E9D1EF7AA9@AM5PR83MB0178.EURPRD83.prod.outlook.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/5987feb70b5bbb1fc4e64d433f490df08d91dd45

Modified Files
--------------
doc/src/sgml/libpq.sgml           |   4 +-
src/interfaces/libpq/fe-connect.c | 249 +++++++++++++++++++++++++++++---------
src/interfaces/libpq/libpq-int.h  |   7 ++
3 files changed, 204 insertions(+), 56 deletions(-)