Re: confirmed_flush_lsn shows LSN of the data that has not yet been received by the logical subscriber.

Поиск
Список
Период
Сортировка
От Ashutosh Bapat
Тема Re: confirmed_flush_lsn shows LSN of the data that has not yet been received by the logical subscriber.
Дата
Msg-id CAExHW5vfjYtGoQo049=y9W_MpeeJECc+B4np93pVm0Y47EGOGQ@mail.gmail.com
обсуждение исходный текст
Ответ на confirmed_flush_lsn shows LSN of the data that has not yet been received by the logical subscriber.  (Ashutosh Sharma <ashu.coek88@gmail.com>)
Ответы Re: confirmed_flush_lsn shows LSN of the data that has not yet been received by the logical subscriber.  (Ashutosh Sharma <ashu.coek88@gmail.com>)
Список pgsql-hackers
On Thu, Sep 8, 2022 at 4:14 PM Ashutosh Sharma <ashu.coek88@gmail.com> wrote:
>
> Hi All,
>
> The logically decoded data are sent to the logical subscriber at the time of transaction commit, assuming that the
datais small. However, before the transaction commit is performed, the LSN representing the data that is yet to be
receivedby the logical subscriber appears in the confirmed_flush_lsn column of pg_replication_slots catalog. Isn't the
informationseen in the confirmed_flush_lsn column while the transaction is in progress incorrect ? esp considering the
descriptiongiven in the pg doc for this column. 
>
> Actually, while the transaction is running, the publisher keeps on sending keepalive messages containing LSN of the
lastdecoded data saved in reorder buffer and the subscriber responds with the same LSN as the last received LSN which
isthen updated as confirmed_flush_lsn by the publisher. I think the LSN that we are sending with the keepalive message
shouldbe the one representing the transaction begin message, not the LSN of the last decoded data which is yet to be
sent.Please let me know if I am missing something here. 

The transactions with commit lsn < confirmed_flush_lsn are confirmed
to be received (and applied by the subscriber. Setting LSN
corresponding to a WAL record within a transaction in progress as
confirmed_flush should be ok. Since the transactions are interleaved
in WAL stream, it's quite possible that LSNs of some WAL records of an
inflight transaction are lesser than commit LSN of some another
transaction. So setting commit LSN of another effectively same as
setting it to any of the LSNs of any previous WAL record irrespective
of the transaction that it belongs to.

In case WAL sender restarts with confirmed_flush_lsn set to LSN of a
WAL record of an inflight transaction, the whole inflight transaction
will be sent again since its commit LSN is higher than
confirmed_flush_lsn.

I think logical replication has inherited this from physical
replication. A useful effect of this is to reduce WAL retention by
moving restart_lsn based on the latest confirmed_flush_lsn.

--
Best Wishes,
Ashutosh Bapat



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Daniel Gustafsson
Дата:
Сообщение: Re: vacuumlo: add test to vacuumlo for test coverage
Следующее
От: Robert Haas
Дата:
Сообщение: Re: has_privs_of_role vs. is_member_of_role, redux