Re: Minimal logical decoding on standbys
Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Reduce the log level in 035_standby_logical_decoding.pl.
- 3034dc56ef4b 16.0 landed
-
035_standby_logical_decoding: Add missing waits for replication
- 57411c82ce86 16.0 landed
-
For cascading replication, wake physical and logical walsenders separately
- e101dfac3a53 16.0 landed
-
Handle logical slot conflicts on standby
- 26669757b6a7 16.0 landed
-
Support invalidating replication slots due to horizon and wal_level
- be87200efd93 16.0 landed
-
Prevent use of invalidated logical slot in CreateDecodingContext()
- 4397abd0a2af 16.0 landed
-
Replace replication slot's invalidated_at LSN with an enum
- 15f8203a5975 16.0 landed
-
Pass down table relation into more index relation functions
- 61b313e47eb9 16.0 landed
-
Assert only valid flag bits are passed to visibilitymap_set()
- a88a18b1250b 16.0 landed
-
Remove unused _bt_delitems_delete() argument.
- dc43492e46c7 14.0 cited
-
Add xl_btree_delete optimization.
- d2e5e20e5711 13.0 cited
Hi, On 12/14/22 6:48 PM, Robert Haas wrote: > On Wed, Dec 14, 2022 at 12:35 PM Andres Freund <andres@anarazel.de> wrote: >>> typedef struct xl_heap_prune >>> >>> I think this is unsafe on alignment-picky machines. I think it will >>> cause the offset numbers to be aligned at an odd address. >>> heap_xlog_prune() doesn't copy the data into aligned memory, so I >>> think this will result in a misaligned pointer being passed down to >>> heap_page_prune_execute. >> >> I think the offset numbers are stored separately from the record, even >> though it doesn't quite look like that in the above due to the way the >> 'OFFSET NUMBERS' is embedded in the struct. As they're stored with the >> block reference 0, the added boolean shouldn't make a difference >> alignment wise? >> >> Or am I misunderstanding your point? > > Oh, you're right. So this is another case similar to > xl_btree_reuse_page. In heap_xlog_prune(), we access the offset number > data like this: > > redirected = (OffsetNumber *) > XLogRecGetBlockData(record, 0, &datalen); > end = (OffsetNumber *) ((char *) redirected + datalen); > nowdead = redirected + (nredirected * 2); > nowunused = nowdead + ndead; > nunused = (end - nowunused); > heap_page_prune_execute(buffer, > > redirected, nredirected, > nowdead, ndead, > > nowunused, nunused); > > This is only safe if the return value of XLogRecGetBlockData is > guaranteed to be properly aligned, Why, could you please elaborate? It looks to me that here we are "just" accessing the members of the xl_heap_prune struct to get the numbers. Then, the actual data will be read later in heap_page_prune_execute() from the buffer/page based on the numbers we got from xl_heap_prune. Regards, -- Bertrand Drouvot PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com