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 4/7/23 5:47 PM, Andres Freund wrote:
> Hi,
>
>>> - write a test that invalidated logical slots do not lead to retaining WAL
>>
>> I'm not sure how to do that since pg_switch_wal() and friends can't be executed on
>> a standby.
>
> You can do it on the primary and wait for the records to have been applied.
>
Thanks, will give it a try in a couple of hours.
>
>>> - Further evolve the API of InvalidateObsoleteReplicationSlots()
>>> - pass in the ReplicationSlotInvalidationCause we're trying to conflict on?
>>> - rename xid to snapshotConflictHorizon, that'd be more in line with the
>>> ResolveRecoveryConflictWithSnapshot and easier to understand, I think
>>>
>>
>> Done. The new API can be found in v65-66-InvalidateObsoleteReplicationSlots_API.patch
>> attached. It propagates the cause to InvalidatePossiblyObsoleteSlot() where a switch/case
>> can now be used.
>
> Integrated. I moved the cause to the first argument, makes more sense to me
> that way.
thanks!
>
> I made it an error - it's a programming error, not some data level
> inconsistency if that ever happens.
okay, makes sense.
>
> Integrated all of these.
Thanks!
>
>
> I think pg_log_standby_snapshot() should be added in "Allow logical decoding
> on standby", not the commit adding the tests.
Yeah, that's a good point, I do agree.
>
> Is this patchset sufficient to subscribe to a publication on a physical
> standby, assuming the publication is created on the primary? If so, we should
> have at least a minimal test. If not, we should note that restriction
> explicitly.
I gave it a try and it does work.
"
node3 subscribes to node2 (standby).
Insert done in node1 (primary) where the publication is created => node3 see the changes.
"
I started to create the TAP test but currently stuck as the "create subscription" waits for a checkpoint/pg_log_standby_snapshot() on the primary.
So, trying to make use of things like:
"my %psql_subscriber = ('stdin' => '', 'stdout' => '');
$psql_subscriber{run} =
$node_subscriber->background_psql('postgres', \$psql_subscriber{stdin},
\$psql_subscriber{stdout},
$psql_timeout);
$psql_subscriber{stdout} = '';
"
But in vain so far...
Will resume working on it in a couple of hours.
Regards,
--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com