| /*------------------------------------------------------------------------- |
| * wait_event.h |
| * Definitions related to wait event reporting |
| * |
| * Copyright (c) 2001-2023, PostgreSQL Global Development Group |
| * |
| * src/include/utils/wait_event.h |
| * ---------- |
| */ |
| #ifndef WAIT_EVENT_H |
| #define WAIT_EVENT_H |
| |
| |
| /* ---------- |
| * Wait Classes |
| * ---------- |
| */ |
| #define PG_WAIT_LWLOCK 0x01000000U |
| #define PG_WAIT_LOCK 0x03000000U |
| #define PG_WAIT_BUFFER_PIN 0x04000000U |
| #define PG_WAIT_ACTIVITY 0x05000000U |
| #define PG_WAIT_CLIENT 0x06000000U |
| #define PG_WAIT_EXTENSION 0x07000000U |
| #define PG_WAIT_IPC 0x08000000U |
| #define PG_WAIT_TIMEOUT 0x09000000U |
| #define PG_WAIT_IO 0x0A000000U |
| |
| /* GPDB additions */ |
| #define PG_WAIT_RESOURCE_GROUP 0xA0000000U |
| #define PG_WAIT_RESOURCE_QUEUE 0xA1000000U |
| #define PG_WAIT_REPLICATION 0xA2000000U |
| #define PG_WAIT_PARALLEL_RETRIEVE_CURSOR 0xA3000000U |
| |
| /* ---------- |
| * Wait Events - Activity |
| * |
| * Use this category when a process is waiting because it has no work to do, |
| * unless the "Client" or "Timeout" category describes the situation better. |
| * Typically, this should only be used for background processes. |
| * ---------- |
| */ |
| typedef enum |
| { |
| WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY, |
| WAIT_EVENT_AUTOVACUUM_MAIN, |
| WAIT_EVENT_BGWRITER_HIBERNATE, |
| WAIT_EVENT_BGWRITER_MAIN, |
| WAIT_EVENT_CHECKPOINTER_MAIN, |
| WAIT_EVENT_LOGICAL_APPLY_MAIN, |
| WAIT_EVENT_LOGICAL_LAUNCHER_MAIN, |
| WAIT_EVENT_LOGICAL_PARALLEL_APPLY_MAIN, |
| WAIT_EVENT_RECOVERY_WAL_STREAM, |
| WAIT_EVENT_SYSLOGGER_MAIN, |
| WAIT_EVENT_WAL_RECEIVER_MAIN, |
| WAIT_EVENT_WAL_SENDER_MAIN, |
| WAIT_EVENT_WAL_WRITER_MAIN |
| /* GPDB additions */ |
| , |
| WAIT_EVENT_BACKOFF_MAIN, |
| #ifdef USE_INTERNAL_FTS |
| WAIT_EVENT_FTS_PROBE_MAIN, |
| #endif |
| WAIT_EVENT_LOGIN_MONITOR_LAUNCHER_MAIN, |
| WAIT_EVENT_GLOBAL_DEADLOCK_DETECTOR_MAIN |
| } WaitEventActivity; |
| |
| /* ---------- |
| * Wait Events - Client |
| * |
| * Use this category when a process is waiting to send data to or receive data |
| * from the frontend process to which it is connected. This is never used for |
| * a background process, which has no client connection. |
| * ---------- |
| */ |
| typedef enum |
| { |
| WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT, |
| WAIT_EVENT_CLIENT_WRITE, |
| WAIT_EVENT_GSS_OPEN_SERVER, |
| WAIT_EVENT_LIBPQWALRECEIVER_CONNECT, |
| WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE, |
| WAIT_EVENT_SSL_OPEN_SERVER, |
| WAIT_EVENT_WAL_SENDER_WAIT_WAL, |
| WAIT_EVENT_WAL_SENDER_WRITE_DATA, |
| } WaitEventClient; |
| |
| /* ---------- |
| * Wait Events - IPC |
| * |
| * Use this category when a process cannot complete the work it is doing because |
| * it is waiting for a notification from another process. |
| * ---------- |
| */ |
| typedef enum |
| { |
| WAIT_EVENT_APPEND_READY = PG_WAIT_IPC, |
| WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND, |
| WAIT_EVENT_ARCHIVE_COMMAND, |
| WAIT_EVENT_BACKEND_TERMINATION, |
| WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE, |
| WAIT_EVENT_BGWORKER_SHUTDOWN, |
| WAIT_EVENT_BGWORKER_STARTUP, |
| WAIT_EVENT_BTREE_PAGE, |
| WAIT_EVENT_BUFFER_IO, |
| WAIT_EVENT_CHECKPOINT_DONE, |
| WAIT_EVENT_CHECKPOINT_START, |
| WAIT_EVENT_EXECUTE_GATHER, |
| WAIT_EVENT_HASH_BATCH_ALLOCATE, |
| WAIT_EVENT_HASH_BATCH_ELECT, |
| WAIT_EVENT_HASH_BATCH_LOAD, |
| WAIT_EVENT_HASH_BUILD_ALLOCATE, |
| WAIT_EVENT_HASH_BUILD_ELECT, |
| WAIT_EVENT_HASH_BUILD_HASH_INNER, |
| WAIT_EVENT_HASH_BUILD_HASH_OUTER, |
| WAIT_EVENT_HASH_GROW_BATCHES_DECIDE, |
| WAIT_EVENT_HASH_GROW_BATCHES_ELECT, |
| WAIT_EVENT_HASH_GROW_BATCHES_FINISH, |
| WAIT_EVENT_HASH_GROW_BATCHES_REALLOCATE, |
| WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION, |
| WAIT_EVENT_HASH_GROW_BUCKETS_ELECT, |
| WAIT_EVENT_HASH_GROW_BUCKETS_REALLOCATE, |
| WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT, |
| WAIT_EVENT_LOGICAL_APPLY_SEND_DATA, |
| WAIT_EVENT_LOGICAL_PARALLEL_APPLY_STATE_CHANGE, |
| WAIT_EVENT_LOGICAL_SYNC_DATA, |
| WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE, |
| WAIT_EVENT_MQ_INTERNAL, |
| WAIT_EVENT_MQ_PUT_MESSAGE, |
| WAIT_EVENT_MQ_RECEIVE, |
| WAIT_EVENT_MQ_SEND, |
| WAIT_EVENT_PARALLEL_BITMAP_SCAN, |
| WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN, |
| WAIT_EVENT_PARALLEL_FINISH, |
| WAIT_EVENT_PROCARRAY_GROUP_UPDATE, |
| WAIT_EVENT_PROC_SIGNAL_BARRIER, |
| WAIT_EVENT_PROMOTE, |
| WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT, |
| WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE, |
| WAIT_EVENT_RECOVERY_END_COMMAND, |
| WAIT_EVENT_RECOVERY_PAUSE, |
| WAIT_EVENT_REPLICATION_ORIGIN_DROP, |
| WAIT_EVENT_REPLICATION_SLOT_DROP, |
| WAIT_EVENT_RESTORE_COMMAND, |
| WAIT_EVENT_SAFE_SNAPSHOT, |
| WAIT_EVENT_SYNC_REP, |
| WAIT_EVENT_WAL_RECEIVER_EXIT, |
| WAIT_EVENT_WAL_RECEIVER_WAIT_START, |
| WAIT_EVENT_XACT_GROUP_UPDATE |
| |
| /* GPDB additions */ |
| , |
| WAIT_EVENT_DTX_RECOVERY, |
| WAIT_EVENT_SHAREINPUT_SCAN, |
| WAIT_EVENT_INTERCONNECT, |
| WAIT_EVENT_LOGINMONITOR_FINISH |
| } WaitEventIPC; |
| |
| /* ---------- |
| * Wait Events - Timeout |
| * |
| * Use this category when a process is waiting for a timeout to expire. |
| * ---------- |
| */ |
| typedef enum |
| { |
| WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT, |
| WAIT_EVENT_CHECKPOINT_WRITE_DELAY, |
| WAIT_EVENT_PG_SLEEP, |
| WAIT_EVENT_RECOVERY_APPLY_DELAY, |
| WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL, |
| WAIT_EVENT_REGISTER_SYNC_REQUEST, |
| WAIT_EVENT_SPIN_DELAY, |
| WAIT_EVENT_VACUUM_DELAY, |
| WAIT_EVENT_VACUUM_TRUNCATE |
| } WaitEventTimeout; |
| |
| /* ---------- |
| * Wait Events - IO |
| * |
| * Use this category when a process is waiting for a IO. |
| * ---------- |
| */ |
| typedef enum |
| { |
| WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO, |
| WAIT_EVENT_BASEBACKUP_SYNC, |
| WAIT_EVENT_BASEBACKUP_WRITE, |
| WAIT_EVENT_BUFFILE_READ, |
| WAIT_EVENT_BUFFILE_WRITE, |
| WAIT_EVENT_BUFFILE_TRUNCATE, |
| WAIT_EVENT_CONTROL_FILE_READ, |
| WAIT_EVENT_CONTROL_FILE_SYNC, |
| WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE, |
| WAIT_EVENT_CONTROL_FILE_WRITE, |
| WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE, |
| WAIT_EVENT_COPY_FILE_READ, |
| WAIT_EVENT_COPY_FILE_WRITE, |
| WAIT_EVENT_DATA_FILE_EXTEND, |
| WAIT_EVENT_DATA_FILE_FLUSH, |
| WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC, |
| WAIT_EVENT_DATA_FILE_PREFETCH, |
| WAIT_EVENT_DATA_FILE_READ, |
| WAIT_EVENT_DATA_FILE_SYNC, |
| WAIT_EVENT_DATA_FILE_TRUNCATE, |
| WAIT_EVENT_DATA_FILE_WRITE, |
| WAIT_EVENT_DSM_ALLOCATE, |
| WAIT_EVENT_DSM_FILL_ZERO_WRITE, |
| WAIT_EVENT_KEY_FILE_READ, |
| WAIT_EVENT_KEY_FILE_WRITE, |
| WAIT_EVENT_KEY_FILE_SYNC, |
| WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ, |
| WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC, |
| WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE, |
| WAIT_EVENT_LOCK_FILE_CREATE_READ, |
| WAIT_EVENT_LOCK_FILE_CREATE_SYNC, |
| WAIT_EVENT_LOCK_FILE_CREATE_WRITE, |
| WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ, |
| WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC, |
| WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC, |
| WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE, |
| WAIT_EVENT_LOGICAL_REWRITE_SYNC, |
| WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE, |
| WAIT_EVENT_LOGICAL_REWRITE_WRITE, |
| WAIT_EVENT_RELATION_MAP_READ, |
| WAIT_EVENT_RELATION_MAP_REPLACE, |
| WAIT_EVENT_RELATION_MAP_WRITE, |
| WAIT_EVENT_REORDER_BUFFER_READ, |
| WAIT_EVENT_REORDER_BUFFER_WRITE, |
| WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ, |
| WAIT_EVENT_REPLICATION_SLOT_READ, |
| WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC, |
| WAIT_EVENT_REPLICATION_SLOT_SYNC, |
| WAIT_EVENT_REPLICATION_SLOT_WRITE, |
| WAIT_EVENT_SLRU_FLUSH_SYNC, |
| WAIT_EVENT_SLRU_READ, |
| WAIT_EVENT_SLRU_SYNC, |
| WAIT_EVENT_SLRU_WRITE, |
| WAIT_EVENT_SNAPBUILD_READ, |
| WAIT_EVENT_SNAPBUILD_SYNC, |
| WAIT_EVENT_SNAPBUILD_WRITE, |
| WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC, |
| WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE, |
| WAIT_EVENT_TIMELINE_HISTORY_READ, |
| WAIT_EVENT_TIMELINE_HISTORY_SYNC, |
| WAIT_EVENT_TIMELINE_HISTORY_WRITE, |
| WAIT_EVENT_TWOPHASE_FILE_READ, |
| WAIT_EVENT_TWOPHASE_FILE_SYNC, |
| WAIT_EVENT_TWOPHASE_FILE_WRITE, |
| WAIT_EVENT_VERSION_FILE_WRITE, |
| WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ, |
| WAIT_EVENT_WAL_BOOTSTRAP_SYNC, |
| WAIT_EVENT_WAL_BOOTSTRAP_WRITE, |
| WAIT_EVENT_WAL_COPY_READ, |
| WAIT_EVENT_WAL_COPY_SYNC, |
| WAIT_EVENT_WAL_COPY_WRITE, |
| WAIT_EVENT_WAL_INIT_SYNC, |
| WAIT_EVENT_WAL_INIT_WRITE, |
| WAIT_EVENT_WAL_READ, |
| WAIT_EVENT_WAL_SYNC, |
| WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN, |
| WAIT_EVENT_WAL_WRITE, |
| WAIT_EVENT_VERSION_FILE_SYNC |
| } WaitEventIO; |
| |
| |
| extern const char *pgstat_get_wait_event(uint32 wait_event_info); |
| extern const char *pgstat_get_wait_event_type(uint32 wait_event_info); |
| static inline void pgstat_report_wait_start(uint32 wait_event_info); |
| static inline void pgstat_report_wait_end(void); |
| extern void pgstat_set_wait_event_storage(uint32 *wait_event_info); |
| extern void pgstat_reset_wait_event_storage(void); |
| |
| extern PGDLLIMPORT uint32 *my_wait_event_info; |
| |
| |
| /* ---------- |
| * pgstat_report_wait_start() - |
| * |
| * Called from places where server process needs to wait. This is called |
| * to report wait event information. The wait information is stored |
| * as 4-bytes where first byte represents the wait event class (type of |
| * wait, for different types of wait, refer WaitClass) and the next |
| * 3-bytes represent the actual wait event. Currently 2-bytes are used |
| * for wait event which is sufficient for current usage, 1-byte is |
| * reserved for future usage. |
| * |
| * Historically we used to make this reporting conditional on |
| * pgstat_track_activities, but the check for that seems to add more cost |
| * than it saves. |
| * |
| * my_wait_event_info initially points to local memory, making it safe to |
| * call this before MyProc has been initialized. |
| * ---------- |
| */ |
| static inline void |
| pgstat_report_wait_start(uint32 wait_event_info) |
| { |
| /* |
| * Since this is a four-byte field which is always read and written as |
| * four-bytes, updates are atomic. |
| */ |
| *(volatile uint32 *) my_wait_event_info = wait_event_info; |
| } |
| |
| /* ---------- |
| * pgstat_report_wait_end() - |
| * |
| * Called to report end of a wait. |
| * ---------- |
| */ |
| static inline void |
| pgstat_report_wait_end(void) |
| { |
| /* see pgstat_report_wait_start() */ |
| *(volatile uint32 *) my_wait_event_info = 0; |
| } |
| |
| |
| #endif /* WAIT_EVENT_H */ |