Refactor some code related to wait events "BufferPin" and "Extension"

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
This commit is contained in:
Michael Paquier 2023-07-03 11:01:02 +09:00
parent 8c12838001
commit 2aeaf80e57
11 changed files with 93 additions and 19 deletions

View File

@ -203,7 +203,7 @@ dblink_get_conn(char *conname_or_str,
dblink_connstr_check(connstr); dblink_connstr_check(connstr);
/* OK to make connection */ /* OK to make connection */
conn = libpqsrv_connect(connstr, PG_WAIT_EXTENSION); conn = libpqsrv_connect(connstr, WAIT_EVENT_EXTENSION);
if (PQstatus(conn) == CONNECTION_BAD) if (PQstatus(conn) == CONNECTION_BAD)
{ {
@ -293,7 +293,7 @@ dblink_connect(PG_FUNCTION_ARGS)
dblink_connstr_check(connstr); dblink_connstr_check(connstr);
/* OK to make connection */ /* OK to make connection */
conn = libpqsrv_connect(connstr, PG_WAIT_EXTENSION); conn = libpqsrv_connect(connstr, WAIT_EVENT_EXTENSION);
if (PQstatus(conn) == CONNECTION_BAD) if (PQstatus(conn) == CONNECTION_BAD)
{ {

View File

@ -237,7 +237,7 @@ autoprewarm_main(Datum main_arg)
(void) WaitLatch(MyLatch, (void) WaitLatch(MyLatch,
WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH,
-1L, -1L,
PG_WAIT_EXTENSION); WAIT_EVENT_EXTENSION);
} }
else else
{ {
@ -264,7 +264,7 @@ autoprewarm_main(Datum main_arg)
(void) WaitLatch(MyLatch, (void) WaitLatch(MyLatch,
WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
delay_in_ms, delay_in_ms,
PG_WAIT_EXTENSION); WAIT_EVENT_EXTENSION);
} }
/* Reset the latch, loop. */ /* Reset the latch, loop. */

View File

@ -530,7 +530,7 @@ connect_pg_server(ForeignServer *server, UserMapping *user)
/* OK to make connection */ /* OK to make connection */
conn = libpqsrv_connect_params(keywords, values, conn = libpqsrv_connect_params(keywords, values,
false, /* expand_dbname */ false, /* expand_dbname */
PG_WAIT_EXTENSION); WAIT_EVENT_EXTENSION);
if (!conn || PQstatus(conn) != CONNECTION_OK) if (!conn || PQstatus(conn) != CONNECTION_OK)
ereport(ERROR, ereport(ERROR,
@ -863,7 +863,7 @@ pgfdw_get_result(PGconn *conn, const char *query)
WL_LATCH_SET | WL_SOCKET_READABLE | WL_LATCH_SET | WL_SOCKET_READABLE |
WL_EXIT_ON_PM_DEATH, WL_EXIT_ON_PM_DEATH,
PQsocket(conn), PQsocket(conn),
-1L, PG_WAIT_EXTENSION); -1L, WAIT_EVENT_EXTENSION);
ResetLatch(MyLatch); ResetLatch(MyLatch);
CHECK_FOR_INTERRUPTS(); CHECK_FOR_INTERRUPTS();
@ -1567,7 +1567,7 @@ pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result,
WL_LATCH_SET | WL_SOCKET_READABLE | WL_LATCH_SET | WL_SOCKET_READABLE |
WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
PQsocket(conn), PQsocket(conn),
cur_timeout, PG_WAIT_EXTENSION); cur_timeout, WAIT_EVENT_EXTENSION);
ResetLatch(MyLatch); ResetLatch(MyLatch);
CHECK_FOR_INTERRUPTS(); CHECK_FOR_INTERRUPTS();

View File

@ -4901,7 +4901,7 @@ LockBufferForCleanup(Buffer buffer)
SetStartupBufferPinWaitBufId(-1); SetStartupBufferPinWaitBufId(-1);
} }
else else
ProcWaitForSignal(PG_WAIT_BUFFER_PIN); ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN);
/* /*
* Remove flag marking us as waiter. Normally this will not be set * Remove flag marking us as waiter. Normally this will not be set

View File

@ -840,7 +840,7 @@ ResolveRecoveryConflictWithBufferPin(void)
* SIGHUP signal handler, etc cannot do that because it uses the different * SIGHUP signal handler, etc cannot do that because it uses the different
* latch from that ProcWaitForSignal() waits on. * latch from that ProcWaitForSignal() waits on.
*/ */
ProcWaitForSignal(PG_WAIT_BUFFER_PIN); ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN);
if (got_standby_delay_timeout) if (got_standby_delay_timeout)
SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN); SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN);

View File

