On Tue, Mar 9, 2021 at 3:02 PM Peter Smith <smithpb2...@gmail.com> wrote: > > On Mon, Mar 8, 2021 at 4:58 PM vignesh C <vignes...@gmail.com> wrote: > > > > + while (AnyTablesyncInProgress()) > > + { > > + process_syncing_tables(begin_data.final_lsn); > > + > > + /* This latch is to prevent 100% CPU looping. */ > > + (void) WaitLatch(MyLatch, > > + WL_LATCH_SET > > | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, > > + 1000L, > > WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE); > > + ResetLatch(MyLatch); > > + } > > Should we have CHECK_FOR_INTERRUPTS inside the while loop? > > The process_syncing_tables will end up in the > process_syncing_tables_for_apply() function. And in that function IIUC > the apply worker is spending most of the time waiting for the > tablesync to achieve SYNCDONE state. > See wait_for_relation_state_change(rstate->relid, SUBREL_STATE_SYNCDONE); >
But, I think for large copy, it won't wait in that state because the tablesync worker will still be in SUBREL_STATE_DATASYNC state and we wait for SUBREL_STATE_SYNCDONE state only after the initial copy is finished. So, I think it is a good idea to call CHECK_FOR_INTERRUPTS in this loop. -- With Regards, Amit Kapila.