aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2020-07-30 17:25:48 +1200
committerThomas Munro <tmunro@postgresql.org>2020-07-30 17:44:28 +1200
commite7591fd3cae6c64236ef29d3c87e69b96608a19b (patch)
tree0db0ae04cd129de5682c0765e833567445dc1b7f /src
parente2d394df5df28ab5ee4bfac6b13837e99e24045d (diff)
downloadpostgresql-e7591fd3cae6c64236ef29d3c87e69b96608a19b.tar.gz
postgresql-e7591fd3cae6c64236ef29d3c87e69b96608a19b.zip
Introduce a WaitEventSet for the stats collector.
This avoids avoids some epoll/kqueue system calls for every wait. Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Discussion: https://postgr.es/m/CA%2BhUKGJAC4Oqao%3DqforhNey20J8CiG2R%3DoBPqvfR0vOJrFysGw%40mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/postmaster/pgstat.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 88992c2da2c..15f92b66c6b 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -4458,6 +4458,8 @@ PgstatCollectorMain(int argc, char *argv[])
int len;
PgStat_Msg msg;
int wr;
+ WaitEvent event;
+ WaitEventSet *wes;
/*
* Ignore all signals usually bound to some action in the postmaster,
@@ -4485,6 +4487,12 @@ PgstatCollectorMain(int argc, char *argv[])
pgStatRunningInCollector = true;
pgStatDBHash = pgstat_read_statsfiles(InvalidOid, true, true);
+ /* Prepare to wait for our latch or data in our socket. */
+ wes = CreateWaitEventSet(CurrentMemoryContext, 3);
+ AddWaitEventToSet(wes, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL);
+ AddWaitEventToSet(wes, WL_POSTMASTER_DEATH, PGINVALID_SOCKET, NULL, NULL);
+ AddWaitEventToSet(wes, WL_SOCKET_READABLE, pgStatSock, NULL, NULL);
+
/*
* Loop to process messages until we get SIGQUIT or detect ungraceful
* death of our parent postmaster.
@@ -4672,10 +4680,7 @@ PgstatCollectorMain(int argc, char *argv[])
/* Sleep until there's something to do */
#ifndef WIN32
- wr = WaitLatchOrSocket(MyLatch,
- WL_LATCH_SET | WL_POSTMASTER_DEATH | WL_SOCKET_READABLE,
- pgStatSock, -1L,
- WAIT_EVENT_PGSTAT_MAIN);
+ wr = WaitEventSetWait(wes, -1L, &event, 1, WAIT_EVENT_PGSTAT_MAIN);
#else
/*
@@ -4688,18 +4693,15 @@ PgstatCollectorMain(int argc, char *argv[])
* to not provoke "using stale statistics" complaints from
* backend_read_statsfile.
*/
- wr = WaitLatchOrSocket(MyLatch,
- WL_LATCH_SET | WL_POSTMASTER_DEATH | WL_SOCKET_READABLE | WL_TIMEOUT,
- pgStatSock,
- 2 * 1000L /* msec */ ,
- WAIT_EVENT_PGSTAT_MAIN);
+ wr = WaitEventSetWait(wes, 2 * 1000L /* msec */ , &event, 1,
+ WAIT_EVENT_PGSTAT_MAIN);
#endif
/*
* Emergency bailout if postmaster has died. This is to avoid the
* necessity for manual cleanup of all postmaster children.
*/
- if (wr & WL_POSTMASTER_DEATH)
+ if (wr == 1 && event.events == WL_POSTMASTER_DEATH)
break;
} /* end of outer loop */
@@ -4708,6 +4710,8 @@ PgstatCollectorMain(int argc, char *argv[])
*/
pgstat_write_statsfiles(true, true);
+ FreeWaitEventSet(wes);
+
exit(0);
}