nocfbot.v11-0002-Const-qualify-SlruShared-s-fields-and-i.patch

application/octet-stream

Filename: nocfbot.v11-0002-Const-qualify-SlruShared-s-fields-and-i.patch
Type: application/octet-stream
Part: 0
Message: Re: Better shared data structure management and resizable shared data structures

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v11-0002
Subject: Const-qualify SlruShared's fields and internal pointers
File+
src/backend/access/transam/slru.c 54 28
src/include/access/slru.h 12 12
From 06aa3c327d7ba21a70d416a1bf7a9bc955f629c6 Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Sun, 5 Apr 2026 21:48:23 +0200
Subject: [PATCH vnocfbot.v11 2/2] Const-qualify SlruShared's fields and
 internal pointers

These fields are expected to never update, so by const-qualifying
them we protect against inadvertent modification and we allow the
compiler to apply a few more optimizations it previously may not
have been able to prove.
---
 src/backend/access/transam/slru.c | 82 ++++++++++++++++++++-----------
 src/include/access/slru.h         | 24 ++++-----
 2 files changed, 66 insertions(+), 40 deletions(-)

diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c
index a1e688dd702..cb2bdb35cf4 100644
--- a/src/backend/access/transam/slru.c
+++ b/src/backend/access/transam/slru.c
@@ -278,6 +278,15 @@ shmem_slru_init(void *location, ShmemStructOpts *base_options)
 	int			nlsns = options->nlsns;
 	char	   *ptr;
 	Size		offset;
+	char	  **page_buffer;
+	SlruPageStatus *page_status;
+	bool	   *page_dirty;
+	int64	   *page_number;
+	int		   *page_lru_count;
+	LWLockPadded *buffer_locks;
+	LWLockPadded *bank_locks;
+	int		   *bank_cur_lru_count;
+	XLogRecPtr *group_lsn;
 
 	shared = (SlruShared) location;
 	desc->shared = shared;
@@ -300,62 +309,79 @@ shmem_slru_init(void *location, ShmemStructOpts *base_options)
 
 	memset(shared, 0, sizeof(SlruSharedData));
 
-	shared->num_slots = nslots;
-	shared->lsn_groups_per_page = nlsns;
-
-	pg_atomic_init_u64(&shared->latest_page_number, 0);
-
-	shared->slru_stats_idx = pgstat_get_slru_index(desc->options.name);
-
 	ptr = (char *) shared;
 	offset = MAXALIGN(sizeof(SlruSharedData));
-	shared->page_buffer = (char **) (ptr + offset);
+	page_buffer = (char **) (ptr + offset);
 	offset += MAXALIGN(nslots * sizeof(char *));
-	shared->page_status = (SlruPageStatus *) (ptr + offset);
+	page_status = (SlruPageStatus *) (ptr + offset);
 	offset += MAXALIGN(nslots * sizeof(SlruPageStatus));
-	shared->page_dirty = (bool *) (ptr + offset);
+	page_dirty = (bool *) (ptr + offset);
 	offset += MAXALIGN(nslots * sizeof(bool));
-	shared->page_number = (int64 *) (ptr + offset);
+	page_number = (int64 *) (ptr + offset);
 	offset += MAXALIGN(nslots * sizeof(int64));
-	shared->page_lru_count = (int *) (ptr + offset);
+	page_lru_count = (int *) (ptr + offset);
 	offset += MAXALIGN(nslots * sizeof(int));
 
 	/* Initialize LWLocks */
-	shared->buffer_locks = (LWLockPadded *) (ptr + offset);
+	buffer_locks = (LWLockPadded *) (ptr + offset);
 	offset += MAXALIGN(nslots * sizeof(LWLockPadded));
-	shared->bank_locks = (LWLockPadded *) (ptr + offset);
+	bank_locks = (LWLockPadded *) (ptr + offset);
 	offset += MAXALIGN(nbanks * sizeof(LWLockPadded));
-	shared->bank_cur_lru_count = (int *) (ptr + offset);
+	bank_cur_lru_count = (int *) (ptr + offset);
 	offset += MAXALIGN(nbanks * sizeof(int));
 
 	if (nlsns > 0)
 	{
-		shared->group_lsn = (XLogRecPtr *) (ptr + offset);
+		group_lsn = (XLogRecPtr *) (ptr + offset);
 		offset += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr));
 	}
