From 804046b39a27973751c920f8f41504697f3f52d5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 8 Dec 2025 13:52:42 +0100 Subject: [PATCH] Use PGAlignedXLogBlock for some code simplification The code in BootStrapXLOG() and in pg_test_fsync.c tried to align WAL buffers in complicated ways. Also, they still used XLOG_BLCKSZ for the alignment, even though that should now be PG_IO_ALIGN_SIZE. This can now be simplified and made more consistent by using PGAlignedXLogBlock, either directly in BootStrapXLOG() and using alignas in pg_test_fsync.c. Reviewed-by: Chao Li Reviewed-by: Thomas Munro Discussion: https://www.postgresql.org/message-id/flat/f462a175-b608-44a1-b428-bdf351e914f4%40eisentraut.org --- src/backend/access/transam/xlog.c | 12 ++++-------- src/bin/pg_test_fsync/pg_test_fsync.c | 11 ++++------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 22d0a2e8c3a..89cbda9cc7c 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5089,7 +5089,7 @@ void BootStrapXLOG(uint32 data_checksum_version) { CheckPoint checkPoint; - char *buffer; + PGAlignedXLogBlock buffer; XLogPageHeader page; XLogLongPageHeader longpage; XLogRecord *record; @@ -5118,10 +5118,8 @@ BootStrapXLOG(uint32 data_checksum_version) sysidentifier |= ((uint64) tv.tv_usec) << 12; sysidentifier |= getpid() & 0xFFF; - /* page buffer must be aligned suitably for O_DIRECT */ - buffer = (char *) palloc(XLOG_BLCKSZ + XLOG_BLCKSZ); - page = (XLogPageHeader) TYPEALIGN(XLOG_BLCKSZ, buffer); - memset(page, 0, XLOG_BLCKSZ); + memset(&buffer, 0, sizeof buffer); + page = (XLogPageHeader) &buffer; /* * Set up information for the initial checkpoint record @@ -5202,7 +5200,7 @@ BootStrapXLOG(uint32 data_checksum_version) /* Write the first page with the initial record */ errno = 0; pgstat_report_wait_start(WAIT_EVENT_WAL_BOOTSTRAP_WRITE); - if (write(openLogFile, page, XLOG_BLCKSZ) != XLOG_BLCKSZ) + if (write(openLogFile, &buffer, XLOG_BLCKSZ) != XLOG_BLCKSZ) { /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) @@ -5242,8 +5240,6 @@ BootStrapXLOG(uint32 data_checksum_version) BootStrapSUBTRANS(); BootStrapMultiXact(); - pfree(buffer); - /* * Force control file to be read - in contrast to normal processing we'd * otherwise never run the checks and GUC related initializations therein. diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c index 0060ea15902..23f45a100e5 100644 --- a/src/bin/pg_test_fsync/pg_test_fsync.c +++ b/src/bin/pg_test_fsync/pg_test_fsync.c @@ -68,9 +68,8 @@ static const char *progname; static unsigned int secs_per_test = 5; static int needs_unlink = 0; -static char full_buf[DEFAULT_XLOG_SEG_SIZE], - *buf, - *filename = FSYNC_FILENAME; +alignas(PGAlignedXLogBlock) static char buf[DEFAULT_XLOG_SEG_SIZE]; +static char *filename = FSYNC_FILENAME; static struct timeval start_t, stop_t; static sig_atomic_t alarm_triggered = false; @@ -232,9 +231,7 @@ prepare_buf(void) /* write random data into buffer */ for (ops = 0; ops < DEFAULT_XLOG_SEG_SIZE; ops++) - full_buf[ops] = (char) pg_prng_int32(&pg_global_prng_state); - - buf = (char *) TYPEALIGN(XLOG_BLCKSZ, full_buf); + buf[ops] = (char) pg_prng_int32(&pg_global_prng_state); } static void @@ -248,7 +245,7 @@ test_open(void) if ((tmpfile = open(filename, O_RDWR | O_CREAT | PG_BINARY, S_IRUSR | S_IWUSR)) == -1) die("could not open output file"); needs_unlink = 1; - if (write(tmpfile, full_buf, DEFAULT_XLOG_SEG_SIZE) != + if (write(tmpfile, buf, DEFAULT_XLOG_SEG_SIZE) != DEFAULT_XLOG_SEG_SIZE) die("write failed");