Re: logical decoding and replication of sequences
От | Tomas Vondra |
---|---|
Тема | Re: logical decoding and replication of sequences |
Дата | |
Msg-id | c044630b-f99b-33a0-b678-5dd55d6cc10a@enterprisedb.com обсуждение исходный текст |
Ответ на | Re: logical decoding and replication of sequences (Tomas Vondra <tomas.vondra@enterprisedb.com>) |
Список | pgsql-hackers |
On 12/15/21 14:51, Tomas Vondra wrote: > On 12/15/21 14:20, Amit Kapila wrote: >> On Tue, Dec 14, 2021 at 7:02 AM Tomas Vondra >> <tomas.vondra@enterprisedb.com> wrote: >>> >>> Hi, >>> >>> here's an updated version of the patches, dealing with almost all of the >>> issues (at least in the 0001 and 0002 parts). The main changes: >>> >>> 1) I've removed the 'created' flag from fill_seq_with_data, as >>> discussed. I don't think it's needed by any of the parts (not even 0003, >>> AFAICS). We still need it in xl_seq_rec, though. >>> >>> 2) GetCurrentTransactionId() added to sequence.c are called only with >>> wal_level=logical, to minimize the overhead. >>> >>> >>> There's still one remaining problem, that I already explained in [1]. >>> The problem is that with this: >>> >>> BEGIN; >>> SELECT nextval('s') FROM generate_series(1,100); >>> ROLLBACK; >>> >>> >>> The root cause is that pg_current_wal_lsn() uses the LogwrtResult.Write, >>> which is updated by XLogFlush() - but only in RecordTransactionCommit. >>> Which makes sense, because only the committed stuff is "visible". >>> >>> But the non-transactional behavior of sequence decoding disagrees with >>> this, because now some of the changes from aborted transactions may be >>> replicated. Which means the wait_for_catchup() ends up not waiting for >>> the sequence change to be replicated. This is an issue for tests in >>> patch 0003, at least. >>> >>> My concern is this actually affects other places waiting for things >>> getting replicated :-/ >>> >> >> By any chance, will this impact synchronous replication as well which >> waits for commits to be replicated? >> > > Physical or logical replication? Physical is certainly not replicated. > > For logical replication, it's more complicated. > Apologies, sent too early ... I think it's more complicated for logical sync replication, because of a scenario like this: BEGIN; SELECT nextval('s') FROM generate_series(1,100); <-- writes WAL ROLLBACK; SELECT nextval('s'); The first transaction advances the sequence enough to generate a WAL, which we do every 32 values. But it's rolled back, so it does not update LogwrtResult.Write, because that happens only at commit. And then the nextval() generates a value from the sequence without generating WAL, so it doesn't update the LSN either (IIRC). That'd mean a sync replication may not wait for this change to reach the subscriber. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
В списке pgsql-hackers по дате отправления: