From dfbba2c86cc8f09cf3ffca3d305b4ce54a7fb49a Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 2 Jan 2013 14:39:11 -0300 Subject: Make sure MaxBackends is always set Auxiliary and bootstrap processes weren't getting it, causing initdb to fail completely. --- src/backend/utils/init/postinit.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/backend/utils/init/postinit.c') diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 0fbf65f7340..3948eac039b 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -421,6 +421,26 @@ pg_split_opts(char **argv, int *argcp, char *optstr) } } +/* + * Initialize MaxBackends value from config options. + * + * This must be called after modules have had the chance to register background + * workers in shared_preload_libraries, and before shared memory size is + * determined. + */ +void +InitializeMaxBackends(void) +{ + Assert(MaxBackends == 0); + + /* the extra unit accounts for the autovacuum launcher */ + MaxBackends = MaxConnections + autovacuum_max_workers + 1 + + GetNumShmemAttachedBgworkers(); + + /* internal error because the values were all checked previously */ + if (MaxBackends > MAX_BACKENDS) + elog(ERROR, "too many backends configured"); +} /* * Early initialization of a backend (either standalone or under postmaster). @@ -433,6 +453,8 @@ pg_split_opts(char **argv, int *argcp, char *optstr) void BaseInit(void) { + InitializeMaxBackends(); + /* * Attach to shared memory and semaphores, and initialize our * input/output/debugging file descriptors. -- cgit v1.2.3