tcp keep alive don't work when the backend is busy

From: Олег Самойлов <splarv(at)ya(dot)ru>
To: "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: tcp keep alive don't work when the backend is busy
Date: 2019-12-10 12:53:31
Message-ID: 3F592B64-264F-4E95-B555-7E7C9E8F57B8@ya.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

According to the documentation
https://www.postgresql.org/docs/12/runtime-config-connection.html
A backend must check connection to the client by tcp_keepalive messages. (Config option tcp_keepalives_idle).

But this is don't work if the backend is busy.

Simple example:

psql localhost

set tcp_keepalives_idle=1;
do $$begin loop perform pg_sleep(1);end loop;end;$$;

In other terminal kill -9 the psql on the first terminal.

select * from pg_stat_activity where state='active';
And we will see that the backend is still active and busy.

The more realistic example. In the real code one of the loops, due to bug with asynchronous communication, come to the infinite loop. And occupy a backend and locks for a two week after the client was killed, before we detected this.

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Олег Самойлов 2019-12-10 13:21:46 PGUSER and initdb
Previous Message stan 2019-12-10 11:48:23 server will not start (Debian)