Re: [UNVERIFIED SENDER] Re: Minimal logical decoding on standbys

bdrouvotAWS <bdrouvot@amazon.com>

From: "Drouvot, Bertrand" <bdrouvot@amazon.com>
To: <fabriziomello@gmail.com>, Alvaro Herrera <alvherre@2ndquadrant.com>
Cc: Amit Khandekar <amitdkhan.pg@gmail.com>, Rahila Syed <rahila.syed@2ndquadrant.com>, pgsql-hackers <pgsql-hackers@postgresql.org>, Andres Freund <andres@anarazel.de>, tushar <tushar.ahuja@enterprisedb.com>, "[pgdg] Robert Haas" <robertmhaas@gmail.com>
Date: 2021-01-18T11:48:31Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Reduce the log level in 035_standby_logical_decoding.pl.

  2. 035_standby_logical_decoding: Add missing waits for replication

  3. For cascading replication, wake physical and logical walsenders separately

  4. Handle logical slot conflicts on standby

  5. Support invalidating replication slots due to horizon and wal_level

  6. Prevent use of invalidated logical slot in CreateDecodingContext()

  7. Replace replication slot's invalidated_at LSN with an enum

  8. Pass down table relation into more index relation functions

  9. Assert only valid flag bits are passed to visibilitymap_set()

  10. Remove unused _bt_delitems_delete() argument.

  11. Add xl_btree_delete optimization.

Attachments

Hi,

On 12/15/20 7:24 PM, Fabrízio de Royes Mello wrote:
>
> On Wed, Mar 18, 2020 at 4:50 PM Alvaro Herrera 
> <alvherre@2ndquadrant.com <mailto:alvherre@2ndquadrant.com>> wrote:
> >
> >
> > well, not "forever", but:
> >
> > $ make check PROVE_TESTS=t/019_standby_logical_decoding_conflicts.pl 
> <http://019_standby_logical_decoding_conflicts.pl> PROVE_FLAGS=-v
> > ...
> > cd /pgsql/source/master/src/test/recovery && 
> TESTDIR='/home/alvherre/mnt/crypt/alvherre/Code/pgsql/build/master/src/test/recovery' 
> PATH="/pgsql/build/master/tmp_install/pgsql/install/master/bin:$PATH" 
> LD_LIBRARY_PATH="/pgsql/build/master/tmp_install/pgsql/install/master/lib" 
>  PGPORT='655432' 
> PG_REGRESS='/home/alvherre/mnt/crypt/alvherre/Code/pgsql/build/master/src/test/recovery/../../../src/test/regress/pg_regress' 
> REGRESS_SHLIB='/pgsql/build/master/src/test/regress/regress.so' 
> /usr/bin/prove -I /pgsql/source/master/src/test/perl/ -I 
> /pgsql/source/master/src/test/recovery -v 
> t/019_standby_logical_decoding_conflicts.pl 
> <http://019_standby_logical_decoding_conflicts.pl>
> > t/019_standby_logical_decoding_conflicts.pl 
> <http://019_standby_logical_decoding_conflicts.pl> ..
> > 1..24
> > ok 1 - dropslot on standby created
> > ok 2 - activeslot on standby created
> > # poll_query_until timed out executing this query:
> > # SELECT '0/35C9190' <= replay_lsn AND state = 'streaming' FROM 
> pg_catalog.pg_stat_replication WHERE application_name = 'standby';
> > # expecting this output:
> > # t
> > # last actual query output:
> > #
> > # with stderr:
> > Bailout called.  Further testing stopped:  system pg_ctl failed
> > Bail out!  system pg_ctl failed
> > FAILED--Further testing stopped: system pg_ctl failed
> > make: *** [Makefile:19: check] Error 255
> >
>
> After rebase and did minimal tweaks (duplicated oid, TAP tests 
> numbering) I'm facing similar problem but in other place:
>
>
> make -C src/test/recovery check 
> PROVE_TESTS=t/023_standby_logical_decoding_conflicts.pl 
> <http://023_standby_logical_decoding_conflicts.pl> PROVE_FLAGS=-v
> ...
> /usr/bin/mkdir -p '/data/src/pg/main/src/test/recovery'/tmp_check
> cd . && TESTDIR='/data/src/pg/main/src/test/recovery' 
> PATH="/d/src/pg/main/tmp_install/home/fabrizio/pgsql/logical-decoding-standby/bin:$PATH" 
> LD_LIBRARY_PATH="/d/src/pg/main/tmp_install/home/fabrizio/pgsql/logical-decoding-standby/lib" 
>  PGPORT='65432' 
> PG_REGRESS='/data/src/pg/main/src/test/recovery/../../../src/test/regress/pg_regress' 
> REGRESS_SHLIB='/d/src/pg/main/src/test/regress/regress.so' 
> /usr/bin/prove -I ../../../src/test/perl/ -I . -v 
> t/023_standby_logical_decoding_conflicts.pl 
> <http://023_standby_logical_decoding_conflicts.pl>
> t/023_standby_logical_decoding_conflicts.pl 
> <http://023_standby_logical_decoding_conflicts.pl> ..
> 1..24
> ok 1 - dropslot on standby created
> ok 2 - activeslot on standby created
> not ok 3 - dropslot on standby dropped
>
> #   Failed test 'dropslot on standby dropped'
> #   at t/023_standby_logical_decoding_conflicts.pl 
> <http://023_standby_logical_decoding_conflicts.pl> line 67.
> #          got: 'logical'
> #     expected: ''
> not ok 4 - activeslot on standby dropped
>
> #   Failed test 'activeslot on standby dropped'
> #   at t/023_standby_logical_decoding_conflicts.pl 
> <http://023_standby_logical_decoding_conflicts.pl> line 68.
> #          got: 'logical'
> #     expected: ''
>
>
> TAP tests hang forever in `check_slots_dropped` exactly here:
>
>     # our client should've terminated in response to the walsender error
>     eval {
>         $slot_user_handle->finish;
>     };

