@@ -62,7 +62,10 @@ CkptSortItem *CkptBufferIds;
6262 * Initialize shared buffer pool
6363 *
6464 * This is called once during shared-memory initialization (either in the
65- * postmaster, or in a standalone backend).
65+ * postmaster, or in a standalone backend). Size of data structures initialized
66+ * here depends on NBuffers, and to be able to change NBuffers without a
67+ * restart we store each structure into a separate shared memory segment, which
68+ * could be resized on demand.
6669 */
6770void
6871BufferManagerShmemInit (void )
@@ -74,22 +77,22 @@ BufferManagerShmemInit(void)
7477
7578 /* Align descriptors to a cacheline boundary. */
7679 BufferDescriptors = (BufferDescPadded * )
77- ShmemInitStruct ("Buffer Descriptors" ,
80+ ShmemInitStructInSegment ("Buffer Descriptors" ,
7881 NBuffers * sizeof (BufferDescPadded ),
79- & foundDescs );
82+ & foundDescs , BUFFER_DESCRIPTORS_SHMEM_SEGMENT );
8083
8184 /* Align buffer pool on IO page size boundary. */
8285 BufferBlocks = (char * )
8386 TYPEALIGN (PG_IO_ALIGN_SIZE ,
84- ShmemInitStruct ("Buffer Blocks" ,
87+ ShmemInitStructInSegment ("Buffer Blocks" ,
8588 NBuffers * (Size ) BLCKSZ + PG_IO_ALIGN_SIZE ,
86- & foundBufs ));
89+ & foundBufs , BUFFERS_SHMEM_SEGMENT ));
8790
8891 /* Align condition variables to cacheline boundary. */
8992 BufferIOCVArray = (ConditionVariableMinimallyPadded * )
90- ShmemInitStruct ("Buffer IO Condition Variables" ,
93+ ShmemInitStructInSegment ("Buffer IO Condition Variables" ,
9194 NBuffers * sizeof (ConditionVariableMinimallyPadded ),
92- & foundIOCV );
95+ & foundIOCV , BUFFER_IOCV_SHMEM_SEGMENT );
9396
9497 /*
9598 * The array used to sort to-be-checkpointed buffer ids is located in
@@ -99,8 +102,9 @@ BufferManagerShmemInit(void)
99102 * painful.
100103 */
101104 CkptBufferIds = (CkptSortItem * )
102- ShmemInitStruct ("Checkpoint BufferIds" ,
103- NBuffers * sizeof (CkptSortItem ), & foundBufCkpt );
105+ ShmemInitStructInSegment ("Checkpoint BufferIds" ,
106+ NBuffers * sizeof (CkptSortItem ), & foundBufCkpt ,
107+ CHECKPOINT_BUFFERS_SHMEM_SEGMENT );
104108
105109 if (foundDescs || foundBufs || foundIOCV || foundBufCkpt )
106110 {
@@ -147,33 +151,54 @@ BufferManagerShmemInit(void)
147151 * BufferManagerShmemSize
148152 *
149153 * compute the size of shared memory for the buffer pool including
150- * data pages, buffer descriptors, hash tables, etc.
154+ * data pages, buffer descriptors, hash tables, etc. based on the
155+ * shared memory segment. The main segment must not allocate anything
156+ * related to buffers, every other segment will receive part of the
157+ * data.
151158 */
152159Size
153- BufferManagerShmemSize (void )
160+ BufferManagerShmemSize (int shmem_segment )
154161{
155162 Size size = 0 ;
156163
157- /* size of buffer descriptors */
158- size = add_size (size , mul_size (NBuffers , sizeof (BufferDescPadded )));
159- /* to allow aligning buffer descriptors */
160- size = add_size (size , PG_CACHE_LINE_SIZE );
164+ if (shmem_segment == MAIN_SHMEM_SEGMENT )
165+ return size ;
161166
162- /* size of data pages, plus alignment padding */
163- size = add_size (size , PG_IO_ALIGN_SIZE );
164- size = add_size (size , mul_size (NBuffers , BLCKSZ ));
167+ if (shmem_segment == BUFFER_DESCRIPTORS_SHMEM_SEGMENT )
168+ {
169+ /* size of buffer descriptors */
170+ size = add_size (size , mul_size (NBuffers , sizeof (BufferDescPadded )));
171+ /* to allow aligning buffer descriptors */
172+ size = add_size (size , PG_CACHE_LINE_SIZE );
173+ }
165174
166- /* size of stuff controlled by freelist.c */
167- size = add_size (size , StrategyShmemSize ());
175+ if (shmem_segment == BUFFERS_SHMEM_SEGMENT )
176+ {
177+ /* size of data pages, plus alignment padding */
178+ size = add_size (size , PG_IO_ALIGN_SIZE );
179+ size = add_size (size , mul_size (NBuffers , BLCKSZ ));
180+ }
168181
169- /* size of I/O condition variables */
170- size = add_size ( size , mul_size ( NBuffers ,
171- sizeof ( ConditionVariableMinimallyPadded )));
172- /* to allow aligning the above */
173- size = add_size ( size , PG_CACHE_LINE_SIZE );
182+ if ( shmem_segment == STRATEGY_SHMEM_SEGMENT )
183+ {
184+ /* size of stuff controlled by freelist.c */
185+ size = add_size ( size , StrategyShmemSize ());
186+ }
174187
175- /* size of checkpoint sort array in bufmgr.c */
176- size = add_size (size , mul_size (NBuffers , sizeof (CkptSortItem )));
188+ if (shmem_segment == BUFFER_IOCV_SHMEM_SEGMENT )
189+ {
190+ /* size of I/O condition variables */
191+ size = add_size (size , mul_size (NBuffers ,
192+ sizeof (ConditionVariableMinimallyPadded )));
193+ /* to allow aligning the above */
194+ size = add_size (size , PG_CACHE_LINE_SIZE );
195+ }
196+
197+ if (shmem_segment == CHECKPOINT_BUFFERS_SHMEM_SEGMENT )
198+ {
199+ /* size of checkpoint sort array in bufmgr.c */
200+ size = add_size (size , mul_size (NBuffers , sizeof (CkptSortItem )));
201+ }
177202
178203 return size ;
179204}
0 commit comments