Re: Minimal logical decoding on standbys
Robert Haas <robertmhaas@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
On Wed, Dec 12, 2018 at 3:41 PM Andres Freund <andres@anarazel.de> wrote: > I don't like the approach of managing the catalog horizon via those > periodically logged catalog xmin announcements. I think we instead > should build ontop of the records we already have and use to compute > snapshot conflicts. As of HEAD we don't know whether such tables are > catalog tables, but that's just a bool that we need to include in the > records, a basically immeasurable overhead given the size of those > records. To me, this paragraph appears to say that you don't like Craig's approach without quite explaining why you don't like it. Could you be a bit more explicit about that? > I also don't think we should actually enforce hot_standby_feedback being > enabled - there's use-cases where that's not convenient, and it's not > bullet proof anyway (can be enabled/disabled without using logical > decoding inbetween). I think when there's a conflict we should have the > HINT mention that hs_feedback can be used to prevent such conflicts, > that ought to be enough. If we can make that work, +1 from me. > I'm wondering if it's time to move the latestRemovedXid computation for > this type of record to the primary - it's likely to be cheaper there and > avoids this kind of complication. Secondarily, it'd have the advantage > of making pluggable storage integration easier - there we have the > problem that we don't know which type of relation we're dealing with > during recovery, so such lookups make pluggability harder (zheap just > adds extra flags to signal that, but that's not extensible). That doesn't look trivial. It seems like _bt_delitems_delete() would need to get an array of XIDs, but that gets called from _bt_vacuum_one_page(), which doesn't have that information available. It doesn't look like there is a particularly cheap way of getting it, either. What do you have in mind? > Another alternative would be to just prevent such index deletions for > catalog tables when wal_level = logical. That doesn't sound like a very nice idea. > If we were to go with this approach, there'd be at least the following > tasks: > - adapt tests from [2] OK. > - enforce hot-standby to be enabled on the standby when logical slots > are created, and at startup if a logical slot exists Why do we need this? > - fix issue around btree_xlog_delete_get_latestRemovedXid etc mentioned > above. OK. > - Have a nicer conflict handling than what I implemented here. Craig's > approach deleted the slots, but I'm not sure I like that. Blocking > seems more appropriately here, after all it's likely that the > replication topology would be broken afterwards. I guess the viable options are approximately -- (1) drop the slot, (2) advance the slot, (3) mark the slot as "failed" but leave it in existence as a tombstone, (4) wait until something changes. I like (3) better than (1). (4) seems pretty unfortunate unless there's some other system for having the slot advance automatically. Seems like a way for replication to hang indefinitely without anybody understanding why it's happened (or, maybe, noticing). -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company