Why ALTER SUBSCRIPTION ... SET (slot_name='none') requires subscription disabled? - Mailing list pgsql-hackers

From Japin Li
Subject Why ALTER SUBSCRIPTION ... SET (slot_name='none') requires subscription disabled?
Date
Msg-id MEYP282MB1669CBD98E721C77CA696499B61A9@MEYP282MB1669.AUSP282.PROD.OUTLOOK.COM
Whole thread Raw
Responses Re: Why ALTER SUBSCRIPTION ... SET (slot_name='none') requires subscription disabled?  (Amit Kapila <amit.kapila16@gmail.com>)
List pgsql-hackers
Hi, hackers

The documentation [1] says:

When dropping a subscription that is associated with a replication slot on the
remote host (the normal state), DROP SUBSCRIPTION will connect to the remote
host and try to drop the replication slot as part of its operation. This is
necessary so that the resources allocated for the subscription on the remote
host are released. If this fails, either because the remote host is not
reachable or because the remote replication slot cannot be dropped or does not
exist or never existed, the DROP SUBSCRIPTION command will fail. To proceed in
this situation, disassociate the subscription from the replication slot by
executing ALTER SUBSCRIPTION ... SET (slot_name = NONE).

However, when I try this, it complains the subscription is enabled, this command
requires the subscription disabled. Why we need this limitation?

In src/backend/commands/subscriptioncmds.c:

               if (IsSet(opts.specified_opts, SUBOPT_SLOT_NAME))
               {
                   if (sub->enabled && !opts.slot_name)
                       ereport(ERROR,
                               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                                errmsg("cannot set %s for enabled subscription",
                                       "slot_name = NONE")));

                   if (opts.slot_name)
                       values[Anum_pg_subscription_subslotname - 1] =
                           DirectFunctionCall1(namein, CStringGetDatum(opts.slot_name));
                   else
                       nulls[Anum_pg_subscription_subslotname - 1] = true;
                   replaces[Anum_pg_subscription_subslotname - 1] = true;
               }


OTOH, when I execute ALTER SUBSCRIPTION ... SET (slot_name=''), it doesn't complain. However,
SELECT select pg_create_logical_replication_slot('', 'pgoutput') complains slot name is too
short. Although, the slot will be created at publisher, and validate the slot name, IMO, we
can also validate the slot_name in parse_subscription_options() to get the error early.
Attached fixes it. Any thoughts?

[1] https://www.postgresql.org/docs/current/sql-dropsubscription.html


-- 
Regrads,
Japin Li.
ChengDu WenWu Information Technology Co.,Ltd.


Attachment

pgsql-hackers by date:

Previous
From: Yugo NAGATA
Date:
Subject: Re: [HACKERS] WIP aPatch: Pgbench Serialization and deadlock errors
Next
From: Alexander Pyhalov
Date:
Subject: PostgreSQL 14 backend crash on incorrect trigger