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.
This commit is contained in:
Heikki Linnakangas 2013-04-04 16:31:44 +03:00
parent f7b0006f42
commit b8ed4cc962
1 changed files with 11 additions and 3 deletions

View File

@ -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;
}
/*