Re: [PG19] Promotion hangs behind a backend blocked on a stuck client

From: Alexander Lakhin <exclusion(at)gmail(dot)com>
To: Manu <manuelreyesbravo(at)gmail(dot)com>, shihao zhong <zhong950419(at)gmail(dot)com>
Cc: Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>, "Hayato Kuroda (Fujitsu)" <kuroda(dot)hayato(at)fujitsu(dot)com>, shveta malik <shveta(dot)malik(at)gmail(dot)com>, Zhijie Hou <houzhijie22(at)gmail(dot)com>, Fujii Masao <masao(dot)fujii(at)gmail(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Noah Misch <noah(at)leadboat(dot)com>, pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: [PG19] Promotion hangs behind a backend blocked on a stuck client
Date: 2026-10-23 10:00:00
Message-ID: afcb9ede-9af3-4135-a252-70bedd77d482@gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hello hackers,

23.10.2026 08:05, Manu wrote:
>> One case is still stuck. A backend can block while it sends an error.
>> It holds interrupts then, so SIGTERM does nothing. v2 still logs
>> "terminating process". That can confuse users.
> Reproduced with SELECT repeat('x', 30000000)::int from a client that
> does not read: the backend sits in EmitErrorReport() -> ... ->
> secure_write() with InterruptHoldoffCount = 1 and wait event
> ClientWrite. After pg_terminate_backend() it was still there 10 s
> later, 3/3 on master and on v2, and v2 logged "terminating process".

I'm sorry for being late to this train and maybe a bit off-topic, but I'd
like to share one more way to have a backend blocked on connection due to
a barrier not absorbed:
echo "
synchronous_standby_names = 'nosuch'
synchronous_commit = local
authentication_timeout = 10s
log_connections = on
" > $PGDATA/postgresql.auto.conf

pg_ctl -l server.log -w start
psql -c "SHOW procsignal_barrier_timeout"
psql -c "CREATE DATABASE victim"
psql -c "SET synchronous_commit = remote_apply" -c "CREATE TABLE t ()" &
sleep 1
psql -c "DROP DATABASE victim WITH (FORCE)" &
sleep 1
psql -c "VACUUM FULL pg_subscription" &
sleep 2
psql -c "VACUUM FULL pg_authid"

echo "Test connection..."
date
timeout 60 psql -c "SELECT 1" || echo "Connection timeout"
date
pg_ctl -m fast stop
wait

The script produces:
 procsignal_barrier_timeout
----------------------------
 30s
(1 row)

CREATE DATABASE
SET
VACUUM
Test connection...
Fri Oct 23 12:21:18 PM EEST 2026
Connection timeout
Fri Oct 23 12:22:18 PM EEST 2026

2026-10-23 12:21:18.412 EEST [3519423] LOG:  connection received: host=[local]
2026-10-23 12:21:18.413 EEST [3519423] LOG:  connection authenticated: user="law" method=trust (.../pg_hba.conf:117)
2026-10-23 12:21:18.413 EEST [3519423] LOG:  connection authorized: user=law database=postgres application_name=psql
2026-10-23 12:21:19.417 EEST [3519423] LOG:  process 3519423 still waiting for AccessShareLock on relation 6100 of
database 0 after 1000.027 ms
2026-10-23 12:21:19.417 EEST [3519423] DETAIL:  Process holding the lock: 3519408. Wait queue: 3519413, 3519423.
2026-10-23 12:21:19.417 EEST [3519423] CONTEXT:  waiting for AccessShareLock on relation 6100 of database 0
2026-10-23 12:21:20.418 EEST [3519408] LOG:  still waiting for backend with PID 3519403 to accept ProcSignalBarrier
2026-10-23 12:21:20.418 EEST [3519408] STATEMENT:  DROP DATABASE victim WITH (FORCE)
2026-10-23 12:21:25.419 EEST [3519408] LOG:  still waiting for backend with PID 3519403 to accept ProcSignalBarrier
2026-10-23 12:21:25.419 EEST [3519408] STATEMENT:  DROP DATABASE victim WITH (FORCE)
...
2026-10-23 12:22:10.441 EEST [3519408] LOG:  still waiting for backend with PID 3519403 to accept ProcSignalBarrier
2026-10-23 12:22:10.441 EEST [3519408] STATEMENT:  DROP DATABASE victim WITH (FORCE)
2026-10-23 12:22:15.268 EEST [3519536] LOG:  process 3519536 still waiting for AccessShareLock on relation 6100 of
database 0 after 1000.047 ms
2026-10-23 12:22:15.268 EEST [3519536] DETAIL:  Process holding the lock: 3519408. Wait queue: 3519413, 3519423, 3519536.
2026-10-23 12:22:15.268 EEST [3519536] CONTEXT:  waiting for AccessShareLock on relation 6100 of database 0
2026-10-23 12:22:15.447 EEST [3519408] LOG:  still waiting for backend with PID 3519403 to accept ProcSignalBarrier
2026-10-23 12:22:15.447 EEST [3519408] STATEMENT:  DROP DATABASE victim WITH (FORCE)
2026-10-23 12:22:18.412 EEST [3519386] LOG:  received fast shutdown request

That is, with v3 applied, a backend still gets stuck.

Best regards,
Alexander Lakhin
Databricks

In response to

Browse pgsql-hackers by date

  From Date Subject
Previous Message Amit Langote 2026-10-23 09:58:22 Re: Re: [PATCH] Fix segmentation fault caused by reentrancy in RI_Fkey_cascade_del (ri_triggers.c)