postgres.git / summary / log / commit / refs

commit    b8ed4cc9627de437e5eafdb81631a0d0f063abb3
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Thu Apr 04 13:31:44 2013 +0000
First released in: 9.3.0, 9.0.14, 9.1.10, 9.2.5

    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.


src/backend/storage/lmgr/spin.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/backend/storage/lmgr/spin.c b/src/backend/storage/lmgr/spin.c index 8dd1c6b8a8f..3d7a8f36a9c 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; } /* [parent: f7b0006f4291]