Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wPYgW-000ppR-1j for pgsql-bugs@arkaria.postgresql.org; Wed, 20 May 2026 04:37:32 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPYgT-006Cnk-1M for pgsql-bugs@arkaria.postgresql.org; Wed, 20 May 2026 04:37:30 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wPYgS-006Cnc-3D for pgsql-bugs@lists.postgresql.org; Wed, 20 May 2026 04:37:30 +0000 Received: from mail-yx1-xb135.google.com ([2607:f8b0:4864:20::b135]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wPYgQ-00000000Qut-41Y7 for pgsql-bugs@lists.postgresql.org; Wed, 20 May 2026 04:37:28 +0000 Received: by mail-yx1-xb135.google.com with SMTP id 956f58d0204a3-65e170f1ca5so4493812d50.0 for ; Tue, 19 May 2026 21:37:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779251847; cv=none; d=google.com; s=arc-20240605; b=UvRrfCqSCWWpLzqV9WjcVjYbM7O5MCK+RyhipMP6qCK1pBTbi8BGtpdtONqdV7OFps 2FQGVa3Wbjcb6nCNr+m1But1DDHhG9MKU9SWKfsAy4xcn/Tta4/s5PVfxyM2bLwJ8HdM BaubzLyPBoWzbk+IbXjyNM8KbUb4Vb4NUv8TxnveBdd3TOx5H4rKkF867wPVaAySBAY9 AJU4hjiMhDwP3gsFltV5BvbMjN7R486QxO8rrd/bdyB4t5ZGUliR8EexQzVp9tkToIsE p5NZpav2Znvkn5Ho+qfRH1gemZ1RhNPHo9hyIllOFcZ9CljeiQW8mlXbhXmqOrD24YDM tr+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=vOaFpuOJ4fvNyNSmGrGlnrxXqdZVezHlRfmxH0LF/yY=; fh=HZUkF1WTG/EzC6gjDUP6uzo7stWPpbicjYwP/hbz8dg=; b=EIxsvxRjlmnj2LHPrLqXtJtUZ4bS4Fzzgnw9FnZqTtdAIIVrMUYTfBD812i5xDHPmN PETZwUt5OF3CL0q27OxtHZMMp8AIckJbonswyPPGqh4SZzvS+d9At9+xJIwKKO5yAyDI YB9dgMbe7V7dzDndeNlpwDtQ2X7UHjGdvbTP8v4He1gFF+pO//iQ+DkZUDfojANgbtwf lxFkKJiCVFO0MzsZ06+KdKRvrvNWCgNzXgD6MX9YSiyINjou6u8XvyshLnmzJSJotVsq nGCqXCc9NtCQ2onH48GN9GEZAICSRmIIGGiux7RwH1MGs50K9VNM91AUwiEXT/yYl6IE eD2w==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779251847; x=1779856647; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=vOaFpuOJ4fvNyNSmGrGlnrxXqdZVezHlRfmxH0LF/yY=; b=H6Jzh3cOTW7GoabP/IB60ipoumi979o9V7zl3NwB+oNURFdQ38Z4GwvqFxxu+t9Z9M OFfk95NK7k+LIzjB82WJy11BFUbzrLDXfmdHMffTK75Da9dD/OS/CdzbjWVDppXqegdw 20pM9nlNhXOAYZsUiHotqKulzzMCKfLPYqssblcUBCPhDYvj50CmABEZMU23xuIQhYk3 JGBGLyX3ObiEILcdsUEBL1opzt+STZw35raO3HWcPzwxQk+zHhbAm9dZbJTKK3vvWuU8 OM39tVJwv7lpoueBmweNLUdllEZGlnjd7TE4P7Seguc2EbWw+6hXRK4lTYNX2lr2jPVG obUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779251847; x=1779856647; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=vOaFpuOJ4fvNyNSmGrGlnrxXqdZVezHlRfmxH0LF/yY=; b=rTwgOfnFZwRW0+Rk+NVNknCgzW236nYDsz4zXD9U5dBCdubfoqgXmdX+lO3lo3Aerb 5f1PAyq6aJydVPHYbsDpLUKDxgZ3qcJj2nT41WyV745pML0DcqqiT+HHR77UYOiJ3L7w LxWjwh40tB8hmSPOr/sVnzKcbBFuv5eIrGtTHAG3BeaV+ieq2idMoWY0tpqConMYaB3q DYn8yuxXxOfkRQuTHjWix1NHTxkel1AsO84ApnL2d8V6NOAlBFvGRAbd9LErPDdmqix2 TqrntFMhlpwHCgF9MLvlQwFm8q/1tm5O3fTwR8eEfHhIQ1665Zg0tDpNQ1+2GtoNfbbQ lyjA== X-Forwarded-Encrypted: i=1; AFNElJ+/TwMon5o6uZzfo8Rjd5T0bGDBAxRIUXH4LT7cERqENjIeY3cuC53t5SgtF1LGfCaHxjXNpfE8DHQu@lists.postgresql.org X-Gm-Message-State: AOJu0YzmFONGTx32QGHcqWpxXiCg27DKVpHDeIKRTkYjHXrVqvK1Kx65 If5r6qPUZd3ZQFmcj3Wz73LJuO9PuSmWtRv0WWtisdAvB9Bvfk2cOQ/rWbcRfS01i/YjlVkacqO feBIrS9cg2BkTca0sxolm0TknvDmD2Hg= X-Gm-Gg: Acq92OEcjcpZ5cBw2dHRrc7NrbosDGZpIDidz4S5QY7oiQ1CA3rhyp+avbJjO0tcymF YiW8IlsK7UzkNIl+cbRZml1TKZv9qXXgForYpmOWwnbhTiVfjDGic5EaRfQPEQWa70wHhmACfj5 dHRex9cBOjR8M6jJufO+ukOug7oy1plI8bZTGz4AGttrdZ8/LciWWfFvbJDscFkonrEy7r+kdN2 2Aptb7kkkg6/ee0iZrjZcLQ0W3xQraFne7BULueL6mbySJ+27G8O9h4icZ/lQXVzd5Ls0BzeeWN PqiaeA== X-Received: by 2002:a05:690c:25c9:b0:7d0:6660:160e with SMTP id 00721157ae682-7d066602707mr29636447b3.3.1779251846875; Tue, 19 May 2026 21:37:26 -0700 (PDT) MIME-Version: 1.0 References: <19488-d7ccfca2bf6b74b0@postgresql.org> In-Reply-To: <19488-d7ccfca2bf6b74b0@postgresql.org> From: Ayush Tiwari Date: Wed, 20 May 2026 10:07:15 +0530 X-Gm-Features: AVHnY4KJwvs2uxw9aB3XCugucMCu9v8jhWKpznVJ3hEOOEnCzp8KeaXdVqFJHCk Message-ID: Subject: Re: BUG #19488: Standby connection fails after dropping on login event trigger enabled always To: kyzevan23@mail.ru, pgsql-bugs@lists.postgresql.org Cc: Alexander Korotkov Content-Type: multipart/mixed; boundary="0000000000004cc5ed0652385af1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000004cc5ed0652385af1 Content-Type: multipart/alternative; boundary="0000000000004cc5ec0652385aef" --0000000000004cc5ec0652385aef Content-Type: text/plain; charset="UTF-8" Hi, On Wed, 20 May 2026 at 02:34, PG Bug reporting form wrote: > The following bug has been logged on the website: > > Bug reference: 19488 > Logged by: Egor Chindyaskin > Email address: kyzevan23@mail.ru > PostgreSQL version: 18.4 > Operating system: Ubuntu 26.04 > Description: > > Hello! > In a master + physical standby setup, connection to the standby fails after > creating a login event trigger on the master, enabling it as always, and > then dropping it without reconnecting to the master. > Also reproduces on master branch. > Steps to reproduce: > > 1. Run the following SQL script on the master: > CREATE OR REPLACE FUNCTION init_session() > RETURNS event_trigger SECURITY DEFINER > LANGUAGE plpgsql AS > $$ > BEGIN > RAISE NOTICE 'init_session'; > END; > $$; > > CREATE EVENT TRIGGER init_session > ON login > EXECUTE FUNCTION init_session(); > > ALTER EVENT TRIGGER init_session ENABLE ALWAYS; > > DROP EVENT TRIGGER init_session; > > 2. Try to connect to the standby: > psql -p5433 > > Result: > psql: error: connection to server on socket "/tmp/.s.PGSQL.5433" failed: > FATAL: cannot acquire lock mode AccessExclusiveLock on database objects > while recovery is in progress > HINT: Only RowExclusiveLock or less can be acquired on database objects > during recovery. > > -- > With best regards, > Egor Chindyaskin > > Postgres Professional: https://postgrespro.com Thanks for the report and the precise repro. The cause is in EventTriggerOnLogin(). When a session connects to a database whose pg_database.dathasloginevt flag is set but no login event triggers are actually present, the function tries to clear the flag via: ConditionalLockSharedObject(DatabaseRelationId, MyDatabaseId, 0, AccessExclusiveLock); On a hot standby, LockAcquireExtended() refuses any lock stronger than RowExclusiveLock on LOCKTAG_OBJECT/LOCKTAG_RELATION while RecoveryInProgress() is true, which surfaces as a FATAL on the new connection. The standby ends up in this state precisely after your steps because the primary set dathasloginevt = true while the trigger was active, then dropped the trigger but (intentionally) left the flag set on disk for the next normal connection to clean up. That state replicates to the standby, and any subsequent connection on the standby then enters the cleanup path and crashes. A standby should not try to clear that flag itself(?) the only correct update path on a standby is WAL replay from the primary. Attached patch adds a RecoveryInProgress() check to skip the cleanup branch on standbys. I think this needs to be backpatched too. Regards, Ayush --0000000000004cc5ec0652385aef Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

On We= d, 20 May 2026 at 02:34, PG Bug reporting form <noreply@postgresql.org> wrote:
The following bug has been logged o= n the website:

Bug reference:=C2=A0 =C2=A0 =C2=A0 19488
Logged by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Egor Chindyaskin
Email address:=C2=A0 =C2=A0 =C2=A0 kyzevan23@mail.ru
PostgreSQL version: 18.4
Operating system:=C2=A0 =C2=A0Ubuntu 26.04
Description:=C2=A0 =C2=A0 =C2=A0 =C2=A0

Hello!
In a master + physical standby setup, connection to the standby fails after=
creating a login event trigger on the master, enabling it as always, and then dropping it without reconnecting to the master.
Also reproduces on master branch.
Steps to reproduce:

1. Run the following SQL script on the master:
CREATE OR REPLACE FUNCTION init_session()
=C2=A0 RETURNS event_trigger SECURITY DEFINER
=C2=A0 LANGUAGE plpgsql AS
$$
BEGIN
=C2=A0 RAISE NOTICE 'init_session';
END;
$$;

CREATE EVENT TRIGGER init_session
=C2=A0 ON login
=C2=A0 EXECUTE FUNCTION init_session();

ALTER EVENT TRIGGER init_session ENABLE ALWAYS;

DROP EVENT TRIGGER init_session;

2. Try to connect to the standby:
psql -p5433

Result:
psql: error: connection to server on socket "/tmp/.s.PGSQL.5433" = failed:
FATAL:=C2=A0 cannot acquire lock mode AccessExclusiveLock on database objec= ts
while recovery is in progress
HINT:=C2=A0 Only RowExclusiveLock or less can be acquired on database objec= ts
during recovery.

--
With best regards,
Egor Chindyaskin

Postgres Professional: https://postgrespro.com
=C2=A0Thanks for the report and the precise repro.

The cause is in Even= tTriggerOnLogin().=C2=A0 When a session connects to a
database whose pg_= database.dathasloginevt flag is set but no login
event triggers are actu= ally present, the function tries to clear the
flag via:

=C2=A0 Co= nditionalLockSharedObject(DatabaseRelationId, MyDatabaseId, 0,
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 AccessExclusiveLock);

On a hot standby, Loc= kAcquireExtended() refuses any lock stronger than
RowExclusiveLock on LO= CKTAG_OBJECT/LOCKTAG_RELATION while
RecoveryInProgress() is true, which = surfaces as a FATAL on the new
connection.=C2=A0 The standby ends up in = this state precisely after your
steps because the primary set dathaslogi= nevt =3D true while the trigger
was active, then dropped the trigger but= (intentionally) left the
flag set on disk for the next normal connectio= n to clean up.=C2=A0 That
state replicates to the standby, and any subse= quent connection on the
standby then enters the cleanup path and crashes= .

A standby should not try to clear that flag itself(?) the only cor= rect
update path on a standby is WAL replay from the primary.

Att= ached patch adds a RecoveryInProgress() check to skip the cleanup
b= ranch on standbys. I think this needs to be backpatched too.

Regards= ,
Ayush
--0000000000004cc5ec0652385aef-- --0000000000004cc5ed0652385af1 Content-Type: application/octet-stream; name="v1-0001-Skip-pg_database.dathasloginevt-cleanup-on-standb.patch" Content-Disposition: attachment; filename="v1-0001-Skip-pg_database.dathasloginevt-cleanup-on-standb.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpdkjl520 RnJvbSA4NzJhY2M3ZDhkYzNjNGVmZGFiYzJjZTMyZWY1NTU2YzQ2NDQwZTRkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeXVzaCBUaXdhcmkgPGF5dXNodGl3YXJpLnNsZzAxQGdtYWls LmNvbT4KRGF0ZTogV2VkLCAyMCBNYXkgMjAyNiAwMzozMzo0NiArMDAwMApTdWJqZWN0OiBbUEFU Q0ggdjFdIFNraXAgcGdfZGF0YWJhc2UuZGF0aGFzbG9naW5ldnQgY2xlYW51cCBvbiBzdGFuZGJ5 CgpFdmVudFRyaWdnZXJPbkxvZ2luKCkgdHJpZXMgdG8gY2xlYXIgcGdfZGF0YWJhc2UuZGF0aGFz bG9naW5ldnQgd2hlbgp0aGUgZGF0YWJhc2Ugbm8gbG9uZ2VyIGhhcyBhbnkgbG9naW4gZXZlbnQg dHJpZ2dlcnMgYnV0IHRoZSBmbGFnIGlzCnN0aWxsIHNldC4gIFRvIG1ha2UgdGhhdCBzYWZlIGFn YWluc3QgY29uY3VycmVudCBmbGFnIHNldHRlcnMsIGl0CnRha2VzIGEgY29uZGl0aW9uYWwgQWNj ZXNzRXhjbHVzaXZlTG9jayBvbiB0aGUgZGF0YWJhc2Ugb2JqZWN0LgoKT24gYSBob3Qgc3RhbmRi eSwgdGhhdCBsb2NrIGFjcXVpc2l0aW9uIGZhaWxzIG91dHJpZ2h0IHdpdGgKCiAgRkFUQUw6ICBj YW5ub3QgYWNxdWlyZSBsb2NrIG1vZGUgQWNjZXNzRXhjbHVzaXZlTG9jayBvbiBkYXRhYmFzZQog ICAgICAgICAgb2JqZWN0cyB3aGlsZSByZWNvdmVyeSBpcyBpbiBwcm9ncmVzcwoKYmVjYXVzZSBM b2NrQWNxdWlyZUV4dGVuZGVkKCkgcmVmdXNlcyBsb2NrcyBzdHJvbmdlciB0aGFuClJvd0V4Y2x1 c2l2ZUxvY2sgb24gZGF0YWJhc2Ugb2JqZWN0cyBkdXJpbmcgcmVjb3ZlcnkuICBUaGUgc3RhbmRi eQphbHJlYWR5IHJlcGxheXMgdGhlIGZsYWcncyB2YWx1ZSBmcm9tIHRoZSBwcmltYXJ5LCBzbyB0 aGUgZGFuZ2xpbmcKZmxhZyBpcyB0aGUgcmVzdWx0IG9mIHJlcGxheWluZyBhIHN0YXRlIGluIHdo aWNoIHRoZSBwcmltYXJ5IGhhZAphbHJlYWR5IGRyb3BwZWQgaXRzIGxvZ2luIGV2ZW50IHRyaWdn ZXJzIGJ1dCBub3QgeWV0IHJ1biBhIGxvZ2luIGV2ZW50CnRyaWdnZXIgcGFzcyB0byBjbGVhciB0 aGUgZmxhZy4gIEFueSBzZXNzaW9uIGNvbm5lY3RpbmcgdG8gdGhlIHN0YW5kYnkKaW4gdGhhdCB3 aW5kb3cgdGhlcmVmb3JlIGZhaWxzIHRvIGNvbm5lY3QuCgpTa2lwIHRoZSBjbGVhbnVwIG9uIGEg c3RhbmRieS4gIFRoZSBmbGFnIHdpbGwgYmUgY2xlYXJlZCB2aWEgV0FMCnJlcGxheSBvbmNlIHRo ZSBwcmltYXJ5IGNsZWFycyBpdCBvbiBpdHMgc2lkZSwgd2hpY2ggaXMgdGhlIG9ubHkKY29ycmVj dCB3YXkgdG8gdXBkYXRlIGEgY2F0YWxvZyBmcm9tIGEgc3RhbmRieS4KClJlcG9ydGVkLWJ5OiBF Z29yIENoaW5keWFza2luIDxreXpldmFuMjNAbWFpbC5ydT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9w b3N0Z3IuZXMvbS8xOTQ4OC0uLi5AcG9zdGdyZXNxbC5vcmcKLS0tCiBzcmMvYmFja2VuZC9jb21t YW5kcy9ldmVudF90cmlnZ2VyLmMgfCAxMSArKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDEw IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9j b21tYW5kcy9ldmVudF90cmlnZ2VyLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9ldmVudF90cmln Z2VyLmMKaW5kZXggZGNkMmY1YTA5YmIuLjA2ODA0MjEyNjhkIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9jb21tYW5kcy9ldmVudF90cmlnZ2VyLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv ZXZlbnRfdHJpZ2dlci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL2h0dXBf ZGV0YWlscy5oIgogI2luY2x1ZGUgImFjY2Vzcy90YWJsZS5oIgogI2luY2x1ZGUgImFjY2Vzcy94 YWN0LmgiCisjaW5jbHVkZSAiYWNjZXNzL3hsb2cuaCIKICNpbmNsdWRlICJjYXRhbG9nL2NhdGFs b2cuaCIKICNpbmNsdWRlICJjYXRhbG9nL2RlcGVuZGVuY3kuaCIKICNpbmNsdWRlICJjYXRhbG9n L2luZGV4aW5nLmgiCkBAIC05MzcsOCArOTM4LDE2IEBAIEV2ZW50VHJpZ2dlck9uTG9naW4odm9p ZCkKIAkgKiBsb2NrIHRvIHByZXZlbnQgY29uY3VycmVudCBTZXREYXRhYmFzZUhhc0xvZ2luRXZl bnRUcmlnZ2VycygpLCBidXQgd2UKIAkgKiBkb24ndCB3YW50IHRvIGhhbmcgdGhlIGNvbm5lY3Rp b24gd2FpdGluZyBvbiB0aGUgbG9jay4gIFRodXMsIHdlIGFyZQogCSAqIGp1c3QgdHJ5aW5nIHRv IGFjcXVpcmUgdGhlIGxvY2sgY29uZGl0aW9uYWxseS4KKwkgKgorCSAqIFNraXAgdGhpcyBvbiBh IGhvdCBzdGFuZGJ5OiB0aGUgY29uZGl0aW9uYWwgQWNjZXNzRXhjbHVzaXZlTG9jayBvbiB0aGUK KwkgKiBkYXRhYmFzZSBvYmplY3Qgd291bGQgZmFpbCB3aXRoICJjYW5ub3QgYWNxdWlyZSBsb2Nr IG1vZGUgLi4uIHdoaWxlCisJICogcmVjb3ZlcnkgaXMgaW4gcHJvZ3Jlc3MiLCB3aGljaCB0aGUg Y2FsbGVyIHdvdWxkIHN1cmZhY2UgYXMgYSBGQVRBTAorCSAqIGNvbm5lY3Rpb24gZXJyb3IuICBP biBhIHN0YW5kYnkgd2UgY2Fubm90IChhbmQgbXVzdCBub3QpIGNsZWFyIHRoZQorCSAqIHBnX2Rh dGFiYXNlIGZsYWcgb3Vyc2VsdmVzOyBpdCB3aWxsIGJlIGNsZWFyZWQgdmlhIFdBTCByZXBsYXkg b25jZSB0aGUKKwkgKiBwcmltYXJ5J3MgbmV4dCBsb2dpbiBldmVudCB0cmlnZ2VyIHJ1biBjbGVh cnMgaXQgb24gdGhlIHByaW1hcnkuCiAJICovCi0JZWxzZSBpZiAoQ29uZGl0aW9uYWxMb2NrU2hh cmVkT2JqZWN0KERhdGFiYXNlUmVsYXRpb25JZCwgTXlEYXRhYmFzZUlkLAorCWVsc2UgaWYgKCFS ZWNvdmVyeUluUHJvZ3Jlc3MoKSAmJgorCQkJIENvbmRpdGlvbmFsTG9ja1NoYXJlZE9iamVjdChE YXRhYmFzZVJlbGF0aW9uSWQsIE15RGF0YWJhc2VJZCwKIAkJCQkJCQkJCQkgMCwgQWNjZXNzRXhj bHVzaXZlTG9jaykpCiAJewogCQkvKgotLSAKMi40My4wCgo= --0000000000004cc5ed0652385af1--