提交 b25dc481 编写于 作者: T Tom Lane

Fix oversight in sizing of shared buffer lookup hashtable. Because

BufferAlloc tries to insert a new mapping entry before deleting the old one
for a buffer, we have a transient need for more than NBuffers entries ---
one more in 8.1, and as many as NUM_BUFFER_PARTITIONS more in CVS HEAD.
In theory this could lead to an "out of shared memory" failure if shmem
had already been completely claimed by the time the extra entries were
needed.
上级 10b9ca3d
......@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/storage/buffer/freelist.c,v 1.55 2006/03/05 15:58:36 momjian Exp $
* $PostgreSQL: pgsql/src/backend/storage/buffer/freelist.c,v 1.56 2006/07/23 18:34:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -213,8 +213,8 @@ StrategyShmemSize(void)
{
Size size = 0;
/* size of lookup hash table */
size = add_size(size, BufTableShmemSize(NBuffers));
/* size of lookup hash table ... see comment in StrategyInitialize */
size = add_size(size, BufTableShmemSize(NBuffers + NUM_BUFFER_PARTITIONS));
/* size of the shared replacement strategy control block */
size = add_size(size, MAXALIGN(sizeof(BufferStrategyControl)));
......@@ -236,8 +236,15 @@ StrategyInitialize(bool init)
/*
* Initialize the shared buffer lookup hashtable.
*
* Since we can't tolerate running out of lookup table entries, we
* must be sure to specify an adequate table size here. The maximum
* steady-state usage is of course NBuffers entries, but BufferAlloc()
* tries to insert a new entry before deleting the old. In principle
* this could be happening in each partition concurrently, so we
* could need as many as NBuffers + NUM_BUFFER_PARTITIONS entries.
*/
InitBufTable(NBuffers);
InitBufTable(NBuffers + NUM_BUFFER_PARTITIONS);
/*
* Get or create the shared strategy control block
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册