Age Owner TLA Line data Source code
1 : /*-------------------------------------------------------------------------
2 : * wait_event.h
3 : * Definitions related to wait event reporting
4 : *
5 : * Copyright (c) 2001-2023, PostgreSQL Global Development Group
6 : *
7 : * src/include/utils/wait_event.h
8 : * ----------
9 : */
10 : #ifndef WAIT_EVENT_H
11 : #define WAIT_EVENT_H
12 :
13 :
14 : /* ----------
15 : * Wait Classes
16 : * ----------
17 : */
18 : #define PG_WAIT_LWLOCK 0x01000000U
19 : #define PG_WAIT_LOCK 0x03000000U
20 : #define PG_WAIT_BUFFER_PIN 0x04000000U
21 : #define PG_WAIT_ACTIVITY 0x05000000U
22 : #define PG_WAIT_CLIENT 0x06000000U
23 : #define PG_WAIT_EXTENSION 0x07000000U
24 : #define PG_WAIT_IPC 0x08000000U
25 : #define PG_WAIT_TIMEOUT 0x09000000U
26 : #define PG_WAIT_IO 0x0A000000U
27 :
28 : /* ----------
29 : * Wait Events - Activity
30 : *
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 : */
36 : typedef enum
37 : {
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_MAIN
51 : } WaitEventActivity;
52 :
53 : /* ----------
54 : * Wait Events - Client
55 : *
56 : * Use this category when a process is waiting to send data to or receive data
57 : * from the frontend process to which it is connected. This is never used for
58 : * a background process, which has no client connection.
59 : * ----------
60 : */
61 : typedef enum
62 : {
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 - IPC
75 : *
76 : * Use this category when a process cannot complete the work it is doing because
77 : * it is waiting for a notification from another process.
78 : * ----------
79 : */
80 : typedef enum
81 : {
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_UPDATE
135 : } WaitEventIPC;
136 :
137 : /* ----------
138 : * Wait Events - Timeout
139 : *
140 : * Use this category when a process is waiting for a timeout to expire.
141 : * ----------
142 : */
143 : typedef enum
144 : {
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_TRUNCATE
154 : } WaitEventTimeout;
155 :
156 : /* ----------
157 : * Wait Events - IO
158 : *
159 : * Use this category when a process is waiting for a IO.
160 : * ----------
161 : */
162 : typedef enum
163 : {
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 : } WaitEventIO;
239 :
240 :
241 : extern const char *pgstat_get_wait_event(uint32 wait_event_info);
242 : extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);
243 : static inline void pgstat_report_wait_start(uint32 wait_event_info);
244 : static inline void pgstat_report_wait_end(void);
245 : extern void pgstat_set_wait_event_storage(uint32 *wait_event_info);
246 : extern void pgstat_reset_wait_event_storage(void);
247 :
248 : extern PGDLLIMPORT uint32 *my_wait_event_info;
249 :
250 :
251 : /* ----------
252 : * pgstat_report_wait_start() -
253 : *
254 : * Called from places where server process needs to wait. This is called
255 : * to report wait event information. The wait information is stored
256 : * as 4-bytes where first byte represents the wait event class (type of
257 : * wait, for different types of wait, refer WaitClass) and the next
258 : * 3-bytes represent the actual wait event. Currently 2-bytes are used
259 : * for wait event which is sufficient for current usage, 1-byte is
260 : * reserved for future usage.
261 : *
262 : * Historically we used to make this reporting conditional on
263 : * pgstat_track_activities, but the check for that seems to add more cost
264 : * than it saves.
265 : *
266 : * my_wait_event_info initially points to local memory, making it safe to
267 : * call this before MyProc has been initialized.
268 : * ----------
269 : */
270 : static inline void
737 andres 271 GIC 7320247 : pgstat_report_wait_start(uint32 wait_event_info)
272 : {
273 : /*
274 : * Since this is a four-byte field which is always read and written as
275 : * four-bytes, updates are atomic.
737 andres 276 ECB : */
736 andres 277 GIC 7320247 : *(volatile uint32 *) my_wait_event_info = wait_event_info;
737 278 7320247 : }
279 :
280 : /* ----------
281 : * pgstat_report_wait_end() -
737 andres 282 ECB : *
283 : * Called to report end of a wait.
284 : * ----------
285 : */
286 : static inline void
737 andres 287 GIC 7346623 : pgstat_report_wait_end(void)
288 : {
289 : /* see pgstat_report_wait_start() */
736 290 7346623 : *(volatile uint32 *) my_wait_event_info = 0;
737 291 7346623 : }
737 andres 292 ECB :
293 :
294 : #endif /* WAIT_EVENT_H */
|