From db625ed5e2d738c4e472205b345412eec2e76ee0 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 12 Sep 2026 13:04:52 +0200 Subject: [PATCH v4 3/5] XXX Reintroduce PGAlignedXLogBlock and use it --- src/backend/access/transam/xlogreader.c | 26 +++++++++++------------ src/backend/access/transam/xlogrecovery.c | 2 +- src/include/access/xlogreader.h | 2 +- src/include/c.h | 6 ++++++ src/tools/pgindent/typedefs.list | 1 + 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 7f4a3f03d94..60575e6cb41 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -665,7 +665,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) * ReadPageInternal always returns at least the page header, so we can * examine it now. */ - pageHeaderSize = XLogPageHeaderSize((XLogPageHeader) state->readBuf); + pageHeaderSize = XLogPageHeaderSize((XLogPageHeader) state->readBuf.data); if (targetRecOff == 0) { /* @@ -682,7 +682,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) goto err; } - if ((((XLogPageHeader) state->readBuf)->xlp_info & XLP_FIRST_IS_CONTRECORD) && + if ((((XLogPageHeader) state->readBuf.data)->xlp_info & XLP_FIRST_IS_CONTRECORD) && targetRecOff == pageHeaderSize) { report_invalid_record(state, "contrecord is requested by %X/%08X", @@ -702,7 +702,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) * cannot access any other fields until we've verified that we got the * whole header. */ - record = (XLogRecord *) (state->readBuf + RecPtr % XLOG_BLCKSZ); + record = (XLogRecord *) (state->readBuf.data + RecPtr % XLOG_BLCKSZ); total_len = record->xl_tot_len; /* @@ -788,7 +788,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) /* Copy the first fragment of the record from the first page. */ memcpy(state->readRecordBuf, - state->readBuf + RecPtr % XLOG_BLCKSZ, len); + state->readBuf.data + RecPtr % XLOG_BLCKSZ, len); buffer = state->readRecordBuf + len; gotlen = len; @@ -810,7 +810,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) Assert(SizeOfXLogShortPHD <= readOff); - pageHeader = (XLogPageHeader) state->readBuf; + pageHeader = (XLogPageHeader) state->readBuf.data; /* * If we were expecting a continuation record and got an @@ -869,7 +869,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) Assert(pageHeaderSize <= readOff); - contdata = (char *) state->readBuf + pageHeaderSize; + contdata = (char *) state->readBuf.data + pageHeaderSize; len = XLOG_BLCKSZ - pageHeaderSize; if (pageHeader->xlp_rem_len < len) len = pageHeader->xlp_rem_len; @@ -920,7 +920,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) if (!ValidXLogRecord(state, record, RecPtr)) goto err; - pageHeaderSize = XLogPageHeaderSize((XLogPageHeader) state->readBuf); + pageHeaderSize = XLogPageHeaderSize((XLogPageHeader) state->readBuf.data); state->DecodeRecPtr = RecPtr; state->NextRecPtr = targetPagePtr + pageHeaderSize + MAXALIGN(pageHeader->xlp_rem_len); @@ -1124,7 +1124,7 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) readLen = state->routine.page_read(state, targetSegmentPtr, XLOG_BLCKSZ, state->currRecPtr, - state->readBuf); + state->readBuf.data); if (readLen == XLREAD_WOULDBLOCK) return XLREAD_WOULDBLOCK; else if (readLen < 0) @@ -1134,7 +1134,7 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) Assert(readLen == XLOG_BLCKSZ); if (!XLogReaderValidatePageHeader(state, targetSegmentPtr, - state->readBuf)) + state->readBuf.data)) goto err; } @@ -1144,7 +1144,7 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) */ readLen = state->routine.page_read(state, pageptr, Max(reqLen, SizeOfXLogShortPHD), state->currRecPtr, - state->readBuf); + state->readBuf.data); if (readLen == XLREAD_WOULDBLOCK) return XLREAD_WOULDBLOCK; else if (readLen < 0) @@ -1158,14 +1158,14 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) Assert(readLen >= reqLen); - hdr = (XLogPageHeader) state->readBuf; + hdr = (XLogPageHeader) state->readBuf.data; /* still not enough */ if (readLen < XLogPageHeaderSize(hdr)) { readLen = state->routine.page_read(state, pageptr, XLogPageHeaderSize(hdr), state->currRecPtr, - state->readBuf); + state->readBuf.data); if (readLen == XLREAD_WOULDBLOCK) return XLREAD_WOULDBLOCK; else if (readLen < 0) @@ -1524,7 +1524,7 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr, char **errormsg) if (readLen < 0) goto err; - header = (XLogPageHeader) state->readBuf; + header = (XLogPageHeader) state->readBuf.data; pageHeaderSize = XLogPageHeaderSize(header); diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index fa1a1ef8a88..728916cddc5 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -1543,7 +1543,7 @@ FinishWalRecovery(void) /* Copy the valid part of the last block */ len = endOfLog % XLOG_BLCKSZ; page = palloc(len); - memcpy(page, xlogreader->readBuf, len); + memcpy(page, xlogreader->readBuf.data, len); result->lastPageBeginPtr = pageBeginPtr; result->lastPage = page; diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index c70fff7e3f1..c9709c3a0d9 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -273,7 +273,7 @@ struct XLogReaderState /* * Buffer for currently read page (valid up to at least readLen bytes) */ - alignas(MAXIMUM_ALIGNOF) char readBuf[XLOG_BLCKSZ]; + PGAlignedXLogBlock readBuf; uint32 readLen; /* last read XLOG position for data currently in readBuf */ diff --git a/src/include/c.h b/src/include/c.h index 926824c6dbe..04de34c3c92 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -1296,6 +1296,12 @@ typedef struct PGAlignedBlock alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ]; } PGAlignedBlock; +/* Same, but for an XLOG_BLCKSZ-sized buffer */ +typedef struct PGAlignedXLogBlock +{ + alignas(MAXIMUM_ALIGNOF) char data[XLOG_BLCKSZ]; +} PGAlignedXLogBlock; + /* * alignas with extended alignments is buggy in g++ < 9. As a simple * workaround, we disable these definitions in that case. diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 741ccc4bd91..912dc062d35 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1912,6 +1912,7 @@ PERL_CONTEXT PERL_SI PFN PGAlignedBlock +PGAlignedXLogBlock PGAsyncStatusType PGCALL2 PGCRYPTO_SHA_t -- 2.56.0