aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2024-12-23 16:46:07 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2024-12-23 16:46:24 -0500
commit38da053463bef32adf563ddee5277d16d2b6c5af (patch)
tree68ed3832d2ae75a23fa19d4f6be548ef5583dd9f /src
parentda9517fb3a0979f8d75823199f7a231e0269963b (diff)
downloadpostgresql-38da053463bef32adf563ddee5277d16d2b6c5af.tar.gz
postgresql-38da053463bef32adf563ddee5277d16d2b6c5af.zip
Try to avoid semaphore-related test failures on NetBSD/OpenBSD.
These two platforms have a remarkably tight default limit on the number of SysV semaphores in the system: SEMMNS is only 60 out-of-the-box. Unless manual action is taken to raise that, we'll only be able to allocate 3 sets of 16 usable semaphores each, leading to initdb setting max_connections to just 20. That's problematic because the core regression tests expect to be able to launch 20 concurrent sessions, leaving us with no headroom. This seems to be the cause of intermittent buildfarm failures on some machines. While there's no getting around the fact that you'd better raise SEMMNS for production use on these platforms, it does seem desirable for "make check" to pass reliably without that. We can make that happen, at least for awhile longer, with two small changes: * Change sysv_sema.c's SEMAS_PER_SET to 19, so that we can eat up all of the available semas not just most of them. * Change initdb to make the smallest max_connections value it will consider be 25 not 20. As of HEAD this will leave us with four free semaphores (using the default values for other relevant parameters such as max_wal_senders). So we won't need to consider this again until we've invented five more background processes. Maybe by then we can switch both these platforms to some other semaphore API. For the moment, do this only in master; there've not been field complaints that might justify a back-patch. Discussion: https://postgr.es/m/db2773a2-aca0-43d0-99c1-060efcd9954e@gmail.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/port/sysv_sema.c8
-rw-r--r--src/bin/initdb/initdb.c2
2 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/port/sysv_sema.c b/src/backend/port/sysv_sema.c
index 5b88a92bc95..68835723b90 100644
--- a/src/backend/port/sysv_sema.c
+++ b/src/backend/port/sysv_sema.c
@@ -50,8 +50,14 @@ typedef int IpcSemaphoreId; /* semaphore ID returned by semget(2) */
* we allocate. It must be *less than* your kernel's SEMMSL (max semaphores
* per set) parameter, which is often around 25. (Less than, because we
* allocate one extra sema in each set for identification purposes.)
+ *
+ * The present value of 19 is chosen with one eye on NetBSD/OpenBSD's default
+ * SEMMNS setting of 60. Remembering the extra sema per set, this lets us
+ * allocate three sets with 57 useful semaphores before exceeding that, which
+ * is enough to run our core regression tests. Users of those systems will
+ * still want to raise SEMMNS for any sort of production work, though.
*/
-#define SEMAS_PER_SET 16
+#define SEMAS_PER_SET 19
#define IPCProtection (0600) /* access/modify by user only */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 9a91830783e..49e8efd2125 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1119,7 +1119,7 @@ test_config_settings(void)
#define MIN_BUFS_FOR_CONNS(nconns) ((nconns) * 10)
static const int trial_conns[] = {
- 100, 50, 40, 30, 20
+ 100, 50, 40, 30, 25
};
static const int trial_bufs[] = {
16384, 8192, 4096, 3584, 3072, 2560, 2048, 1536,