From e1ee0a536b38540ff2251277b424590f5c392c9a Mon Sep 17 00:00:00 2001 From: Kuntal Ghosh 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