From bbabdbdd54398cc761d3d918e0551f5cfa485d75 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 12 Sep 2026 13:04:52 +0200 Subject: [PATCH v3 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 3cd86dedc25..7df18fb5e1e 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -595,7 +595,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) { /* @@ -612,7 +612,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", @@ -632,7 +632,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; /* @@ -718,7 +718,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; @@ -740,7 +740,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 @@ -799,7 +799,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; @@ -850,7 +850,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); @@ -1054,7 +1054,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) @@ -1064,7 +1064,7 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) Assert(readLen == XLOG_BLCKSZ); if (!XLogReaderValidatePageHeader(state, targetSegmentPtr, - state->readBuf)) + state->readBuf.data)) goto err; } @@ -1074,7 +1074,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) @@ -1088,14 +1088,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) @@ -1454,7 +1454,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 75082c9748c..36eed12d908 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 6e27b30fb35..12535e65fa8 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -262,7 +262,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 83d54a0bf65..fe1d5c22360 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -1247,6 +1247,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 871849e0c34..2a5f6b84ba0 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.55.0