Re: Synchronizing slots from primary to standby - Mailing list pgsql-hackers
From | shveta malik |
---|---|
Subject | Re: Synchronizing slots from primary to standby |
Date | |
Msg-id | CAJpy0uC=h4inQ41RVDffEYMfKYNDcP=MoQdLGgfA487UmVLt6w@mail.gmail.com Whole thread Raw |
In response to | Re: Synchronizing slots from primary to standby (Amit Kapila <amit.kapila16@gmail.com>) |
Responses |
Re: Synchronizing slots from primary to standby
|
List | pgsql-hackers |
On Wed, Feb 21, 2024 at 5:19 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > A few minor comments: Thanks for the feedback. > ================= > 1. > +/* > + * Is stopSignaled set in SlotSyncCtx? > + */ > +bool > +IsStopSignaledSet(void) > +{ > + bool signaled; > + > + SpinLockAcquire(&SlotSyncCtx->mutex); > + signaled = SlotSyncCtx->stopSignaled; > + SpinLockRelease(&SlotSyncCtx->mutex); > + > + return signaled; > +} > + > +/* > + * Reset stopSignaled in SlotSyncCtx. > + */ > +void > +ResetStopSignaled(void) > +{ > + SpinLockAcquire(&SlotSyncCtx->mutex); > + SlotSyncCtx->stopSignaled = false; > + SpinLockRelease(&SlotSyncCtx->mutex); > +} > > I think these newly introduced functions don't need spinlock to be > acquired as these are just one-byte read-and-write. Additionally, when > IsStopSignaledSet() is invoked, there shouldn't be any concurrent > process to update that value. What do you think? Yes, we can avoid taking spinlock here. These functions are invoked after checking that pmState is PM_RUN. And in that state we do not expect any other process writing this flag. > 2. > +REPL_SLOTSYNC_MAIN "Waiting in main loop of slot sync worker." > +REPL_SLOTSYNC_SHUTDOWN "Waiting for slot sync worker to shut down." > > Let's use REPLICATION instead of REPL. I see other wait events using > REPLICATION in their names. Modified. > 3. > - * In standalone mode and in autovacuum worker processes, we use a fixed > - * ID, otherwise we figure it out from the authenticated user name. > + * In standalone mode, autovacuum worker processes and slot sync worker > + * process, we use a fixed ID, otherwise we figure it out from the > + * authenticated user name. > */ > - if (bootstrap || IsAutoVacuumWorkerProcess()) > + if (bootstrap || IsAutoVacuumWorkerProcess() || IsLogicalSlotSyncWorker()) > { > InitializeSessionUserIdStandalone(); > am_superuser = true; > > IIRC, we discussed this previously and it is safe to make the local > connection as superuser as we don't consult any user tables, so we can > probably add a comment where we invoke InitPostgres in slotsync.c Added comment. Thanks Hou-San for the analysis here and providing comment. > 4. > $publisher->safe_psql('postgres', > - "CREATE PUBLICATION regress_mypub FOR ALL TABLES;"); > + "CREATE PUBLICATION regress_mypub FOR ALL TABLES;" > +); > > Why this change is required in the patch? Not needed, removed it. > 5. > +# Confirm that restart_lsn and of confirmed_flush_lsn lsub1_slot slot > are synced > +# to the standby > > /and of/; looks like a typo Modified. > 6. > +# Confirm that restart_lsn and of confirmed_flush_lsn lsub1_slot slot > are synced > +# to the standby > +ok( $standby1->poll_query_until( > + 'postgres', > + "SELECT '$primary_restart_lsn' = restart_lsn AND > '$primary_flush_lsn' = confirmed_flush_lsn from pg_replication_slots > WHERE slot_name = 'lsub1_slot';"), > + 'restart_lsn and confirmed_flush_lsn of slot lsub1_slot synced to standby'); > + > ... > ... > +# Confirm the synced slot 'lsub1_slot' is retained on the new primary > +is($standby1->safe_psql('postgres', > + q{SELECT slot_name FROM pg_replication_slots WHERE slot_name = > 'lsub1_slot';}), > + 'lsub1_slot', > + 'synced slot retained on the new primary'); > > In both these checks, we should additionally check the 'synced' and > 'temporary' flags to ensure that they are marked appropriately. Modified. Please find patch001 attached. There is a CFBot failure in patch002. The test added there needs some adjustment. We will rebase and post rest of the patches once we fix that issue. thanks Shveta
Attachment
pgsql-hackers by date: