Re: Excessive number of replication slots for 12->14 logical replication
Ajin Cherian <itsajin@gmail.com>
From: Ajin Cherian <itsajin@gmail.com>
To: Peter Smith <smithpb2250@gmail.com>
Cc: "houzj.fnst@fujitsu.com" <houzj.fnst@fujitsu.com>,
Amit Kapila <amit.kapila16@gmail.com>, Hubert Lubaczewski <depesz@depesz.com>, PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2022-08-01T06:45:51Z
Lists: pgsql-bugs
Attachments
- v5-0001-fix-excessive-replication-origin-slots-issue.patch (application/octet-stream) patch v5-0001
On Mon, Aug 1, 2022 at 11:50 AM Peter Smith <smithpb2250@gmail.com> wrote: > > Here is my review comment for v4-0001. > > (Just a nitpick about comments) > > ====== > > 1. src/backend/replication/logical/tablesync.c - process_syncing_tables_for_sync > > There are really just 2 main things that are being done for the cleanup here: > - Drop the origin tracking > - Drop the tablesync slot > > So, IMO the code will have more clarity by having one bigger comment > for each of those drops, instead of commenting every step separately. > > e.g. > > BEFORE > /* > * Cleanup the tablesync origin tracking if exists. > */ > ReplicationOriginNameForTablesync(MyLogicalRepWorker->subid, > MyLogicalRepWorker->relid, > originname, > sizeof(originname)); > > /* > * Reset the origin session before dropping. > * > * This is required to reset the ownership of the slot > * and allow the origin to be dropped. > */ > replorigin_session_reset(); > > replorigin_session_origin = InvalidRepOriginId; > replorigin_session_origin_lsn = InvalidXLogRecPtr; > replorigin_session_origin_timestamp = 0; > > /* > * There is a chance that the user is concurrently performing > * refresh for the subscription where we remove the table > * state and its origin and by this time the origin might be > * already removed. So passing missing_ok = true. > */ > replorigin_drop_by_name(originname, true, false); > > /* Cleanup the tablesync slot. */ > ReplicationSlotNameForTablesync(MyLogicalRepWorker->subid, > MyLogicalRepWorker->relid, > syncslotname, > sizeof(syncslotname)); > > /* > * It is important to give an error if we are unable to drop the slot, > * otherwise, it won't be dropped till the corresponding subscription > * is dropped. So passing missing_ok = false. > */ > ReplicationSlotDropAtPubNode(LogRepWorkerWalRcvConn, syncslotname, false); > > > SUGGESTION > > /* > * Cleanup the tablesync origin tracking. > * > * Resetting the origin session removes the ownership of the slot. > * This is needed to allow the origin to be dropped. > * > * Also, there is a chance that the user is concurrently performing > * refresh for the subscription where we remove the table > * state and its origin and by this time the origin might be > * already removed. So passing missing_ok = true. > */ > ReplicationOriginNameForTablesync(MyLogicalRepWorker->subid, > MyLogicalRepWorker->relid, > originname, > sizeof(originname)); > replorigin_session_reset(); > replorigin_session_origin = InvalidRepOriginId; > replorigin_session_origin_lsn = InvalidXLogRecPtr; > replorigin_session_origin_timestamp = 0; > > replorigin_drop_by_name(originname, true, false); > > /* > * Cleanup the tablesync slot. > * > * It is important to give an error if we are unable to drop the slot, > * otherwise, it won't be dropped till the corresponding subscription > * is dropped. So passing missing_ok = false. > */ > ReplicationSlotNameForTablesync(MyLogicalRepWorker->subid, > MyLogicalRepWorker->relid, > syncslotname, > sizeof(syncslotname)); > ReplicationSlotDropAtPubNode(LogRepWorkerWalRcvConn, syncslotname, false); > Updated. regards, Ajin Cherian Fujitsu Australia
Commits
-
Make the tablesync worker's replication origin drop logic robust.
- 88f488319bac 16.0 landed
-
Drop replication origin slots before tablesync worker exits.
- f6c5edb8abca 16.0 landed
-
Allow multiple xacts during table sync in logical replication.
- ce0fdbfe9722 14.0 cited