On Fri, May 23, 2025 at 9:57 AM Suraj Kharage <
suraj.khar...@enterprisedb.com> wrote:

> Hi,
>
> Noticed below behaviour where replication slot is not able to sync up if
> any catalog changes happened after the creation.
> Getting below LOG when trying to sync replication slots using
> pg_sync_replication_slots() function.
> The newly created slot does not appear on the standby after this LOG -
>
> 2025-05-23 07:57:12.453 IST [4178805] *LOG:  could not synchronize
> replication slot "failover_slot" because remote slot precedes local slot*
> 2025-05-23 07:57:12.453 IST [4178805] *DETAIL:  The remote slot has LSN
> 0/B000060 and catalog xmin 764, but the local slot has LSN 0/B000060 and
> catalog xmin 765.*
> 2025-05-23 07:57:12.453 IST [4178805] STATEMENT:  SELECT
> pg_sync_replication_slots();
>
> Below is the test case tried on latest master branch -
> =========
> - Create the Primary and start the server.
> wal_level = logical
>
> - Create the physical slot on Primary.
> SELECT pg_create_physical_replication_slot('slot1');
>
> - Setup the standby using pg_basebackup.
> bin/pg_basebackup -D data1 -p 5418 -d "dbname=postgres" -R
>
> primary_slot_name = 'slot1'
> hot_standby_feedback = on
> port = 5419
>
> -- Start the standby.
>
> -- Connect to Primary and create a logical replication slot.
> SELECT pg_create_logical_replication_slot('failover_slot', 'pgoutput',
> false, false, true);
>
> postgres@4177929=#select xmin,* from pg_replication_slots ;
>  xmin |   slot_name   |  plugin  | slot_type | datoid | database |
> temporary | active | active_pid | xmin | catalog_xmin | restart_lsn |
> confirmed_flush_lsn | wal_status | safe_wal_size | two_phas
> e | two_phase_at |          inactive_since          | conflicting |
> invalidation_reason | failover | synced
>
> ------+---------------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+---------------+---------
>
> --+--------------+----------------------------------+-------------+---------------------+----------+--------
>   765 | slot1         |          | physical  |        |          | f
>   | t      |    4177898 |  765 |              | 0/B018B00   |
>       | reserved   |               | f
>   |              |                                  |             |
>               | f        | f
>       | failover_slot | pgoutput | logical   |      5 | postgres | f
>   | f      |            |      |          764 | 0/B000060   | 0/B000098
>       | reserved   |               | f
>   |              | 2025-05-23 07:55:31.277584+05:30 | f           |
>               | t        | f
> (2 rows)
>
> -- Perform some catalog changes. e.g.:
> create table abc(id int);
> postgres@4179034=#select xmin from pg_class where relname='abc';
>  xmin
> ------
>   764
> (1 row)
>
> -- Connect to the standby and try to sync the replication slots.
> SELECT pg_sync_replication_slots();
>
> In the logfile, can see below LOG -
> 2025-05-23 07:57:12.453 IST [4178805] LOG:  could not synchronize
> replication slot "failover_slot" because remote slot precedes local slot
> 2025-05-23 07:57:12.453 IST [4178805] DETAIL:  The remote slot has LSN
> 0/B000060 and catalog xmin 764, but the local slot has LSN 0/B000060 and
> catalog xmin 765.
> 2025-05-23 07:57:12.453 IST [4178805] STATEMENT:  SELECT
> pg_sync_replication_slots();
>
> select xmin,* from pg_replication_slots ;
> no rows
>
> Primary -
> postgres@4179034=#select xmin,* from pg_replication_slots ;
>  xmin |   slot_name   |  plugin  | slot_type | datoid | database |
> temporary | active | active_pid | xmin | catalog_xmin | restart_lsn |
> confirmed_flush_lsn | wal_status | safe_wal_size | two_phas
> e | two_phase_at |          inactive_since          | conflicting |
> invalidation_reason | failover | synced
>
> ------+---------------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+---------------+---------
>
> --+--------------+----------------------------------+-------------+---------------------+----------+--------
>   765 | slot1         |          | physical  |        |          | f
>   | t      |    4177898 |  765 |              | 0/B018C08   |
>       | reserved   |               | f
>   |              |                                  |             |
>               | f        | f
>       | failover_slot | pgoutput | logical   |      5 | postgres | f
>   | f      |            |      |          764 | 0/B000060   | 0/B000098
>       | reserved   |               | f
>   |              | 2025-05-23 07:55:31.277584+05:30 | f           |
>               | t        | f
> (2 rows)
> =========
>
> Is there any way to sync up the replication slot after the catalog changes
> have been made after creation?
>

The remote_slot (slot on primary) should be advanced before you invoke
sync_slot. Can you do pg_logical_slot_get_changes() API before performing
sync? You can check the xmin of the logical slot after get_changes to
ensure that xmin has moved to 765 in your case.

--
With Regards,
Amit Kapila.

Reply via email to