From 1b8ea3d6a17741a1c007f8478810480ce56114f4 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Thu, 30 Jul 2026 13:38:17 -0700 Subject: [PATCH v4 2/8] Build subscription conninfo after checking that it's enabled. If a subscription is disabled, don't try to build conninfo because that may generate a confusing error and try to disable an already-disabled subscription. Partially addresses finding 5 in report from linked discussion. Reported-by: Noah Misch Discussion: https://postgr.es/m/20260710195902.4f.noahmisch%40microsoft.com Backpatch-through: 19 --- src/backend/replication/logical/worker.c | 28 +++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 86fd5eff295..e4baf29a206 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -5099,9 +5099,6 @@ maybe_reread_subscription(void) proc_exit(0); } - /* allocated in transaction context */ - new_conninfo = SubscriptionConninfo(newsub, true); - /* Exit if the subscription was disabled. */ if (!newsub->enabled) { @@ -5112,6 +5109,13 @@ maybe_reread_subscription(void) apply_worker_exit(); } + /* + * May raise error, so build conninfo after checking that the subscription + * is enabled. Allocated in transaction context; must be copied to + * ApplyContext when we set MySubscriptionConninfo. + */ + new_conninfo = SubscriptionConninfo(newsub, true); + /* !slotname should never happen when enabled is true. */ Assert(newsub->slotname); @@ -5859,13 +5863,6 @@ InitializeLogRepWorker(void) proc_exit(0); } - /* build conninfo in transaction context and copy to ApplyContext */ - MySubscriptionConninfo = - MemoryContextStrdup(ApplyContext, - SubscriptionConninfo(MySubscription, true)); - - MySubscriptionValid = true; - if (!MySubscription->enabled) { ereport(LOG, @@ -5875,6 +5872,17 @@ InitializeLogRepWorker(void) apply_worker_exit(); } + /* + * May raise error for server-based subscriptions, so build conninfo after + * checking that the subscription is enabled. Build in transaction context + * and copy to ApplyContext. + */ + MySubscriptionConninfo = + MemoryContextStrdup(ApplyContext, + SubscriptionConninfo(MySubscription, true)); + + MySubscriptionValid = true; + /* * Restart the worker if retain_dead_tuples was enabled during startup. * -- 2.43.0