]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix checkpointer shared memory allocation
authorAlexander Korotkov <akorotkov@postgresql.org>
Thu, 7 Aug 2025 11:29:02 +0000 (14:29 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Thu, 7 Aug 2025 11:31:25 +0000 (14:31 +0300)
Use Min(NBuffers, MAX_CHECKPOINT_REQUESTS) instead of NBuffers in
CheckpointerShmemSize() to match the actual array size limit set in
CheckpointerShmemInit().  This prevents wasting shared memory when
NBuffers > MAX_CHECKPOINT_REQUESTS.  Also, fix the comment.

Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/1439188.1754506714%40sss.pgh.pa.us
Author: Xuneng Zhou <xunengzhou@gmail.com>
Co-authored-by: Alexander Korotkov <aekorotkov@gmail.com>
src/backend/postmaster/checkpointer.c

index 17a068b27b82673d88bccfeb7bc8bd05f8a97e96..afaa580ae4d643c3e61faed1fc601f93594cfe7a 100644 (file)
@@ -876,11 +876,14 @@ CheckpointerShmemSize(void)
        Size            size;
 
        /*
-        * Currently, the size of the requests[] array is arbitrarily set equal to
-        * NBuffers.  This may prove too large or small ...
+        * The size of the requests[] array is arbitrarily set equal to NBuffers.
+        * But there is a cap of MAX_CHECKPOINT_REQUESTS to prevent accumulating
+        * too many checkpoint requests in the ring buffer.
         */
        size = offsetof(CheckpointerShmemStruct, requests);
-       size = add_size(size, mul_size(NBuffers, sizeof(CheckpointerRequest)));
+       size = add_size(size, mul_size(Min(NBuffers,
+                                                                          MAX_CHECKPOINT_REQUESTS),
+                                                                  sizeof(CheckpointerRequest)));
 
        return size;
 }