summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2025-12-08 12:52:42 +0000
committerPeter Eisentraut2025-12-08 13:54:32 +0000
commit804046b39a27973751c920f8f41504697f3f52d5 (patch)
treed520df22fdab53cad27883ff711f9087a0b8844e
parent31280d96a64850f5a9a924088890ab43a2905237 (diff)
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 <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
-rw-r--r--src/backend/access/transam/xlog.c12
-rw-r--r--src/bin/pg_test_fsync/pg_test_fsync.c11
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");