Refactor some code related to wait events "BufferPin" and "Extension"
authorMichael Paquier <michael@paquier.xyz>
Mon, 3 Jul 2023 02:01:02 +0000 (11:01 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 3 Jul 2023 02:01:02 +0000 (11:01 +0900)
The following changes are done:
- Addition of WaitEventBufferPin and WaitEventExtension, that hold a
list of wait events related to each category.
- Addition of two functions that encapsulate the list of wait events for
each category.
- Rename BUFFER_PIN to BUFFERPIN (only this wait event class used an
underscore, requiring a specific rule in the automation script).

These changes make a bit easier the automatic generation of all the code
and documentation related to wait events, as all the wait event
categories are now controlled by consistent structures and functions.

Author: Bertrand Drouvot
Discussion: https://postgr.es/m/c6f35117-4b20-4c78-1df5-d3056010dcf5@gmail.com
Discussion: https://postgr.es/m/77a86b3a-c4a8-5f5d-69b9-d70bbf2e9b98@gmail.com

contrib/dblink/dblink.c
contrib/pg_prewarm/autoprewarm.c
contrib/postgres_fdw/connection.c
src/backend/storage/buffer/bufmgr.c
src/backend/storage/ipc/standby.c
src/backend/utils/activity/wait_event.c
src/include/utils/wait_event.h
src/test/modules/test_shm_mq/setup.c
src/test/modules/test_shm_mq/test.c
src/test/modules/worker_spi/worker_spi.c
src/tools/pgindent/typedefs.list

index 1ff65d1e521187dc17fbf63ca84c958245bf3ef1..41e1f6c91d6aebe6f858b4c0045446d81c49cb8f 100644 (file)
@@ -203,7 +203,7 @@ dblink_get_conn(char *conname_or_str,
                dblink_connstr_check(connstr);
 
                /* OK to make connection */
-               conn = libpqsrv_connect(connstr, PG_WAIT_EXTENSION);
+               conn = libpqsrv_connect(connstr, WAIT_EVENT_EXTENSION);
 
                if (PQstatus(conn) == CONNECTION_BAD)
                {
@@ -293,7 +293,7 @@ dblink_connect(PG_FUNCTION_ARGS)
        dblink_connstr_check(connstr);
 
        /* OK to make connection */
-       conn = libpqsrv_connect(connstr, PG_WAIT_EXTENSION);
+       conn = libpqsrv_connect(connstr, WAIT_EVENT_EXTENSION);
 
        if (PQstatus(conn) == CONNECTION_BAD)
        {
index 93835449c0ec973fd58983c5e0e901932cf6915f..d0efc9e52490397e826117788c04581e6beb2d33 100644 (file)
@@ -237,7 +237,7 @@ autoprewarm_main(Datum main_arg)
                        (void) WaitLatch(MyLatch,
                                                         WL_LATCH_SET | WL_EXIT_ON_PM_DEATH,
                                                         -1L,
-                                                        PG_WAIT_EXTENSION);
+                                                        WAIT_EVENT_EXTENSION);
                }
                else
                {
@@ -264,7 +264,7 @@ autoprewarm_main(Datum main_arg)
                        (void) WaitLatch(MyLatch,
                                                         WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
                                                         delay_in_ms,
-                                                        PG_WAIT_EXTENSION);
+                                                        WAIT_EVENT_EXTENSION);
                }
 
                /* Reset the latch, loop. */
index f839308b4003059a94d9b7eed5ce1b335e30800f..7e12b722ec9cb121b7571ec71dd7a6c5cb834c41 100644 (file)
@@ -530,7 +530,7 @@ connect_pg_server(ForeignServer *server, UserMapping *user)
                /* OK to make connection */
                conn = libpqsrv_connect_params(keywords, values,
                                                                           false,       /* expand_dbname */
-                                                                          PG_WAIT_EXTENSION);
+                                                                          WAIT_EVENT_EXTENSION);
 
                if (!conn || PQstatus(conn) != CONNECTION_OK)
                        ereport(ERROR,
@@ -863,7 +863,7 @@ pgfdw_get_result(PGconn *conn, const char *query)
                                                                           WL_LATCH_SET | WL_SOCKET_READABLE |
                                                                           WL_EXIT_ON_PM_DEATH,
                                                                           PQsocket(conn),
-                                                                          -1L, PG_WAIT_EXTENSION);
+                                                                          -1L, WAIT_EVENT_EXTENSION);
                                ResetLatch(MyLatch);
 
                                CHECK_FOR_INTERRUPTS();
