codekingpro/portable-devtools
116k
1/*-------------------------------------------------------------------------2 * wait_event.h3 * Definitions related to wait event reporting4 *5 * Copyright (c) 2001-2023, PostgreSQL Global Development Group6 *7 * src/include/utils/wait_event.h8 * ----------9 */10#ifndef WAIT_EVENT_H11#define WAIT_EVENT_H12 13 14/* ----------15 * Wait Classes16 * ----------17 */18#define PG_WAIT_LWLOCK 0x01000000U19#define PG_WAIT_LOCK 0x03000000U20#define PG_WAIT_BUFFER_PIN 0x04000000U21#define PG_WAIT_ACTIVITY 0x05000000U22#define PG_WAIT_CLIENT 0x06000000U23#define PG_WAIT_EXTENSION 0x07000000U24#define PG_WAIT_IPC 0x08000000U25#define PG_WAIT_TIMEOUT 0x09000000U26#define PG_WAIT_IO 0x0A000000U27 28/* ----------29 * Wait Events - Activity30 *31 * Use this category when a process is waiting because it has no work to do,32 * unless the "Client" or "Timeout" category describes the situation better.33 * Typically, this should only be used for background processes.34 * ----------35 */36typedef enum37{38 WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY,39 WAIT_EVENT_AUTOVACUUM_MAIN,40 WAIT_EVENT_BGWRITER_HIBERNATE,41 WAIT_EVENT_BGWRITER_MAIN,42 WAIT_EVENT_CHECKPOINTER_MAIN,43 WAIT_EVENT_LOGICAL_APPLY_MAIN,44 WAIT_EVENT_LOGICAL_LAUNCHER_MAIN,45 WAIT_EVENT_LOGICAL_PARALLEL_APPLY_MAIN,46 WAIT_EVENT_RECOVERY_WAL_STREAM,47 WAIT_EVENT_SYSLOGGER_MAIN,48 WAIT_EVENT_WAL_RECEIVER_MAIN,49 WAIT_EVENT_WAL_SENDER_MAIN,50 WAIT_EVENT_WAL_WRITER_MAIN51} WaitEventActivity;52 53/* ----------54 * Wait Events - Client55 *56 * Use this category when a process is waiting to send data to or receive data57 * from the frontend process to which it is connected. This is never used for58 * a background process, which has no client connection.59 * ----------60 */61typedef enum62{63 WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT,64 WAIT_EVENT_CLIENT_WRITE,65 WAIT_EVENT_GSS_OPEN_SERVER,66 WAIT_EVENT_LIBPQWALRECEIVER_CONNECT,67 WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE,68 WAIT_EVENT_SSL_OPEN_SERVER,69 WAIT_EVENT_WAL_SENDER_WAIT_WAL,70 WAIT_EVENT_WAL_SENDER_WRITE_DATA,71} WaitEventClient;72 73/* ----------74 * Wait Events - IPC75 *76 * Use this category when a process cannot complete the work it is doing because77 * it is waiting for a notification from another process.78 * ----------79 */80typedef enum81{82 WAIT_EVENT_APPEND_READY = PG_WAIT_IPC,83 WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND,84 WAIT_EVENT_ARCHIVE_COMMAND,85 WAIT_EVENT_BACKEND_TERMINATION,86 WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE,87 WAIT_EVENT_BGWORKER_SHUTDOWN,88 WAIT_EVENT_BGWORKER_STARTUP,89 WAIT_EVENT_BTREE_PAGE,90 WAIT_EVENT_BUFFER_IO,91 WAIT_EVENT_CHECKPOINT_DONE,92 WAIT_EVENT_CHECKPOINT_START,93 WAIT_EVENT_EXECUTE_GATHER,94 WAIT_EVENT_HASH_BATCH_ALLOCATE,95 WAIT_EVENT_HASH_BATCH_ELECT,96 WAIT_EVENT_HASH_BATCH_LOAD,97 WAIT_EVENT_HASH_BUILD_ALLOCATE,98 WAIT_EVENT_HASH_BUILD_ELECT,99 WAIT_EVENT_HASH_BUILD_HASH_INNER,100 WAIT_EVENT_HASH_BUILD_HASH_OUTER,101 WAIT_EVENT_HASH_GROW_BATCHES_DECIDE,102 WAIT_EVENT_HASH_GROW_BATCHES_ELECT,103 WAIT_EVENT_HASH_GROW_BATCHES_FINISH,104 WAIT_EVENT_HASH_GROW_BATCHES_REALLOCATE,105 WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION,106 WAIT_EVENT_HASH_GROW_BUCKETS_ELECT,107 WAIT_EVENT_HASH_GROW_BUCKETS_REALLOCATE,108 WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT,109 WAIT_EVENT_LOGICAL_APPLY_SEND_DATA,110 WAIT_EVENT_LOGICAL_PARALLEL_APPLY_STATE_CHANGE,111 WAIT_EVENT_LOGICAL_SYNC_DATA,112 WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE,113 WAIT_EVENT_MQ_INTERNAL,114 WAIT_EVENT_MQ_PUT_MESSAGE,115 WAIT_EVENT_MQ_RECEIVE,116 WAIT_EVENT_MQ_SEND,117 WAIT_EVENT_PARALLEL_BITMAP_SCAN,118 WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN,119 WAIT_EVENT_PARALLEL_FINISH,120 WAIT_EVENT_PROCARRAY_GROUP_UPDATE,121 WAIT_EVENT_PROC_SIGNAL_BARRIER,122 WAIT_EVENT_PROMOTE,123 WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT,124 WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE,125 WAIT_EVENT_RECOVERY_END_COMMAND,126 WAIT_EVENT_RECOVERY_PAUSE,127 WAIT_EVENT_REPLICATION_ORIGIN_DROP,128 WAIT_EVENT_REPLICATION_SLOT_DROP,129 WAIT_EVENT_RESTORE_COMMAND,130 WAIT_EVENT_SAFE_SNAPSHOT,131 WAIT_EVENT_SYNC_REP,132 WAIT_EVENT_WAL_RECEIVER_EXIT,133 WAIT_EVENT_WAL_RECEIVER_WAIT_START,134 WAIT_EVENT_XACT_GROUP_UPDATE135} WaitEventIPC;136 137/* ----------138 * Wait Events - Timeout139 *140 * Use this category when a process is waiting for a timeout to expire.141 * ----------142 */143typedef enum144{145 WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT,146 WAIT_EVENT_CHECKPOINT_WRITE_DELAY,147 WAIT_EVENT_PG_SLEEP,148 WAIT_EVENT_RECOVERY_APPLY_DELAY,149 WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL,150 WAIT_EVENT_REGISTER_SYNC_REQUEST,151 WAIT_EVENT_SPIN_DELAY,152 WAIT_EVENT_VACUUM_DELAY,153 WAIT_EVENT_VACUUM_TRUNCATE154} WaitEventTimeout;155 156/* ----------157 * Wait Events - IO158 *159 * Use this category when a process is waiting for a IO.160 * ----------161 */162typedef enum163{164 WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO,165 WAIT_EVENT_BASEBACKUP_SYNC,166 WAIT_EVENT_BASEBACKUP_WRITE,167 WAIT_EVENT_BUFFILE_READ,168 WAIT_EVENT_BUFFILE_WRITE,169 WAIT_EVENT_BUFFILE_TRUNCATE,170 WAIT_EVENT_CONTROL_FILE_READ,171 WAIT_EVENT_CONTROL_FILE_SYNC,172 WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE,173 WAIT_EVENT_CONTROL_FILE_WRITE,174 WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE,175 WAIT_EVENT_COPY_FILE_READ,176 WAIT_EVENT_COPY_FILE_WRITE,177 WAIT_EVENT_DATA_FILE_EXTEND,178 WAIT_EVENT_DATA_FILE_FLUSH,179 WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC,180 WAIT_EVENT_DATA_FILE_PREFETCH,181 WAIT_EVENT_DATA_FILE_READ,182 WAIT_EVENT_DATA_FILE_SYNC,183 WAIT_EVENT_DATA_FILE_TRUNCATE,184 WAIT_EVENT_DATA_FILE_WRITE,185 WAIT_EVENT_DSM_ALLOCATE,186 WAIT_EVENT_DSM_FILL_ZERO_WRITE,187 WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ,188 WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC,189 WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE,190 WAIT_EVENT_LOCK_FILE_CREATE_READ,191 WAIT_EVENT_LOCK_FILE_CREATE_SYNC,192 WAIT_EVENT_LOCK_FILE_CREATE_WRITE,193 WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ,194 WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC,195 WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC,196 WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE,197 WAIT_EVENT_LOGICAL_REWRITE_SYNC,198 WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE,199 WAIT_EVENT_LOGICAL_REWRITE_WRITE,200 WAIT_EVENT_RELATION_MAP_READ,201 WAIT_EVENT_RELATION_MAP_REPLACE,202 WAIT_EVENT_RELATION_MAP_WRITE,203 WAIT_EVENT_REORDER_BUFFER_READ,204 WAIT_EVENT_REORDER_BUFFER_WRITE,205 WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ,206 WAIT_EVENT_REPLICATION_SLOT_READ,207 WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC,208 WAIT_EVENT_REPLICATION_SLOT_SYNC,209 WAIT_EVENT_REPLICATION_SLOT_WRITE,210 WAIT_EVENT_SLRU_FLUSH_SYNC,211 WAIT_EVENT_SLRU_READ,212 WAIT_EVENT_SLRU_SYNC,213 WAIT_EVENT_SLRU_WRITE,214 WAIT_EVENT_SNAPBUILD_READ,215 WAIT_EVENT_SNAPBUILD_SYNC,216 WAIT_EVENT_SNAPBUILD_WRITE,217 WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC,218 WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE,219 WAIT_EVENT_TIMELINE_HISTORY_READ,220 WAIT_EVENT_TIMELINE_HISTORY_SYNC,221 WAIT_EVENT_TIMELINE_HISTORY_WRITE,222 WAIT_EVENT_TWOPHASE_FILE_READ,223 WAIT_EVENT_TWOPHASE_FILE_SYNC,224 WAIT_EVENT_TWOPHASE_FILE_WRITE,225 WAIT_EVENT_VERSION_FILE_WRITE,226 WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ,227 WAIT_EVENT_WAL_BOOTSTRAP_SYNC,228 WAIT_EVENT_WAL_BOOTSTRAP_WRITE,229 WAIT_EVENT_WAL_COPY_READ,230 WAIT_EVENT_WAL_COPY_SYNC,231 WAIT_EVENT_WAL_COPY_WRITE,232 WAIT_EVENT_WAL_INIT_SYNC,233 WAIT_EVENT_WAL_INIT_WRITE,234 WAIT_EVENT_WAL_READ,235 WAIT_EVENT_WAL_SYNC,236 WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,237 WAIT_EVENT_WAL_WRITE,238 WAIT_EVENT_VERSION_FILE_SYNC239} WaitEventIO;240 241 242extern const char *pgstat_get_wait_event(uint32 wait_event_info);243extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);244static inline void pgstat_report_wait_start(uint32 wait_event_info);245static inline void pgstat_report_wait_end(void);246extern void pgstat_set_wait_event_storage(uint32 *wait_event_info);247extern void pgstat_reset_wait_event_storage(void);248 249extern PGDLLIMPORT uint32 *my_wait_event_info;250 251 252/* ----------253 * pgstat_report_wait_start() -254 *255 * Called from places where server process needs to wait. This is called256 * to report wait event information. The wait information is stored257 * as 4-bytes where first byte represents the wait event class (type of258 * wait, for different types of wait, refer WaitClass) and the next259 * 3-bytes represent the actual wait event. Currently 2-bytes are used260 * for wait event which is sufficient for current usage, 1-byte is261 * reserved for future usage.262 *263 * Historically we used to make this reporting conditional on264 * pgstat_track_activities, but the check for that seems to add more cost265 * than it saves.266 *267 * my_wait_event_info initially points to local memory, making it safe to268 * call this before MyProc has been initialized.269 * ----------270 */271static inline void272pgstat_report_wait_start(uint32 wait_event_info)273{274 /*275 * Since this is a four-byte field which is always read and written as276 * four-bytes, updates are atomic.277 */278 *(volatile uint32 *) my_wait_event_info = wait_event_info;279}280 281/* ----------282 * pgstat_report_wait_end() -283 *284 * Called to report end of a wait.285 * ----------286 */287static inline void288pgstat_report_wait_end(void)289{290 /* see pgstat_report_wait_start() */291 *(volatile uint32 *) my_wait_event_info = 0;292}293 294 295#endif /* WAIT_EVENT_H */296 