Re: BUG #18988: DROP SUBSCRIPTION locks not-yet-accessed database
vignesh C <vignesh21@gmail.com>
From: vignesh C <vignesh21@gmail.com>
To: "Hayato Kuroda (Fujitsu)" <kuroda.hayato@fujitsu.com>
Cc: Dilip Kumar <dilipbalaut@gmail.com>,
"exclusion@gmail.com" <exclusion@gmail.com>, "pgsql-bugs@lists.postgresql.org" <pgsql-bugs@lists.postgresql.org>
Date: 2025-08-04T03:37:00Z
Lists: pgsql-bugs
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix self-deadlock during DROP SUBSCRIPTION.
- aa21e49225a1 19 (unreleased) landed
- a5d4c04150d4 18.0 landed
- 288a817bcb04 17.7 landed
- 7ece7612906e 16.11 landed
- e41137155869 15.15 landed
- ef77502746fe 14.20 landed
- 0a98f24a65cd 13.23 landed
On Thu, 31 Jul 2025 at 14:34, Hayato Kuroda (Fujitsu) <kuroda.hayato@fujitsu.com> wrote: > > Dear Vignesh, Dilip, > > I found another corner case: > > ``` > postgres=# CREATE SUBSCRIPTION sub CONNECTION 'dbname=db1 user=postgres port=5431' PUBLICATION pub1 WITH (connect=false, slot_name=sub); > WARNING: subscription was created, but is not connected > HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription. > CREATE SUBSCRIPTION > postgres=# DROP SUBSCRIPTION sub ; > ... (won't return) > ``` > > Because still can explicitly specify the slot_name while creating the subscription. > Another pattern is to run ALTER SUBSCRIPTION SET (slot_name) command after the > CREATE SUBSCRIPTION WITH (connect=false);. > > Should we fix the case? If so, how? An alternative approach would be to acquire an AccessShareLock on pg_subscription, and then explicitly lock the target subscription row using LockSharedObject with AccessExclusiveLock while dropping the subscription. On the launcher side, before starting a worker, it should similarly acquire an AccessExclusiveLock on the corresponding subscription row using LockSharedObject. Once the lock is acquired, it must revalidate that the subscription still exists, to prevent race conditions with concurrent drops, before proceeding to start the worker. Thoughts? Regards, Vignesh