mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Add facility to copy replication slots
This allows the user to create duplicates of existing replication slots, either logical or physical, and even changing properties such as whether they are temporary or the output plugin used. There are multiple uses for this, such as initializing multiple replicas using the slot for one base backup; when doing investigation of logical replication issues; and to select a different output plugins. Author: Masahiko Sawada Reviewed-by: Michael Paquier, Andres Freund, Petr Jelinek Discussion: https://postgr.es/m/CAD21AoAm7XX8y_tOPP6j4Nzzch12FvA1wPqiO690RCk+uYVstg@mail.gmail.com
This commit is contained in:
@ -211,11 +211,15 @@ StartupDecodingContext(List *output_plugin_options,
|
||||
/*
|
||||
* Create a new decoding context, for a new logical slot.
|
||||
*
|
||||
* plugin contains the name of the output plugin
|
||||
* output_plugin_options contains options passed to the output plugin
|
||||
* read_page, prepare_write, do_write, update_progress
|
||||
* callbacks that have to be filled to perform the use-case dependent,
|
||||
* actual, work.
|
||||
* plugin -- contains the name of the output plugin
|
||||
* output_plugin_options -- contains options passed to the output plugin
|
||||
* restart_lsn -- if given as invalid, it's this routine's responsibility to
|
||||
* mark WAL as reserved by setting a convenient restart_lsn for the slot.
|
||||
* Otherwise, we set for decoding to start from the given LSN without
|
||||
* marking WAL reserved beforehand. In that scenario, it's up to the
|
||||
* caller to guarantee that WAL remains available.
|
||||
* read_page, prepare_write, do_write, update_progress --
|
||||
* callbacks that perform the use-case dependent, actual, work.
|
||||
*
|
||||
* Needs to be called while in a memory context that's at least as long lived
|
||||
* as the decoding context because further memory contexts will be created
|
||||
@ -228,6 +232,7 @@ LogicalDecodingContext *
|
||||
CreateInitDecodingContext(char *plugin,
|
||||
List *output_plugin_options,
|
||||
bool need_full_snapshot,
|
||||
XLogRecPtr restart_lsn,
|
||||
XLogPageReadCB read_page,
|
||||
LogicalOutputPluginWriterPrepareWrite prepare_write,
|
||||
LogicalOutputPluginWriterWrite do_write,
|
||||
@ -271,7 +276,14 @@ CreateInitDecodingContext(char *plugin,
|
||||
StrNCpy(NameStr(slot->data.plugin), plugin, NAMEDATALEN);
|
||||
SpinLockRelease(&slot->mutex);
|
||||
|
||||
ReplicationSlotReserveWal();
|
||||
if (XLogRecPtrIsInvalid(restart_lsn))
|
||||
ReplicationSlotReserveWal();
|
||||
else
|
||||
{
|
||||
SpinLockAcquire(&slot->mutex);
|
||||
slot->data.restart_lsn = restart_lsn;
|
||||
SpinLockRelease(&slot->mutex);
|
||||
}
|
||||
|
||||
/* ----
|
||||
* This is a bit tricky: We need to determine a safe xmin horizon to start
|
||||
@ -316,7 +328,7 @@ CreateInitDecodingContext(char *plugin,
|
||||
ReplicationSlotMarkDirty();
|
||||
ReplicationSlotSave();
|
||||
|
||||
ctx = StartupDecodingContext(NIL, InvalidXLogRecPtr, xmin_horizon,
|
||||
ctx = StartupDecodingContext(NIL, restart_lsn, xmin_horizon,
|
||||
need_full_snapshot, false,
|
||||
read_page, prepare_write, do_write,
|
||||
update_progress);
|
||||
|
Reference in New Issue
Block a user