+	else
+		group_lsn = NULL;
+
+	/* Initialize the slot banks. */
+	for (int bankno = 0; bankno < nbanks; bankno++)
+	{
+		LWLockInitialize(&bank_locks[bankno].lock, desc->options.bank_tranche_id);
+		bank_cur_lru_count[bankno] = 0;
+	}
 
 	ptr += BUFFERALIGN(offset);
 	for (int slotno = 0; slotno < nslots; slotno++)
 	{
-		LWLockInitialize(&shared->buffer_locks[slotno].lock,
+		LWLockInitialize(&buffer_locks[slotno].lock,
 						 desc->options.buffer_tranche_id);
 
-		shared->page_buffer[slotno] = ptr;
-		shared->page_status[slotno] = SLRU_PAGE_EMPTY;
-		shared->page_dirty[slotno] = false;
-		shared->page_lru_count[slotno] = 0;
+		page_buffer[slotno] = ptr;
+		page_status[slotno] = SLRU_PAGE_EMPTY;
+		page_dirty[slotno] = false;
+		page_lru_count[slotno] = 0;
 		ptr += BLCKSZ;
 	}
 
-	/* Initialize the slot banks. */
-	for (int bankno = 0; bankno < nbanks; bankno++)
-	{
-		LWLockInitialize(&shared->bank_locks[bankno].lock, desc->options.bank_tranche_id);
-		shared->bank_cur_lru_count[bankno] = 0;
-	}
-
 	/* Should fit to estimated shmem size */
 	Assert(ptr - (char *) shared <= SimpleLruShmemSize(nslots, nlsns));
+
+
+	{
+		SlruSharedData template = {
+			.num_slots = nslots,
+			.lsn_groups_per_page = nlsns,
+			.page_buffer = page_buffer,
+			.page_status = page_status,
+			.page_dirty = page_dirty,
+			.page_number = page_number,
+			.page_lru_count = page_lru_count,
+			.buffer_locks = buffer_locks,
+			.bank_locks = bank_locks,
+			.bank_cur_lru_count = bank_cur_lru_count,
+			.group_lsn = group_lsn,
+			.slru_stats_idx = pgstat_get_slru_index(desc->options.name),
+		};
+
+		pg_atomic_init_u64(&template.latest_page_number, 0);
+
+		memcpy(shared, &template, sizeof(SlruSharedData));
+	}
 }
 
 void
diff --git a/src/include/access/slru.h b/src/include/access/slru.h
index 74ea84deec5..b6854af3119 100644
--- a/src/include/access/slru.h
+++ b/src/include/access/slru.h
@@ -48,23 +48,23 @@ typedef enum
 typedef struct SlruSharedData
 {
 	/* Number of buffers managed by this SLRU structure */
-	int			num_slots;
+	const int	num_slots;
 
 	/*
 	 * Arrays holding info for each buffer slot.  Page number is undefined
 	 * when status is EMPTY, as is page_lru_count.
 	 */
-	char	  **page_buffer;
-	SlruPageStatus *page_status;
-	bool	   *page_dirty;
-	int64	   *page_number;
-	int		   *page_lru_count;
+	char	   *const *const page_buffer;
+	SlruPageStatus *const page_status;
+	bool	   *const page_dirty;
+	int64	   *const page_number;
+	int		   *const page_lru_count;
 
 	/* The buffer_locks protects the I/O on each buffer slots */
-	LWLockPadded *buffer_locks;
+	LWLockPadded *const buffer_locks;
 
 	/* Locks to protect the in memory buffer slot access in SLRU bank. */
-	LWLockPadded *bank_locks;
+	LWLockPadded *const bank_locks;
 
 	/*----------
 	 * A bank-wise LRU counter is maintained because we do a victim buffer
@@ -81,7 +81,7 @@ typedef struct SlruSharedData
 	 * works as long as no page's age exceeds INT_MAX counts.
 	 *----------
 	 */
-	int		   *bank_cur_lru_count;
+	int		   *const bank_cur_lru_count;
 
 	/*
 	 * Optional array of WAL flush LSNs associated with entries in the SLRU
@@ -91,8 +91,8 @@ typedef struct SlruSharedData
 	 * highest LSN known for a contiguous group of SLRU entries on that slot's
 	 * page.
 	 */
-	XLogRecPtr *group_lsn;
-	int			lsn_groups_per_page;
+	XLogRecPtr *const group_lsn;
+	const int	lsn_groups_per_page;
 
 	/*
 	 * latest_page_number is the page number of the current end of the log;
@@ -102,7 +102,7 @@ typedef struct SlruSharedData
 	pg_atomic_uint64 latest_page_number;
 
 	/* SLRU's index for statistics purposes (might not be unique) */
-	int			slru_stats_idx;
+	const int	slru_stats_idx;
 } SlruSharedData;
 
 typedef SlruSharedData *SlruShared;
-- 
2.50.1 (Apple Git-155)