From 08c3ad27eb5348d0cbffa843a3edb11534f9904a Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 12 Jan 2024 08:23:07 +0900 Subject: [PATCH] Rework how logirep launchers are stopped during pg_upgrade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a rework of 7021d3b17664, where we relied on forcing max_logical_replication_workers to 0 in the postgres command. This commit now prevents logical replication launchers to start using -b and a backend-side check based on IsBinaryUpgrade, effective when upgrading from 17 and newer versions. This commit improves the comments explaining why this restriction is necessary. This discussion was on hold until we were sure how to add support for subscribers in pg_upgrade, something now done thanks to 9a17be1e244a. Reviewed-by: Álvaro Herrera, Amit Kapila, Tom Lane Discussion: https://postgr.es/m/ZU2TeVkUg5qEi7Oy@paquier.xyz --- src/backend/replication/logical/launcher.c | 9 ++++++++- src/bin/pg_upgrade/server.c | 15 +++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 33f07f674d9..122db0bb134 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -925,7 +925,14 @@ ApplyLauncherRegister(void) { BackgroundWorker bgw; - if (max_logical_replication_workers == 0) + /* + * The logical replication launcher is disabled during binary upgrades, to + * prevent logical replication workers from running on the source cluster. + * That could cause replication origins to move forward after having been + * copied to the target cluster, potentially creating conflicts with the + * copied data files. + */ + if (max_logical_replication_workers == 0 || IsBinaryUpgrade) return; memset(&bgw, 0, sizeof(bgw)); diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c index 64b24270e38..91bcb4dbc7e 100644 --- a/src/bin/pg_upgrade/server.c +++ b/src/bin/pg_upgrade/server.c @@ -248,19 +248,14 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error) * invalidation of slots during the upgrade. We set this option when * cluster is PG17 or later because logical replication slots can only be * migrated since then. Besides, max_slot_wal_keep_size is added in PG13. - * - * Use max_logical_replication_workers as 0 to prevent a startup of the - * logical replication launcher while upgrading because it may start apply - * workers that could start receiving changes from the publisher before - * the physical files are put in place, causing corruption on the new - * cluster upgrading to. Like the previous parameter, this is set only - * when a cluster is PG17 or later as logical slots can only be migrated - * since this version. */ if (GET_MAJOR_VERSION(cluster->major_version) >= 1700) - appendPQExpBufferStr(&pgoptions, " -c max_slot_wal_keep_size=-1 -c max_logical_replication_workers=0"); + appendPQExpBufferStr(&pgoptions, " -c max_slot_wal_keep_size=-1"); - /* Use -b to disable autovacuum. */ + /* + * Use -b to disable autovacuum and logical replication launcher + * (effective in PG17 or later for the latter). + */ snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" -w -l \"%s/%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start", cluster->bindir,