Skip to content
Snippets Groups Projects
Commit dfbba2c8 authored by Alvaro Herrera's avatar Alvaro Herrera
Browse files

Make sure MaxBackends is always set

Auxiliary and bootstrap processes weren't getting it, causing initdb to
fail completely.
parent cdbc0ca4
Branches
Tags
No related merge requests found
...@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment