Re: logical decoding and replication of sequences - Mailing list pgsql-hackers

From Tomas Vondra
Subject Re: logical decoding and replication of sequences
Date
Msg-id 12a9ecd6-4edb-a367-33da-4e2d03b0aace@enterprisedb.com
Whole thread Raw
In response to Re: logical decoding and replication of sequences  (Peter Eisentraut <peter.eisentraut@enterprisedb.com>)
Responses Re: logical decoding and replication of sequences
List pgsql-hackers
Hi,

On 9/23/21 12:27 PM, Peter Eisentraut wrote:
> On 30.07.21 20:26, Tomas Vondra wrote:
>> Here's a an updated version of this patch - rebased to current master, 
>> and fixing some of the issues raised in Peter's review.
> 
> This patch needs an update, as various conflicts have arisen now.
> 
> As was discussed before, it might be better to present a separate patch 
> for just the logical decoding part for now, since the replication and 
> DDL stuff has the potential to conflict heavily with other patches being 
> discussed right now.  It looks like cutting this patch in two should be 
> doable easily.
> 

Attached is the rebased patch, split into three parts:

1) basic decoding infrastructure (decoding, reorderbuffer etc.)
2) support for sequences in test_decoding
3) support for sequences in built-in replication (catalogs, syntax, ...)

The last part is the largest one - I'm sure we'll have discussions about 
the grammar, adding sequences automatically, etc. But as you said, let's 
focus on the first part, which deals with the required decoding stuff.

I've added a couple comments, explaining how we track sequences, why we 
need the XID in nextval() etc. I've also added streaming support.


> I looked through the test cases in test_decoding again.  It all looks 
> pretty sensible.  If anyone can think of any other tricky or dubious 
> cases, we can add them there.  It's easiest to discuss these things with 
> concrete test cases rather than in theory.
> 
> One slightly curious issue is that this can make sequence values go 
> backwards, when seen by the logical decoding consumer, like in the test 
> case:
> 
> + BEGIN
> + sequence: public.test_sequence transactional: 1 created: 1 last_value: 
> 1, log_cnt: 0 is_called: 0
> + COMMIT
> + sequence: public.test_sequence transactional: 0 created: 0 last_value: 
> 33, log_cnt: 0 is_called: 1
> + BEGIN
> + sequence: public.test_sequence transactional: 1 created: 1 last_value: 
> 4, log_cnt: 0 is_called: 1
> + COMMIT
> + sequence: public.test_sequence transactional: 0 created: 0 last_value: 
> 334, log_cnt: 0 is_called: 1
> 
> I suppose that's okay, since it's not really the intention that someone 
> is concurrently consuming sequence values on the subscriber.  Maybe 
> something for the future.  Fixing that would require changing the way 
> transactional sequence DDL updates these values, so it's not directly 
> the job of the decoding to address this.
> 

Yeah, that's due to how ALTER SEQUENCE does things, and I agree redoing 
that seems well out of scope for this patch. What seems a bit suspicious 
is that some of the ALTER SEQUENCE changes have "created: 1" - it's 
probably correct, though, because those ALTER SEQUENCE statements can be 
rolled-back, so we see it as if a new sequence is created. The flag name 
might be a bit confusing, though.

> A small thing I found: Maybe the text that test_decoding produces for 
> sequences can be made to look more consistent with the one for tables. 
> For example, in
> 
> + BEGIN
> + sequence: public.test_table_a_seq transactional: 1 created: 1 
> last_value: 1, log_cnt: 0 is_called: 0
> + sequence: public.test_table_a_seq transactional: 1 created: 0 
> last_value: 33, log_cnt: 0 is_called: 1
> + table public.test_table: INSERT: a[integer]:1 b[integer]:100
> + table public.test_table: INSERT: a[integer]:2 b[integer]:200
> + COMMIT
> 
> note how the punctuation is different.

I did tweak this a bit, hopefully it's more consistent.


regards

-- 
Tomas Vondra
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachment

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: BUG #16583: merge join on tables with different DB collation behind postgres_fdw fails
Next
From: Tom Lane
Date:
Subject: Re: Corruption during WAL replay