aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/storage/buffer/freelist.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/backend/storage/buffer/freelist.c b/src/backend/storage/buffer/freelist.c
index 7db8b766aaa..333053c1c93 100644
--- a/src/backend/storage/buffer/freelist.c
+++ b/src/backend/storage/buffer/freelist.c
@@ -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