From 38e5f2d2b7bce2f3f0e19b1acc6621b0ed72a544 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 2 Apr 2021 16:31:42 -0700
Subject: [PATCH v60 04/17] pgstat: Ensure pgstat_initialize() is called before
 reporting stats.

---
 src/backend/postmaster/autovacuum.c |  4 ++++
 src/backend/postmaster/bgworker.c   |  7 +++++++
 src/backend/utils/init/postinit.c   | 11 +++++++----
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 23ef23c13eb..87b265c1c41 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -1690,7 +1690,11 @@ AutoVacWorkerMain(int argc, char *argv[])
 		 * autovac from getting "stuck" repeatedly selecting an unopenable
 		 * database, rather than making any progress on stuff it can connect
 		 * to.
+		 *
+		 * For that to work we need to start the stats subsystem earlier than
+		 * normal...
 		 */
+		pgstat_initialize();
 		pgstat_report_autovac(dbid);
 
 		/*
diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c
index bbbc09b0b5c..5fb6a4d467c 100644
--- a/src/backend/postmaster/bgworker.c
+++ b/src/backend/postmaster/bgworker.c
@@ -843,6 +843,13 @@ StartBackgroundWorker(void)
 #ifndef EXEC_BACKEND
 		InitProcess();
 #endif
+
+		/*
+		 * Initialize before bgworkers get to register their own shutdown
+		 * callbacks. This is needed so that the pgstat shutdown callback gets
+		 * called after the shutdown callbacks in bgworkers.
+		 */
+		pgstat_initialize();
 	}
 
 	/*
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 07f69e1f2db..02df088a256 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -629,6 +629,13 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
 	 */
 	InitBufferPoolBackend();
 
+	/*
+	 * Initialize stats collection --- must happen before first xact. The
+	 * autovac launcher already has done so.
+	 */
+	if (!IsAutoVacuumWorkerProcess() && !IsBackgroundWorker)
+		pgstat_initialize();
+
 	/*
 	 * Initialize local process's access to XLOG.
 	 */
@@ -681,10 +688,6 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
 	/* Initialize portal manager */
 	EnablePortalManager();
 
-	/* Initialize stats collection --- must happen before first xact */
-	if (!bootstrap)
-		pgstat_initialize();
-
 	/* Initialize status reporting */
 	if (!bootstrap)
 		pgstat_beinit();
-- 
2.31.0.121.g9198c13e34