3 and 4 were failing because the 
ResolveRecoveryConflictWithLogicalSlots() call was missing in 
ResolveRecoveryConflictWithSnapshot(): the new version attached adds it.

The new version attached also provides a few changes to make it 
compiling on the current master (it was not the case anymore).

I also had to change 023_standby_logical_decoding_conflicts.pl (had to 
call $node_standby->create_logical_slot_on_standby($node_master, 
'otherslot', 'postgres'); at the very beginning of the "DROP DATABASE 
should drops it's slots, including active slots" section)

So that now the tests are passing:

t/023_standby_logical_decoding_conflicts.pl ..
1..24
ok 1 - dropslot on standby created
ok 2 - activeslot on standby created
ok 3 - dropslot on standby dropped
ok 4 - activeslot on standby dropped
ok 5 - pg_recvlogical exited non-zero
#
ok 6 - recvlogical recovery conflict
ok 7 - recvlogical error detail
ok 8 - dropslot on standby created
ok 9 - activeslot on standby created
ok 10 - dropslot on standby dropped
ok 11 - activeslot on standby dropped
ok 12 - pg_recvlogical exited non-zero
#
ok 13 - recvlogical recovery conflict
ok 14 - recvlogical error detail
ok 15 - otherslot on standby created
ok 16 - dropslot on standby created
ok 17 - activeslot on standby created
ok 18 - database dropped on standby
ok 19 - dropslot on standby dropped
ok 20 - activeslot on standby dropped
ok 21 - pg_recvlogical exited non-zero
#
ok 22 - recvlogical recovery conflict
ok 23 - recvlogical error detail
ok 24 - otherslot on standby not dropped
ok
All tests successful.
Files=1, Tests=24,  4 wallclock secs ( 0.02 usr  0.00 sys + 1.27 cusr  
0.37 csys =  1.66 CPU)
Result: PASS

Attached is the new version.

Bertrand