From 44c686ae11cc0de8d0aaf70c23397f94b477a82a Mon Sep 17 00:00:00 2001 From: Hayato Kuroda Date: Wed, 19 Mar 2025 11:30:16 +0900 Subject: [PATCH v4 2/2] Allow pg_recvlogical --drop-slot to work without --dbname. When pg_recvlogical was introduced in 9.4, the --dbname option was not required for --drop-slot. Without it, pg_recvlogical --drop-slot connected using a replication connection (not tied to a specific database) and was able to drop both physical and logical replication slots, similar to pg_receivewal --drop-slot. However, commit 0c013e08cfb unintentionally changed this behavior in 9.5, making pg_recvlogical always check whether it's connected to a specific database and fail if it's not. This change was expected for --create-slot and --start, which handle logical replication slots and require a database connection, but it was unnecessary for --drop-slot, which should work with any replication connection. As a result, --dbname became a required option for --drop-slot. This commit removes that restriction, restoring the original behavior and allowing pg_recvlogical --drop-slot to work without specifying --dbname. Although this issue originated from an unintended change, it has existed for a long time without complaints or bug reports, and the documentation never explicitly stated that --drop-slot should work without --dbname. Therefore, the change is not treated as a bug fix and is applied only to master. Author: Hayato Kuroda Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/b15ecf4f-e5af-4fbb-82c2-a425f453e0b2@oss.nttdata.com --- src/bin/pg_basebackup/pg_recvlogical.c | 9 ++++++--- src/bin/pg_basebackup/t/030_pg_recvlogical.pl | 8 ++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c index b9ea23e1426..a3447753119 100644 --- a/src/bin/pg_basebackup/pg_recvlogical.c +++ b/src/bin/pg_basebackup/pg_recvlogical.c @@ -944,13 +944,16 @@ main(int argc, char **argv) #endif /* - * Run IDENTIFY_SYSTEM to make sure we connected using a database specific - * replication connection. + * Run IDENTIFY_SYSTEM to check the connection type for each action. + * --create-slot and --start actions require a database-specific + * replication connection because they handle logical replication slots. + * --drop-slot can remove replication slots from any replication + * connection without this restriction. */ if (!RunIdentifySystem(conn, NULL, NULL, NULL, &db_name)) exit(1); - if (db_name == NULL) + if (!do_drop_slot && db_name == NULL) pg_fatal("could not establish database-specific replication connection"); /* diff --git a/src/bin/pg_basebackup/t/030_pg_recvlogical.pl b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl index a6e10600161..62bbc5a3f98 100644 --- a/src/bin/pg_basebackup/t/030_pg_recvlogical.pl +++ b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl @@ -127,4 +127,12 @@ $node->command_ok( ], 'replayed a two-phase transaction'); +$node->command_ok( + [ + 'pg_recvlogical', + '--slot' => 'test', + '--drop-slot' + ], + 'drop could work without dbname'); + done_testing(); -- 2.48.1