Re: replication slot restart_lsn initialization
От | Gurjeet Singh |
---|---|
Тема | Re: replication slot restart_lsn initialization |
Дата | |
Msg-id | CABwTF4VGZu5Gyw0+Ts3hd-rDcRpjKe0TmwD9JJTQSN8H-zq9fQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: replication slot restart_lsn initialization (Andres Freund <andres@anarazel.de>) |
Ответы |
Re: replication slot restart_lsn initialization
|
Список | pgsql-hackers |
On Wed, Jun 10, 2015 at 8:07 AM, Andres Freund <andres@anarazel.de> wrote:
On 2015-06-10 08:00:28 -0700, Gurjeet Singh wrote:
> pg_create_logical_replication_slot() prevents LSN from being
> recycled that by looping (worst case 2 times) until there's no
> conflict with the checkpointer recycling the segment. So I have used
> the same approach.
There's no need to change anything for logical slots? Or do you just
mean that you moved the existing code?
Yes, I turned the code from logical replication into a function and used it from logical and physical replication.
>
> /*
> + * Grab and save an LSN value to prevent WAL recycling past that point.
> + */
> +void
> +ReplicationSlotRegisterRestartLSN()
> +{
...
> + /*
> + * Let's start with enough information if we can, so log a standby
> + * snapshot and start decoding at exactly that position.
> + */
> + if (!RecoveryInProgress())
> + {
> + XLogRecPtr flushptr;
> +
> + /* start at current insert position */
> + slot->data.restart_lsn = GetXLogInsertRecPtr();
> +
> + /* make sure we have enough information to start */
> + flushptr = LogStandbySnapshot();
> +
> + /* and make sure it's fsynced to disk */
> + XLogFlush(flushptr);
> + }
> + else
> + slot->data.restart_lsn = GetRedoRecPtr();
> +
That doesn't look right to me. Why is this code logging a standby
snapshot for physical slots?
This is the new function I referred to above. The logging of the snapshot is in 'not RecoveryInProgress()' case, meaning it's running in primary and not in a standby.
Best regards,
-- Gurjeet Singh http://gurjeet.singh.im/
В списке pgsql-hackers по дате отправления: