SyncRepWaitForLSN waits for XLogFlush?

Started by Tejasvi Kashiover 2 years ago3 messages
#1Tejasvi Kashi
mail@tejasvi.dev

Hi everyone,

I was wondering if waiting for an LSN in SyncRepWaitForLSN ensures that the
XLOG has been flushed locally up to that location before the record is
shipped off to standbys?

Regards,
Tej

#2Andres Freund
andres@anarazel.de
In reply to: Tejasvi Kashi (#1)
Re: SyncRepWaitForLSN waits for XLogFlush?

Hi,

On 2023-05-24 10:53:51 -0400, Tejasvi Kashi wrote:

I was wondering if waiting for an LSN in SyncRepWaitForLSN ensures that the
XLOG has been flushed locally up to that location before the record is
shipped off to standbys?

No, SyncRepWaitForLSN() doesn't directly ensure that. The callers have to (and
do) call XLogFlush() separately. See e.g. the XLogFlush() call in
RecordTransactionCommit().

Note that calling SyncRepWaitForLSN() for an LSN that is not yet flushed would
not lead for data to be prematurely sent out - walsender won't send data that
hasn't yet been flushed. So a backend with such a spurious SyncRepWaitForLSN()
would just wait until the LSN is actually flushed and *then* replicated.

Any specific reason for that question?

Greetings,

Andres Freund

#3Tejasvi Kashi
mail@tejasvi.dev
In reply to: Andres Freund (#2)
Re: SyncRepWaitForLSN waits for XLogFlush?

Hi Andres,

Thanks for your reply. If I understand you correctly, you're saying that
the walsender *waits* for xlogflush, but does not *cause* it. This means
that for a sync_commit=off transaction, the xlog records won't get shipped
out to standbys until the walwriter flushes in-memory xlog contents to disk.

And furthermore, am I correct in assuming that this behaviour is different
from the buffer manager and the slru which both *cause* xlog flush up to a
certain lsn before they proceed with flushing a page to disk?

The reason I'm asking this is that I'm working on modifying the transaction
manager for my thesis project, and the pg_walinspect test is failing when I
run make check-world. So, I'm just trying to understand things to identify
the cause of this issue.

Regards,
Tej

On Wed, 24 May 2023 at 17:33, Andres Freund <andres@anarazel.de> wrote:

Show quoted text

Hi,

On 2023-05-24 10:53:51 -0400, Tejasvi Kashi wrote:

I was wondering if waiting for an LSN in SyncRepWaitForLSN ensures that

the

XLOG has been flushed locally up to that location before the record is
shipped off to standbys?

No, SyncRepWaitForLSN() doesn't directly ensure that. The callers have to
(and
do) call XLogFlush() separately. See e.g. the XLogFlush() call in
RecordTransactionCommit().

Note that calling SyncRepWaitForLSN() for an LSN that is not yet flushed
would
not lead for data to be prematurely sent out - walsender won't send data
that
hasn't yet been flushed. So a backend with such a spurious
SyncRepWaitForLSN()
would just wait until the LSN is actually flushed and *then* replicated.

Any specific reason for that question?

Greetings,

Andres Freund