Since
6fcd885 it is possible to immediately reserve WAL when creating a
slot via pg_create_physical_replication_slot(). Extend the replication
protocol to allow that as well.
Although, in contrast to the SQL interface, it is possible to update the
reserved location via the replication interface, it is still useful
being able to reserve upon creation there. Otherwise the logic in
ReplicationSlotReserveWal() has to be repeated in slot employing
clients.
Author: Michael Paquier
Discussion: CAB7nPqT0Wc1W5mdYGeJ_wbutbwNN+3qgrFR64avXaQCiJMGaYA@mail.gmail.com
</varlistentry>
<varlistentry>
- <term>CREATE_REPLICATION_SLOT <replaceable class="parameter">slot_name</> { <literal>PHYSICAL</> | <literal>LOGICAL</> <replaceable class="parameter">output_plugin</> }
+ <term>CREATE_REPLICATION_SLOT <replaceable class="parameter">slot_name</> { <literal>PHYSICAL</> [ RESERVE_WAL ] | <literal>LOGICAL</> <replaceable class="parameter">output_plugin</> }
<indexterm><primary>CREATE_REPLICATION_SLOT</primary></indexterm>
</term>
<listitem>
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><literal>RESERVE_WAL</></term>
+ <listitem>
+ <para>
+ Specify that this physical replication reserves <acronym>WAL</>
+ immediately; otherwise <acronym>WAL</> is only reserved upon
+ connection from a streaming replication client.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</listitem>
</varlistentry>
%token K_PHYSICAL
%token K_LOGICAL
%token K_SLOT
+%token K_RESERVE_WAL
%type <node> command
%type <node> base_backup start_replication start_logical_replication
%type <defelt> plugin_opt_elem
%type <node> plugin_opt_arg
%type <str> opt_slot
+%type <boolval> opt_reserve_wal
%%
;
create_replication_slot:
- /* CREATE_REPLICATION_SLOT slot PHYSICAL */
- K_CREATE_REPLICATION_SLOT IDENT K_PHYSICAL
+ /* CREATE_REPLICATION_SLOT slot PHYSICAL RESERVE_WAL */
+ K_CREATE_REPLICATION_SLOT IDENT K_PHYSICAL opt_reserve_wal
{
CreateReplicationSlotCmd *cmd;
cmd = makeNode(CreateReplicationSlotCmd);
cmd->kind = REPLICATION_KIND_PHYSICAL;
cmd->slotname = $2;
+ cmd->reserve_wal = $4;
$$ = (Node *) cmd;
}
/* CREATE_REPLICATION_SLOT slot LOGICAL plugin */
| /* EMPTY */
;
+opt_reserve_wal:
+ K_RESERVE_WAL { $$ = true; }
+ | /* EMPTY */ { $$ = false; }
+ ;
+
opt_slot:
K_SLOT IDENT
{ $$ = $2; }
DROP_REPLICATION_SLOT { return K_DROP_REPLICATION_SLOT; }
TIMELINE_HISTORY { return K_TIMELINE_HISTORY; }
PHYSICAL { return K_PHYSICAL; }
+RESERVE_WAL { return K_RESERVE_WAL; }
LOGICAL { return K_LOGICAL; }
SLOT { return K_SLOT; }
ReplicationSlotPersist();
}
+ else if (cmd->kind == REPLICATION_KIND_PHYSICAL && cmd->reserve_wal)
+ {
+ ReplicationSlotReserveWal();
+
+ /* Write this slot to disk */
+ ReplicationSlotMarkDirty();
+ ReplicationSlotSave();
+ }
slot_name = NameStr(MyReplicationSlot->data.name);
snprintf(xpos, sizeof(xpos), "%X/%X",
char *slotname;
ReplicationKind kind;
char *plugin;
+ bool reserve_wal;
} CreateReplicationSlotCmd;