Dmitry Samonenko wrote:
> I have an application which uses libpq for interaction with remote PostgreSQL 
> 9.2.4 server. Clients
> and Server nodes are running Linux and connection is established using TCPv4. 
> The client application
> has some small fault-tolerance features, which are activated when server 
> related problems are
> encountered.
> 
> One day some bad things happened with network layer hardware and, long story 
> short, host with PSQL
> server got isolated. All TCP messages routed to server node were NOT 
> delivered or acknowledged in any
> way. Client application got blocked in libpq code according to debugger.
> 
> I have successfully reproduced the problem in the laboratory environment. 
> These iptables commands
> should be run on the server node after some period of client <-> server 
> interaction:
> 
> # iptables -A OUTPUT -p tcp --sport 5432 -j DROP
> # iptables -A INPUT  -p tcp --dport 5432 -j DROP
> 
> 
> I made a glimpse over master branch of libpq sources and some questions 
> arose. Namely:
> 
> 1. Connection to PSQL server is made without an option to specify SO_RCVTIMEO 
> and SO_SNDTIMEO. Why is
> that? Is setting socket timeouts considered harmful?
> 
> 2. PQexec ultimately leads to PQwait, which after some function calls "lands" 
> in pqSocketCheck and
> pqSocketPoll. These 2 functions have parameter end_time. It is set (-1) for 
> PQexec scenario, which
> leads to infinite poll timeout in pqSocketPoll. Is it possible to implement 
> configurable timeout for
> PQexec calls? Is there some implemented features, which should be used to 
> handle situation like this?
> 
> Currently, I have changed Linux kernel tcp4 stack counters responsible for 
> retransmission, so OS
> actually closes socket after some period. This is detected by pqSocketPoll's 
> poll and libpq handles
> situation correctly - error is reported to my application. But it's just a 
> workaround.
> 
> So, this infinite poll situation looks like imperfection to me and I think it 
> should be considered as
> a bug. Is it?

In PostgreSQL you can handle the problem of dying connections by setting the
tcp_keepalives_* parameters (see 
http://www.postgresql.org/docs/current/static/runtime-config-connection.html).

That should take care of the problem, right?

Yours,
Laurenz Albe

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to