@ -28,7 +28,9 @@
static const char *pgstat_get_wait_activity(WaitEventActivity w); 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_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_ipc(WaitEventIPC w);
static const char *pgstat_get_wait_timeout(WaitEventTimeout w); static const char *pgstat_get_wait_timeout(WaitEventTimeout w);
static const char *pgstat_get_wait_io(WaitEventIO 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: case PG_WAIT_LOCK:
event_type = "Lock"; event_type = "Lock";
break; break;
case PG_WAIT_BUFFER_PIN: case PG_WAIT_BUFFERPIN:
event_type = "BufferPin"; event_type = "BufferPin";
break; break;
case PG_WAIT_ACTIVITY: case PG_WAIT_ACTIVITY:
@ -147,9 +149,13 @@ pgstat_get_wait_event(uint32 wait_event_info)
case PG_WAIT_LOCK: case PG_WAIT_LOCK:
event_name = GetLockNameFromTagType(eventId); event_name = GetLockNameFromTagType(eventId);
break; break;
case PG_WAIT_BUFFER_PIN: case PG_WAIT_BUFFERPIN:
event_name = "BufferPin"; {
break; WaitEventBufferPin w = (WaitEventBufferPin) wait_event_info;
event_name = pgstat_get_wait_bufferpin(w);
break;
}
case PG_WAIT_ACTIVITY: case PG_WAIT_ACTIVITY:
{ {
WaitEventActivity w = (WaitEventActivity) wait_event_info; WaitEventActivity w = (WaitEventActivity) wait_event_info;
@ -165,8 +171,12 @@ pgstat_get_wait_event(uint32 wait_event_info)
break; break;
} }
case PG_WAIT_EXTENSION: 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: case PG_WAIT_IPC:
{ {
WaitEventIPC w = (WaitEventIPC) wait_event_info; WaitEventIPC w = (WaitEventIPC) wait_event_info;
@ -254,6 +264,28 @@ pgstat_get_wait_activity(WaitEventActivity w)
return event_name; 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() - * pgstat_get_wait_client() -
* *
@ -297,6 +329,28 @@ pgstat_get_wait_client(WaitEventClient w)
return event_name; 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() - * pgstat_get_wait_ipc() -
* *

View File

@ -17,7 +17,7 @@
*/ */
#define PG_WAIT_LWLOCK 0x01000000U #define PG_WAIT_LWLOCK 0x01000000U
#define PG_WAIT_LOCK 0x03000000U #define PG_WAIT_LOCK 0x03000000U
#define PG_WAIT_BUFFER_PIN 0x04000000U #define PG_WAIT_BUFFERPIN 0x04000000U
#define PG_WAIT_ACTIVITY 0x05000000U #define PG_WAIT_ACTIVITY 0x05000000U
#define PG_WAIT_CLIENT 0x06000000U #define PG_WAIT_CLIENT 0x06000000U
#define PG_WAIT_EXTENSION 0x07000000U #define PG_WAIT_EXTENSION 0x07000000U
@ -50,6 +50,15 @@ typedef enum
WAIT_EVENT_WAL_WRITER_MAIN WAIT_EVENT_WAL_WRITER_MAIN
} WaitEventActivity; } WaitEventActivity;
/* ----------
* Wait Events - BUFFERPIN
* ----------
*/
typedef enum
{
WAIT_EVENT_BUFFER_PIN = PG_WAIT_BUFFERPIN
} WaitEventBufferPin;
/* ---------- /* ----------
* Wait Events - Client * Wait Events - Client
* *
@ -70,6 +79,15 @@ typedef enum
WAIT_EVENT_WAL_SENDER_WRITE_DATA, WAIT_EVENT_WAL_SENDER_WRITE_DATA,
} WaitEventClient; } WaitEventClient;
/* ----------
* Wait Events - EXTENSION
* ----------
*/
typedef enum
{
WAIT_EVENT_EXTENSION = PG_WAIT_EXTENSION
} WaitEventExtension;
/* ---------- /* ----------
* Wait Events - IPC * Wait Events - IPC
* *

View File

@ -280,7 +280,7 @@ wait_for_workers_to_become_ready(worker_state *wstate,
/* Wait to be signaled. */ /* Wait to be signaled. */
(void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, (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. */ /* Reset the latch so we don't spin. */
ResetLatch(MyLatch); ResetLatch(MyLatch);

View File

@ -232,7 +232,7 @@ test_shm_mq_pipelined(PG_FUNCTION_ARGS)
* for us to do. * for us to do.
*/ */
(void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0,
PG_WAIT_EXTENSION); WAIT_EVENT_EXTENSION);
ResetLatch(MyLatch); ResetLatch(MyLatch);
CHECK_FOR_INTERRUPTS(); CHECK_FOR_INTERRUPTS();
} }

View File

@ -199,7 +199,7 @@ worker_spi_main(Datum main_arg)
(void) WaitLatch(MyLatch, (void) WaitLatch(MyLatch,
WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
worker_spi_naptime * 1000L, worker_spi_naptime * 1000L,
PG_WAIT_EXTENSION); WAIT_EVENT_EXTENSION);
ResetLatch(MyLatch); ResetLatch(MyLatch);
CHECK_FOR_INTERRUPTS(); CHECK_FOR_INTERRUPTS();

View File

@ -2986,7 +2986,9 @@ WSANETWORKEVENTS
WSAPROTOCOL_INFO WSAPROTOCOL_INFO
WaitEvent WaitEvent
WaitEventActivity WaitEventActivity
WaitEventBufferPin
WaitEventClient WaitEventClient
WaitEventExtension
WaitEventIO WaitEventIO
WaitEventIPC WaitEventIPC
WaitEventSet WaitEventSet