summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-04-04 16:31:44 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-04-04 16:52:55 +0300
commit9508754ed7e3b5688c97a26bbe15af7e11d7f06a (patch)
tree91dbc800ce48679a3929d1014f9cc592ccfe8290
parenta0c2492b957a7e89b997d03d0d62f37fee7aafdf (diff)
Calculate # of semaphores correctly with --disable-spinlocks.
The old formula didn't take into account that each WAL sender process needs a spinlock. We had also already exceeded the fixed number of spinlocks reserved for misc purposes (10). Bump that to 30. Backpatch to 9.0, where WAL senders were introduced. If I counted correctly, 9.0 had exactly 10 predefined spinlocks, and 9.1 exceeded that, but bump the limit in 9.0 too because 10 is uncomfortably close to the edge.
-rw-r--r--src/backend/storage/lmgr/spin.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/backend/storage/lmgr/spin.c b/src/backend/storage/lmgr/spin.c
index d262efa300f..56442ed073e 100644
--- a/src/backend/storage/lmgr/spin.c
+++ b/src/backend/storage/lmgr/spin.c
@@ -23,6 +23,7 @@
#include "postgres.h"
#include "miscadmin.h"
+#include "replication/walsender.h"
#include "storage/lwlock.h"
#include "storage/spin.h"
@@ -50,14 +51,21 @@ SpinlockSemas(void)
int
SpinlockSemas(void)
{
+ int nsemas;
+
/*
* It would be cleaner to distribute this logic into the affected modules,
* similar to the way shmem space estimation is handled.
*
- * For now, though, we just need a few spinlocks (10 should be plenty)
- * plus one for each LWLock and one for each buffer header.
+ * For now, though, there are few enough users of spinlocks that we just
+ * keep the knowledge here.
*/
- return NumLWLocks() + NBuffers + 10;
+ nsemas = NumLWLocks(); /* one for each lwlock */
+ nsemas += NBuffers; /* one for each buffer header */
+ nsemas += max_wal_senders; /* one for each wal sender process */
+ nsemas += 30; /* plus a bunch for other small-scale use */
+
+ return nsemas;
}
/*