summaryrefslogtreecommitdiff
path: root/src
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:38:34 +0300
commiteb1656b813435127f06df57f2202d2abc387ee88 (patch)
treea92ed59011c2a842db179e3c33e3db7a64f625d9 /src
parenta941e89a385c16d5b22f90ad61a103001e2a9faf (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.
Diffstat (limited to 'src')
-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 c729bb7c91a..e9f740c52a8 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;
}
/*