Commit dfbba2c8 authored by Alvaro Herrera's avatar Alvaro Herrera

Make sure MaxBackends is always set

Auxiliary and bootstrap processes weren't getting it, causing initdb to
fail completely.
parent cdbc0ca4
...@@ -899,13 +899,9 @@ PostmasterMain(int argc, char *argv[]) ...@@ -899,13 +899,9 @@ PostmasterMain(int argc, char *argv[])
/* /*
* Now that loadable modules have had their chance to register background * Now that loadable modules have had their chance to register background
* workers, calculate MaxBackends. Add one for the autovacuum launcher. * workers, calculate MaxBackends.
*/ */
MaxBackends = MaxConnections + autovacuum_max_workers + 1 + InitializeMaxBackends();
GetNumShmemAttachedBgworkers();
/* internal error because the values were all checked previously */
if (MaxBackends > MAX_BACKENDS)
elog(ERROR, "too many backends configured");
/* /*
* Establish input sockets. * Establish input sockets.
......
...@@ -421,6 +421,26 @@ pg_split_opts(char **argv, int *argcp, char *optstr) ...@@ -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). * Early initialization of a backend (either standalone or under postmaster).
...@@ -433,6 +453,8 @@ pg_split_opts(char **argv, int *argcp, char *optstr) ...@@ -433,6 +453,8 @@ pg_split_opts(char **argv, int *argcp, char *optstr)
void void
BaseInit(void) BaseInit(void)
{ {
InitializeMaxBackends();
/* /*
* Attach to shared memory and semaphores, and initialize our * Attach to shared memory and semaphores, and initialize our
* input/output/debugging file descriptors. * input/output/debugging file descriptors.
......
...@@ -394,6 +394,7 @@ extern AuxProcType MyAuxProcType; ...@@ -394,6 +394,7 @@ extern AuxProcType MyAuxProcType;
/* in utils/init/postinit.c */ /* in utils/init/postinit.c */
extern void pg_split_opts(char **argv, int *argcp, char *optstr); extern void pg_split_opts(char **argv, int *argcp, char *optstr);
extern void InitializeMaxBackends(void);
extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username, extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username,
char *out_dbname); char *out_dbname);
extern void BaseInit(void); extern void BaseInit(void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment