From e1ee0a536b38540ff2251277b424590f5c392c9a Mon Sep 17 00:00:00 2001
From: Kuntal Ghosh <kuntal.ghosh@enterprisedb.com>
Date: Wed, 15 Feb 2017 16:26:20 +0530
Subject: [PATCH] Expose stats for auxiliary processes in pg_stat_get_activity

---
 src/backend/bootstrap/bootstrap.c     |  3 +++
 src/backend/postmaster/bgwriter.c     |  6 ++++++
 src/backend/postmaster/checkpointer.c |  7 +++++++
 src/backend/postmaster/pgstat.c       |  3 ++-
 src/backend/postmaster/walwriter.c    |  7 +++++++
 src/backend/replication/walreceiver.c | 14 ++++++++++++++
 src/backend/replication/walsender.c   |  7 +++++++
 7 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 6511c60..f56e229 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -387,6 +387,9 @@ AuxiliaryProcessMain(int argc, char *argv[])
 		/* finish setting up bufmgr.c */
 		InitBufferPoolBackend();
 
+		/* Initialize stats collection */
+		pgstat_initialize();
+
 		/* register a before-shutdown callback for LWLock cleanup */
 		before_shmem_exit(ShutdownAuxiliaryProcess, 0);
 	}
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c
index dcb4cf2..1e8bbc3 100644
--- a/src/backend/postmaster/bgwriter.c
+++ b/src/backend/postmaster/bgwriter.c
@@ -248,6 +248,9 @@ BackgroundWriterMain(void)
 	 */
 	prev_hibernate = false;
 
+	/* report writer process in the PgBackendStatus array */
+	pgstat_procstart();
+
 	/*
 	 * Loop forever
 	 */
@@ -284,6 +287,7 @@ BackgroundWriterMain(void)
 		 * Send off activity statistics to the stats collector
 		 */
 		pgstat_send_bgwriter();
+		pgstat_report_activity(STATE_RUNNING, NULL);
 
 		if (FirstCallSinceLastCheckpoint())
 		{
@@ -345,6 +349,8 @@ BackgroundWriterMain(void)
 		 * down with latch events that are likely to happen frequently during
 		 * normal operation.
 		 */
+		pgstat_report_activity(STATE_IDLE, NULL);
+
 		rc = WaitLatch(MyLatch,
 					   WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
 					   BgWriterDelay /* ms */, WAIT_EVENT_BGWRITER_MAIN);
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index fe9041f..62a3f7c 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -345,6 +345,9 @@ CheckpointerMain(void)
 	 */
 	ProcGlobal->checkpointerLatch = &MyProc->procLatch;
 
+	/* report checkpointer proc in the PgBackendStatus array */
+	pgstat_procstart();
+
 	/*
 	 * Loop forever
 	 */
@@ -365,6 +368,8 @@ CheckpointerMain(void)
 		 */
 		AbsorbFsyncRequests();
 
+		pgstat_report_activity(STATE_RUNNING, NULL);
+
 		if (got_SIGHUP)
 		{
 			got_SIGHUP = false;
@@ -556,6 +561,8 @@ CheckpointerMain(void)
 			cur_timeout = Min(cur_timeout, XLogArchiveTimeout - elapsed_secs);
 		}
 
+		pgstat_report_activity(STATE_IDLE, NULL);
+
 		rc = WaitLatch(MyLatch,
 					   WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
 					   cur_timeout * 1000L /* convert to ms */,
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index a530c3b..166c351 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -2744,7 +2744,8 @@ pgstat_initialize(void)
  * pgstat_procstart() -
  *
  *	Initialize this process's entry in the PgBackendStatus array.
- *	Called from InitPostgres.
+ *	Called from InitPostgres and other main entrypoints for
+ *	auxiliary processes.
  *
  *	For a backend process, MyDatabaseId, session userid,
  *	and application_name must be set (hence, this cannot be combined
diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c
index a575d8f..dfb641b 100644
--- a/src/backend/postmaster/walwriter.c
+++ b/src/backend/postmaster/walwriter.c
@@ -231,6 +231,9 @@ WalWriterMain(void)
 	 */
 	ProcGlobal->walwriterLatch = &MyProc->procLatch;
 
+	/* report walwriter proc in the PgBackendStatus array */
+	pgstat_procstart();
+
 	/*
 	 * Loop forever
 	 */
@@ -257,6 +260,8 @@ WalWriterMain(void)
 		/* Clear any already-pending wakeups */
 		ResetLatch(MyLatch);
 
+		pgstat_report_activity(STATE_RUNNING, NULL);
+
 		/*
 		 * Process any requests or signals received recently.
 		 */
@@ -290,6 +295,8 @@ WalWriterMain(void)
 		else
 			cur_timeout = WalWriterDelay * HIBERNATE_FACTOR;
 
+		pgstat_report_activity(STATE_IDLE, NULL);
+
 		rc = WaitLatch(MyLatch,
 					   WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
 					   cur_timeout,
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index 18d9d7e..9232790 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -316,6 +316,10 @@ WalReceiverMain(void)
 	SpinLockRelease(&walrcv->mutex);
 
 	first_stream = true;
+
+	/* report walreceiver proc in the PgBackendStatus array */
+	pgstat_procstart();
+
 	for (;;)
 	{
 		char	   *primary_sysid;
@@ -323,6 +327,8 @@ WalReceiverMain(void)
 		int			server_version;
 		WalRcvStreamOptions options;
 
+		pgstat_report_activity(STATE_RUNNING, NULL);
+
 		/*
 		 * Check that we're connected to a valid server using the
 		 * IDENTIFY_SYSTEM replication command.
@@ -423,6 +429,8 @@ WalReceiverMain(void)
 				/* Process any requests or signals received recently */
 				ProcessWalRcvInterrupts();
 
+				pgstat_report_activity(STATE_RUNNING, NULL);
+
 				if (got_SIGHUP)
 				{
 					got_SIGHUP = false;
@@ -491,6 +499,8 @@ WalReceiverMain(void)
 				 * could add and remove just the socket each time, potentially
 				 * avoiding some system calls.
 				 */
+				pgstat_report_activity(STATE_IDLE, NULL);
+
 				Assert(wait_fd != PGINVALID_SOCKET);
 				rc = WaitLatchOrSocket(walrcv->latch,
 								   WL_POSTMASTER_DEATH | WL_SOCKET_READABLE |
@@ -663,6 +673,8 @@ WalRcvWaitForStartPosition(XLogRecPtr *startpoint, TimeLineID *startpointTLI)
 	{
 		ResetLatch(walrcv->latch);
 
+		pgstat_report_activity(STATE_RUNNING, NULL);
+
 		/*
 		 * Emergency bailout if postmaster has died.  This is to avoid the
 		 * necessity for manual cleanup of all postmaster children.
@@ -696,6 +708,8 @@ WalRcvWaitForStartPosition(XLogRecPtr *startpoint, TimeLineID *startpointTLI)
 		}
 		SpinLockRelease(&walrcv->mutex);
 
+		pgstat_report_activity(STATE_IDLE, NULL);
+
 		WaitLatch(walrcv->latch, WL_LATCH_SET | WL_POSTMASTER_DEATH, 0,
 				  WAIT_EVENT_WAL_RECEIVER_WAIT_START);
 	}
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index dd3a936..8204e1c 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -244,6 +244,9 @@ InitWalSender(void)
 	 */
 	MarkPostmasterChildWalSender();
 	SendPostmasterSignal(PMSIGNAL_ADVANCE_STATE_MACHINE);
+
+	/* report walsender proc in the PgBackendStatus array */
+	pgstat_procstart();
 }
 
 /*
@@ -1778,6 +1781,8 @@ WalSndLoop(WalSndSendDataCallback send_data)
 
 		CHECK_FOR_INTERRUPTS();
 
+		pgstat_report_activity(STATE_RUNNING, NULL);
+
 		/* Process any requests or signals received recently */
 		if (got_SIGHUP)
 		{
@@ -1872,6 +1877,8 @@ WalSndLoop(WalSndSendDataCallback send_data)
 				wakeEvents |= WL_SOCKET_WRITEABLE;
 
 			/* Sleep until something happens or we time out */
+			pgstat_report_activity(STATE_IDLE, NULL);
+
 			WaitLatchOrSocket(MyLatch, wakeEvents,
 							  MyProcPort->sock, sleeptime,
 							  WAIT_EVENT_WAL_SENDER_MAIN);
-- 
1.8.3.1

