From dfbba2c86cc8f09cf3ffca3d305b4ce54a7fb49a Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Wed, 2 Jan 2013 14:39:11 -0300
Subject: [PATCH] Make sure MaxBackends is always set

Auxiliary and bootstrap processes weren't getting it, causing initdb to
fail completely.
---
 src/backend/postmaster/postmaster.c |  8 ++------
 src/backend/utils/init/postinit.c   | 22 ++++++++++++++++++++++
 src/include/miscadmin.h             |  1 +
 3 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index fa5aeed31d..15c2320461 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -899,13 +899,9 @@ PostmasterMain(int argc, char *argv[])
 
 	/*
 	 * 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 +
-		GetNumShmemAttachedBgworkers();
-	/* internal error because the values were all checked previously */
-	if (MaxBackends > MAX_BACKENDS)
-		elog(ERROR, "too many backends configured");
+	InitializeMaxBackends();
 
 	/*
 	 * Establish input sockets.
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 0fbf65f734..3948eac039 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.
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index 2fb7be48ad..99858a765f 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -394,6 +394,7 @@ extern AuxProcType MyAuxProcType;
 
 /* in utils/init/postinit.c */
 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,
 			 char *out_dbname);
 extern void BaseInit(void);
-- 
2.40.0