On Tue, Mar 1, 2022 at 12:27 AM Nathan Bossart <nathandboss...@gmail.com> wrote: > > On Mon, Feb 28, 2022 at 06:45:51PM +0530, Bharath Rupireddy wrote: > > On Sat, Feb 26, 2022 at 9:37 PM Nathan Bossart <nathandboss...@gmail.com> > > wrote: > >> For > >> this feature, I think we always need to consider what the primary considers > >> synchronously replicated. My suggested approach doesn't change that. I'm > >> saying that instead of spinning in a loop waiting for the WAL to be > >> synchronously replicated, we just immediately send WAL up to the LSN that > >> is presently known to be synchronously replicated. > > > > As I said above, v1 patch does that i.e. async standbys wait until the > > sync standbys update their flush LSN. > > > > Flush LSN is this - flushLSN = walsndctl->lsn[SYNC_REP_WAIT_FLUSH]; > > which gets updated in SyncRepReleaseWaiters. > > > > Async standbys with their SendRqstPtr will wait in XLogSendPhysical or > > XLogSendLogical until SendRqstPtr <= flushLSN. > > My feedback is specifically about this behavior. I don't think we should > spin in XLogSend*() waiting for an LSN to be synchronously replicated. I > think we should just choose the SendRqstPtr based on what is currently > synchronously replicated.
Do you mean something like the following? /* Main loop of walsender process that streams the WAL over Copy messages. */ static void WalSndLoop(WalSndSendDataCallback send_data) { /* * Loop until we reach the end of this timeline or the client requests to * stop streaming. */ for (;;) { if (am_async_walsender && there_are_sync_standbys) { XLogRecPtr SendRqstLSN; XLogRecPtr SyncFlushLSN; SendRqstLSN = GetFlushRecPtr(NULL); LWLockAcquire(SyncRepLock, LW_SHARED); SyncFlushLSN = walsndctl->lsn[SYNC_REP_WAIT_FLUSH]; LWLockRelease(SyncRepLock); if (SendRqstLSN > SyncFlushLSN) continue; } if (!pq_is_send_pending()) send_data(); /* THIS IS WHERE XLogSendPhysical or XLogSendLogical gets called */ else WalSndCaughtUp = false; } Regards, Bharath Rupireddy.