@@ -1567,7 +1567,7 @@ pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result,
                                                                           WL_LATCH_SET | WL_SOCKET_READABLE |
                                                                           WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
                                                                           PQsocket(conn),
-                                                                          cur_timeout, PG_WAIT_EXTENSION);
+                                                                          cur_timeout, WAIT_EVENT_EXTENSION);
                                ResetLatch(MyLatch);
 
                                CHECK_FOR_INTERRUPTS();
index 3c59bbd04ea702cbe62fa0bbb892fbbd18cc5937..a7e3b9bb1d3cf1d09624fc71e02b79ef73269c31 100644 (file)
@@ -4901,7 +4901,7 @@ LockBufferForCleanup(Buffer buffer)
                        SetStartupBufferPinWaitBufId(-1);
                }
                else
-                       ProcWaitForSignal(PG_WAIT_BUFFER_PIN);
+                       ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN);
 
                /*
                 * Remove flag marking us as waiter. Normally this will not be set
index 4c06741a69fd9ce4037af6fdb3efc3cc9d098f54..cc22d2e87cc88d92eed011a7a2ebd0c9ddd57a77 100644 (file)
@@ -840,7 +840,7 @@ ResolveRecoveryConflictWithBufferPin(void)
         * SIGHUP signal handler, etc cannot do that because it uses the different
         * latch from that ProcWaitForSignal() waits on.
         */
-       ProcWaitForSignal(PG_WAIT_BUFFER_PIN);
+       ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN);
 
        if (got_standby_delay_timeout)
                SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN);
index 7940d646392b3625aedbc8ec3729d291cec0f677..8572cf169ea0bf56d6619df323ac5291ebb310f0 100644 (file)
@@ -28,7 +28,9 @@
 
 
 static const char *pgstat_get_wait_activity(WaitEventActivity w);
+static const char *pgstat_get_wait_bufferpin(WaitEventBufferPin w);
 static const char *pgstat_get_wait_client(WaitEventClient w);
+static const char *pgstat_get_wait_extension(WaitEventExtension w);
 static const char *pgstat_get_wait_ipc(WaitEventIPC w);
 static const char *pgstat_get_wait_timeout(WaitEventTimeout w);
 static const char *pgstat_get_wait_io(WaitEventIO w);
@@ -90,7 +92,7 @@ pgstat_get_wait_event_type(uint32 wait_event_info)
                case PG_WAIT_LOCK:
                        event_type = "Lock";
                        break;
-               case PG_WAIT_BUFFER_PIN:
+               case PG_WAIT_BUFFERPIN:
                        event_type = "BufferPin";
                        break;
                case PG_WAIT_ACTIVITY:
@@ -147,9 +149,13 @@ pgstat_get_wait_event(uint32 wait_event_info)
                case PG_WAIT_LOCK:
                        event_name = GetLockNameFromTagType(eventId);
                        break;
-               case PG_WAIT_BUFFER_PIN:
-                       event_name = "BufferPin";
-                       break;
+               case PG_WAIT_BUFFERPIN:
+                       {
+                               WaitEventBufferPin w = (WaitEventBufferPin) wait_event_info;
+
+                               event_name = pgstat_get_wait_bufferpin(w);
+                               break;
+                       }
                case PG_WAIT_ACTIVITY:
                        {
                                WaitEventActivity w = (WaitEventActivity) wait_event_info;
@@ -165,8 +171,12 @@ pgstat_get_wait_event(uint32 wait_event_info)
                                break;
                        }
                case PG_WAIT_EXTENSION:
-                       event_name = "Extension";
-                       break;
+                       {
+                               WaitEventExtension w = (WaitEventExtension) wait_event_info;
+
+                               event_name = pgstat_get_wait_extension(w);
+                               break;
+                       }
                case PG_WAIT_IPC:
                        {
                                WaitEventIPC w = (WaitEventIPC) wait_event_info;
@@ -254,6 +264,28 @@ pgstat_get_wait_activity(WaitEventActivity w)
        return event_name;
 }
 
