Fix logical replication slot initialization
This was broken in commit 9c7d06d60680, which inadvertently gave the wrong value to fast_forward in one StartupDecodingContext call. Fix by flipping the value. Add a test for the obvious error, namely trying to initialize a replication slot with an nonexistent output plugin. While at it, move the CreateDecodingContext call earlier, so that any errors are reported before sending the CopyBoth message. Author: Dave Cramer <davecramer@gmail.com> Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/CADK3HHLVkeRe1v4P02-5hj55H3_yJg3AEtpXyEY5T3wuzO2jSg@mail.gmail.com
This commit is contained in:
parent
91bc213d90
commit
c40489e449
@ -30,6 +30,8 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t2', 'tes
|
||||
init
|
||||
(1 row)
|
||||
|
||||
SELECT pg_create_logical_replication_slot('foo', 'nonexistent');
|
||||
ERROR: could not access file "nonexistent": No such file or directory
|
||||
-- here we want to start a new session and wait till old one is gone
|
||||
select pg_backend_pid() as oldpid \gset
|
||||
\c -
|
||||
|
@ -9,6 +9,8 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test
|
||||
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t2', 'test_decoding', true);
|
||||
|
||||
SELECT pg_create_logical_replication_slot('foo', 'nonexistent');
|
||||
|
||||
-- here we want to start a new session and wait till old one is gone
|
||||
select pg_backend_pid() as oldpid \gset
|
||||
\c -
|
||||
|
@ -312,7 +312,7 @@ CreateInitDecodingContext(char *plugin,
|
||||
ReplicationSlotSave();
|
||||
|
||||
ctx = StartupDecodingContext(NIL, InvalidXLogRecPtr, xmin_horizon,
|
||||
need_full_snapshot, true,
|
||||
need_full_snapshot, false,
|
||||
read_page, prepare_write, do_write,
|
||||
update_progress);
|
||||
|
||||
|
@ -1068,6 +1068,19 @@ StartLogicalReplication(StartReplicationCmd *cmd)
|
||||
got_STOPPING = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create our decoding context, making it start at the previously ack'ed
|
||||
* position.
|
||||
*
|
||||
* Do this before sending CopyBoth, so that any errors are reported early.
|
||||
*/
|
||||
logical_decoding_ctx =
|
||||
CreateDecodingContext(cmd->startpoint, cmd->options, false,
|
||||
logical_read_xlog_page,
|
||||
WalSndPrepareWrite, WalSndWriteData,
|
||||
WalSndUpdateProgress);
|
||||
|
||||
|
||||
WalSndSetState(WALSNDSTATE_CATCHUP);
|
||||
|
||||
/* Send a CopyBothResponse message, and start streaming */
|
||||
@ -1077,16 +1090,6 @@ StartLogicalReplication(StartReplicationCmd *cmd)
|
||||
pq_endmessage(&buf);
|
||||
pq_flush();
|
||||
|
||||
/*
|
||||
* Initialize position to the last ack'ed one, then the xlog records begin
|
||||
* to be shipped from that position.
|
||||
*/
|
||||
logical_decoding_ctx = CreateDecodingContext(cmd->startpoint, cmd->options,
|
||||
false,
|
||||
logical_read_xlog_page,
|
||||
WalSndPrepareWrite,
|
||||
WalSndWriteData,
|
||||
WalSndUpdateProgress);
|
||||
|
||||
/* Start reading WAL from the oldest required WAL. */
|
||||
logical_startptr = MyReplicationSlot->data.restart_lsn;
|
||||
|
Loading…
x
Reference in New Issue
Block a user