From 938d80bdaa6d702cb8e415b582555efa76574e55 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Thu, 25 Jan 2024 07:13:23 +0000 Subject: [PATCH v20] Use XLogReadFromBuffers in more places --- src/backend/access/transam/xlogutils.c | 12 +++++++++++- src/backend/postmaster/walsummarizer.c | 12 +++++++++++- src/backend/replication/walsender.c | 12 +++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index aa8667abd1..de526f7da7 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -894,6 +894,8 @@ read_local_xlog_page_guts(XLogReaderState *state, XLogRecPtr targetPagePtr, int count; WALReadError errinfo; TimeLineID currTLI; + Size nbytes; + Size rbytes; loc = targetPagePtr + reqLen; @@ -1006,12 +1008,20 @@ read_local_xlog_page_guts(XLogReaderState *state, XLogRecPtr targetPagePtr, count = read_upto - targetPagePtr; } + /* Read from WAL buffers, if available. */ + nbytes = XLOG_BLCKSZ; + rbytes = XLogReadFromBuffers(cur_page, targetPagePtr, + nbytes, currTLI); + cur_page += rbytes; + targetPagePtr += rbytes; + nbytes -= rbytes; + /* * Even though we just determined how much of the page can be validly read * as 'count', read the whole page anyway. It's guaranteed to be * zero-padded up to the page boundary if it's incomplete. */ - if (!WALRead(state, cur_page, targetPagePtr, XLOG_BLCKSZ, tli, + if (!WALRead(state, cur_page, targetPagePtr, nbytes, tli, &errinfo)) WALReadRaiseError(&errinfo); diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c index 9b883c21ca..33eb3a4870 100644 --- a/src/backend/postmaster/walsummarizer.c +++ b/src/backend/postmaster/walsummarizer.c @@ -1221,6 +1221,8 @@ summarizer_read_local_xlog_page(XLogReaderState *state, int count; WALReadError errinfo; SummarizerReadLocalXLogPrivate *private_data; + Size nbytes; + Size rbytes; HandleWalSummarizerInterrupts(); @@ -1318,12 +1320,20 @@ summarizer_read_local_xlog_page(XLogReaderState *state, } } + /* Read from WAL buffers, if available. */ + nbytes = XLOG_BLCKSZ; + rbytes = XLogReadFromBuffers(cur_page, targetPagePtr, + nbytes, private_data->tli); + cur_page += rbytes; + targetPagePtr += rbytes; + nbytes -= rbytes; + /* * Even though we just determined how much of the page can be validly read * as 'count', read the whole page anyway. It's guaranteed to be * zero-padded up to the page boundary if it's incomplete. */ - if (!WALRead(state, cur_page, targetPagePtr, XLOG_BLCKSZ, + if (!WALRead(state, cur_page, targetPagePtr, nbytes, private_data->tli, &errinfo)) WALReadRaiseError(&errinfo); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 95ba656a06..ab119ef29a 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1059,6 +1059,8 @@ logical_read_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int req WALReadError errinfo; XLogSegNo segno; TimeLineID currTLI; + Size nbytes; + Size rbytes; /* * Make sure we have enough WAL available before retrieving the current @@ -1095,11 +1097,19 @@ logical_read_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int req else count = flushptr - targetPagePtr; /* part of the page available */ + /* Read from WAL buffers, if available. */ + nbytes = XLOG_BLCKSZ; + rbytes = XLogReadFromBuffers(cur_page, targetPagePtr, + nbytes, currTLI); + cur_page += rbytes; + targetPagePtr += rbytes; + nbytes -= rbytes; + /* now actually read the data, we know it's there */ if (!WALRead(state, cur_page, targetPagePtr, - XLOG_BLCKSZ, + nbytes, currTLI, /* Pass the current TLI because only * WalSndSegmentOpen controls whether new TLI * is needed. */ -- 2.34.1