Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Calculate # of semaphores correctly with --disable-spinlocks.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 4 Apr 2013 13:31:44 +0000 (16:31 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 4 Apr 2013 13:40:37 +0000 (16:40 +0300)
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

index 8dd1c6b8a8fd1295a18b71c67274acb237cddd1b..3d7a8f36a9c4481cd53515007b943461fe4cbb25 100644 (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;
 }
 
 /*