Introduce a WaitEventSet for the stats collector.
authorThomas Munro <tmunro@postgresql.org>
Thu, 30 Jul 2020 05:25:48 +0000 (17:25 +1200)
committerThomas Munro <tmunro@postgresql.org>
Thu, 30 Jul 2020 05:44:28 +0000 (17:44 +1200)
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

src/backend/postmaster/pgstat.c

index 88992c2da2c849166a3dee498a963245ddf7538a..15f92b66c6ba42f59db5f56383e06d7aa11da78b 100644 (file)
@@ -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);
 }