Use PGAlignedXLogBlock for some code simplification
authorPeter Eisentraut <peter@eisentraut.org>
Mon, 8 Dec 2025 12:52:42 +0000 (13:52 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Mon, 8 Dec 2025 13:54:32 +0000 (14:54 +0100)
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 <li.evan.chao@gmail.com>
Reviewed-by: Thomas Munro <thomas.munro@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/f462a175-b608-44a1-b428-bdf351e914f4%40eisentraut.org

src/backend/access/transam/xlog.c
src/bin/pg_test_fsync/pg_test_fsync.c

index 22d0a2e8c3a6ac465b2f2628efd19cfd174608e3..89cbda9cc7c607b4e030f6fbf11711f811e5d7d6 100644 (file)
@@ -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.
index 0060ea15902cbd1999e14ac63decf2274164afae..23f45a100e59318d4107220dfb3c947f075b4546 100644 (file)
@@ -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");