diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index 8dcfc6c7424..f8142518c15 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -303,7 +303,7 @@ $ pg_recvlogical -d postgres --slot test --drop-slot - DROP_REPLICATION_SLOT slot_name + DROP_REPLICATION_SLOT slot_name WAIT diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 7c012f59a3e..2bb4e38a9db 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2173,13 +2173,13 @@ The commands accepted in walsender mode are: - DROP_REPLICATION_SLOT slot_name + + DROP_REPLICATION_SLOT slot_name WAIT DROP_REPLICATION_SLOT - Drops a replication slot, freeing any reserved server-side resources. If - the slot is currently in use by an active connection, this command fails. + Drops a replication slot, freeing any reserved server-side resources. If the slot is a logical slot that was created in a database other than the database the walsender is connected to, this command fails. @@ -2192,6 +2192,17 @@ The commands accepted in walsender mode are: + + + WAIT + + + This option causes the command to wait if the slot is active until + it becomes inactive, instead of the default behavior of raising an + error. + + + diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 9bc1d178fc7..2ef414e0844 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -959,7 +959,7 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) load_file("libpqwalreceiver", false); initStringInfo(&cmd); - appendStringInfo(&cmd, "DROP_REPLICATION_SLOT %s", quote_identifier(slotname)); + appendStringInfo(&cmd, "DROP_REPLICATION_SLOT %s WAIT", quote_identifier(slotname)); wrconn = walrcv_connect(conninfo, true, subname, &err); if (wrconn == NULL) diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y index ec047c827cf..a012447fa2a 100644 --- a/src/backend/replication/repl_gram.y +++ b/src/backend/replication/repl_gram.y @@ -72,6 +72,7 @@ static SQLCmd *make_sqlcmd(void); %token K_LABEL %token K_PROGRESS %token K_FAST +%token K_WAIT %token K_NOWAIT %token K_MAX_RATE %token K_WAL @@ -272,6 +273,15 @@ drop_replication_slot: DropReplicationSlotCmd *cmd; cmd = makeNode(DropReplicationSlotCmd); cmd->slotname = $2; + cmd->wait = false; + $$ = (Node *) cmd; + } + | K_DROP_REPLICATION_SLOT IDENT K_WAIT + { + DropReplicationSlotCmd *cmd; + cmd = makeNode(DropReplicationSlotCmd); + cmd->slotname = $2; + cmd->wait = true; $$ = (Node *) cmd; } ; diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l index 52ae7b343fb..62bb5288c01 100644 --- a/src/backend/replication/repl_scanner.l +++ b/src/backend/replication/repl_scanner.l @@ -103,6 +103,7 @@ TEMPORARY { return K_TEMPORARY; } EXPORT_SNAPSHOT { return K_EXPORT_SNAPSHOT; } NOEXPORT_SNAPSHOT { return K_NOEXPORT_SNAPSHOT; } USE_SNAPSHOT { return K_USE_SNAPSHOT; } +WAIT { return K_WAIT; } "," { return ','; } ";" { return ';'; } diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index d4cbd83bde1..ab776e85d2f 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -171,7 +171,7 @@ pg_drop_replication_slot(PG_FUNCTION_ARGS) CheckSlotRequirements(); - ReplicationSlotDrop(NameStr(*name), false); + ReplicationSlotDrop(NameStr(*name), true); PG_RETURN_VOID(); } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 03e1cf44dee..db346e6edbd 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1028,7 +1028,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) static void DropReplicationSlot(DropReplicationSlotCmd *cmd) { - ReplicationSlotDrop(cmd->slotname, false); + ReplicationSlotDrop(cmd->slotname, !cmd->wait); EndCommand("DROP_REPLICATION_SLOT", DestRemote); } diff --git a/src/include/nodes/replnodes.h b/src/include/nodes/replnodes.h index dea61e90e96..2053ffabe09 100644 --- a/src/include/nodes/replnodes.h +++ b/src/include/nodes/replnodes.h @@ -68,6 +68,7 @@ typedef struct DropReplicationSlotCmd { NodeTag type; char *slotname; + bool wait; } DropReplicationSlotCmd;