+/* ----------
+ * pgstat_get_wait_bufferpin() -
+ *
+ * Convert WaitEventBufferPin to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_bufferpin(WaitEventBufferPin w)
+{
+       const char *event_name = "unknown wait event";
+
+       switch (w)
+       {
+               case WAIT_EVENT_BUFFER_PIN:
+                       event_name = "BufferPin";
+                       break;
+                       /* no default case, so that compiler will warn */
+       }
+
+       return event_name;
+}
+
 /* ----------
  * pgstat_get_wait_client() -
  *
@@ -297,6 +329,28 @@ pgstat_get_wait_client(WaitEventClient w)
        return event_name;
 }
 
+/* ----------
+ * pgstat_get_wait_extension() -
+ *
+ * Convert WaitEventExtension to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_extension(WaitEventExtension w)
+{
+       const char *event_name = "unknown wait event";
+
+       switch (w)
+       {
+               case WAIT_EVENT_EXTENSION:
+                       event_name = "Extension";
+                       break;
+                       /* no default case, so that compiler will warn */
+       }
+
+       return event_name;
+}
+
 /* ----------
  * pgstat_get_wait_ipc() -
  *
index 518d3b0a1f768ef87e7ac1577248769f5236d7e1..dc01d4e84dfa9e07aa7197e7d99046c59eaf3b88 100644 (file)
@@ -17,7 +17,7 @@
  */
 #define PG_WAIT_LWLOCK                         0x01000000U
 #define PG_WAIT_LOCK                           0x03000000U
-#define PG_WAIT_BUFFER_PIN                     0x04000000U
+#define PG_WAIT_BUFFERPIN                      0x04000000U
 #define PG_WAIT_ACTIVITY                       0x05000000U
 #define PG_WAIT_CLIENT                         0x06000000U
 #define PG_WAIT_EXTENSION                      0x07000000U
@@ -50,6 +50,15 @@ typedef enum
        WAIT_EVENT_WAL_WRITER_MAIN
 } WaitEventActivity;
 
+/* ----------
+ * Wait Events - BUFFERPIN
+ * ----------
+ */
+typedef enum
+{
+       WAIT_EVENT_BUFFER_PIN = PG_WAIT_BUFFERPIN
+} WaitEventBufferPin;
+
 /* ----------
  * Wait Events - Client
  *
@@ -70,6 +79,15 @@ typedef enum
        WAIT_EVENT_WAL_SENDER_WRITE_DATA,
 } WaitEventClient;
 
+/* ----------
+ * Wait Events - EXTENSION
+ * ----------
+ */
+typedef enum
+{
+       WAIT_EVENT_EXTENSION = PG_WAIT_EXTENSION
+} WaitEventExtension;
+
 /* ----------
  * Wait Events - IPC
  *
index bec5732e8738dfb15d96517f641997843d134c3d..192e5cc2ab40aae87f075554bdc78143fbed661b 100644 (file)
@@ -280,7 +280,7 @@ wait_for_workers_to_become_ready(worker_state *wstate,
 
                /* Wait to be signaled. */
                (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0,
-                                                PG_WAIT_EXTENSION);
+                                                WAIT_EVENT_EXTENSION);
 
                /* Reset the latch so we don't spin. */
                ResetLatch(MyLatch);
index 906e943e2d95d9fc668789f0d356a0cbb5fb3e2d..d9be7033502889f3259a8effa655a9a9f06e493b 100644 (file)
@@ -232,7 +232,7 @@ test_shm_mq_pipelined(PG_FUNCTION_ARGS)
                         * for us to do.
                         */
                        (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0,
-                                                        PG_WAIT_EXTENSION);
+                                                        WAIT_EVENT_EXTENSION);
                        ResetLatch(MyLatch);
                        CHECK_FOR_INTERRUPTS();
                }
index ad491d772294577e4a5d9b289feb908fd30a2e2f..7227cfaa45c179ab02b6850e1e1303310d66d777 100644 (file)
@@ -199,7 +199,7 @@ worker_spi_main(Datum main_arg)
                (void) WaitLatch(MyLatch,
                                                 WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
                                                 worker_spi_naptime * 1000L,
-                                                PG_WAIT_EXTENSION);
+                                                WAIT_EVENT_EXTENSION);
                ResetLatch(MyLatch);
 
                CHECK_FOR_INTERRUPTS();
index 260854747b4a3ca333ceb2dd925d3c87cc834093..e941fb6c82f63f5b0e7371d759607c366a4ef43c 100644 (file)
@@ -2986,7 +2986,9 @@ WSANETWORKEVENTS
 WSAPROTOCOL_INFO
 WaitEvent
 WaitEventActivity
+WaitEventBufferPin
 WaitEventClient
+WaitEventExtension
 WaitEventIO
 WaitEventIPC
 WaitEventSet