1 /*-------------------------------------------------------------------------
2 * wait_event.h
3 * Definitions related to wait event reporting
4 *
5 * Copyright (c) 2001-2021, 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_PGSTAT_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_BACKEND_TERMINATION,
84 WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE,
85 WAIT_EVENT_BGWORKER_SHUTDOWN,
86 WAIT_EVENT_BGWORKER_STARTUP,
87 WAIT_EVENT_BTREE_PAGE,
88 WAIT_EVENT_BUFFER_IO,
89 WAIT_EVENT_CHECKPOINT_DONE,
90 WAIT_EVENT_CHECKPOINT_START,
91 WAIT_EVENT_EXECUTE_GATHER,
92 WAIT_EVENT_HASH_BATCH_ALLOCATE,
93 WAIT_EVENT_HASH_BATCH_ELECT,
94 WAIT_EVENT_HASH_BATCH_LOAD,
95 WAIT_EVENT_HASH_BUILD_ALLOCATE,
96 WAIT_EVENT_HASH_BUILD_ELECT,
97 WAIT_EVENT_HASH_BUILD_HASH_INNER,
98 WAIT_EVENT_HASH_BUILD_HASH_OUTER,
99 WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE,
100 WAIT_EVENT_HASH_GROW_BATCHES_DECIDE,
101 WAIT_EVENT_HASH_GROW_BATCHES_ELECT,
102 WAIT_EVENT_HASH_GROW_BATCHES_FINISH,
103 WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION,
104 WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE,
105 WAIT_EVENT_HASH_GROW_BUCKETS_ELECT,
106 WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT,
107 WAIT_EVENT_LOGICAL_SYNC_DATA,
108 WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE,
109 WAIT_EVENT_MQ_INTERNAL,
110 WAIT_EVENT_MQ_PUT_MESSAGE,
111 WAIT_EVENT_MQ_RECEIVE,
112 WAIT_EVENT_MQ_SEND,
113 WAIT_EVENT_PARALLEL_BITMAP_SCAN,
114 WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN,
115 WAIT_EVENT_PARALLEL_FINISH,
116 WAIT_EVENT_PROCARRAY_GROUP_UPDATE,
117 WAIT_EVENT_PROC_SIGNAL_BARRIER,
118 WAIT_EVENT_PROMOTE,
119 WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT,
120 WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE,
121 WAIT_EVENT_RECOVERY_PAUSE,
122 WAIT_EVENT_REPLICATION_ORIGIN_DROP,
123 WAIT_EVENT_REPLICATION_SLOT_DROP,
124 WAIT_EVENT_SAFE_SNAPSHOT,
125 WAIT_EVENT_SYNC_REP,
126 WAIT_EVENT_WAL_RECEIVER_EXIT,
127 WAIT_EVENT_WAL_RECEIVER_WAIT_START,
128 WAIT_EVENT_XACT_GROUP_UPDATE
129 } WaitEventIPC;
130
131 /* ----------
132 * Wait Events - Timeout
133 *
134 * Use this category when a process is waiting for a timeout to expire.
135 * ----------
136 */
137 typedef enum
138 {
139 WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT,
140 WAIT_EVENT_PG_SLEEP,
141 WAIT_EVENT_RECOVERY_APPLY_DELAY,
142 WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL,
143 WAIT_EVENT_VACUUM_DELAY
144 } WaitEventTimeout;
145
146 /* ----------
147 * Wait Events - IO
148 *
149 * Use this category when a process is waiting for a IO.
150 * ----------
151 */
152 typedef enum
153 {
154 WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO,
155 WAIT_EVENT_BUFFILE_READ,
156 WAIT_EVENT_BUFFILE_WRITE,
157 WAIT_EVENT_BUFFILE_TRUNCATE,
158 WAIT_EVENT_CONTROL_FILE_READ,
159 WAIT_EVENT_CONTROL_FILE_SYNC,
160 WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE,
161 WAIT_EVENT_CONTROL_FILE_WRITE,
162 WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE,
163 WAIT_EVENT_COPY_FILE_READ,
164 WAIT_EVENT_COPY_FILE_WRITE,
165 WAIT_EVENT_DATA_FILE_EXTEND,
166 WAIT_EVENT_DATA_FILE_FLUSH,
167 WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC,
168 WAIT_EVENT_DATA_FILE_PREFETCH,
169 WAIT_EVENT_DATA_FILE_READ,
170 WAIT_EVENT_DATA_FILE_SYNC,
171 WAIT_EVENT_DATA_FILE_TRUNCATE,
172 WAIT_EVENT_DATA_FILE_WRITE,
173 WAIT_EVENT_DSM_FILL_ZERO_WRITE,
174 WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ,
175 WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC,
176 WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE,
177 WAIT_EVENT_LOCK_FILE_CREATE_READ,
178 WAIT_EVENT_LOCK_FILE_CREATE_SYNC,
179 WAIT_EVENT_LOCK_FILE_CREATE_WRITE,
180 WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ,
181 WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC,
182 WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC,
183 WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE,
184 WAIT_EVENT_LOGICAL_REWRITE_SYNC,
185 WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE,
186 WAIT_EVENT_LOGICAL_REWRITE_WRITE,
187 WAIT_EVENT_RELATION_MAP_READ,
188 WAIT_EVENT_RELATION_MAP_SYNC,
189 WAIT_EVENT_RELATION_MAP_WRITE,
190 WAIT_EVENT_REORDER_BUFFER_READ,
191 WAIT_EVENT_REORDER_BUFFER_WRITE,
192 WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ,
193 WAIT_EVENT_REPLICATION_SLOT_READ,
194 WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC,
195 WAIT_EVENT_REPLICATION_SLOT_SYNC,
196 WAIT_EVENT_REPLICATION_SLOT_WRITE,
197 WAIT_EVENT_SLRU_FLUSH_SYNC,
198 WAIT_EVENT_SLRU_READ,
199 WAIT_EVENT_SLRU_SYNC,
200 WAIT_EVENT_SLRU_WRITE,
201 WAIT_EVENT_SNAPBUILD_READ,
202 WAIT_EVENT_SNAPBUILD_SYNC,
203 WAIT_EVENT_SNAPBUILD_WRITE,
204 WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC,
205 WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE,
206 WAIT_EVENT_TIMELINE_HISTORY_READ,
207 WAIT_EVENT_TIMELINE_HISTORY_SYNC,
208 WAIT_EVENT_TIMELINE_HISTORY_WRITE,
209 WAIT_EVENT_TWOPHASE_FILE_READ,
210 WAIT_EVENT_TWOPHASE_FILE_SYNC,
211 WAIT_EVENT_TWOPHASE_FILE_WRITE,
212 WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ,
213 WAIT_EVENT_WAL_BOOTSTRAP_SYNC,
214 WAIT_EVENT_WAL_BOOTSTRAP_WRITE,
215 WAIT_EVENT_WAL_COPY_READ,
216 WAIT_EVENT_WAL_COPY_SYNC,
217 WAIT_EVENT_WAL_COPY_WRITE,
218 WAIT_EVENT_WAL_INIT_SYNC,
219 WAIT_EVENT_WAL_INIT_WRITE,
220 WAIT_EVENT_WAL_READ,
221 WAIT_EVENT_WAL_SYNC,
222 WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,
223 WAIT_EVENT_WAL_WRITE,
224 WAIT_EVENT_LOGICAL_CHANGES_READ,
225 WAIT_EVENT_LOGICAL_CHANGES_WRITE,
226 WAIT_EVENT_LOGICAL_SUBXACT_READ,
227 WAIT_EVENT_LOGICAL_SUBXACT_WRITE
228 } WaitEventIO;
229
230
231 extern const char *pgstat_get_wait_event(uint32 wait_event_info);
232 extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);
233 static inline void pgstat_report_wait_start(uint32 wait_event_info);
234 static inline void pgstat_report_wait_end(void);
235 extern void pgstat_set_wait_event_storage(uint32 *wait_event_info);
236 extern void pgstat_reset_wait_event_storage(void);
237
238 extern PGDLLIMPORT uint32 *my_wait_event_info;
239
240
241 /* ----------
242 * pgstat_report_wait_start() -
243 *
244 * Called from places where server process needs to wait. This is called
245 * to report wait event information. The wait information is stored
246 * as 4-bytes where first byte represents the wait event class (type of
247 * wait, for different types of wait, refer WaitClass) and the next
248 * 3-bytes represent the actual wait event. Currently 2-bytes are used
249 * for wait event which is sufficient for current usage, 1-byte is
250 * reserved for future usage.
251 *
252 * Historically we used to make this reporting conditional on
253 * pgstat_track_activities, but the check for that seems to add more cost
254 * than it saves.
255 *
256 * my_wait_event_info initially points to local memory, making it safe to
257 * call this before MyProc has been initialized.
258 * ----------
259 */
260 static inline void
pgstat_report_wait_start(uint32 wait_event_info)261 pgstat_report_wait_start(uint32 wait_event_info)
262 {
263 /*
264 * Since this is a four-byte field which is always read and written as
265 * four-bytes, updates are atomic.
266 */
267 *(volatile uint32 *) my_wait_event_info = wait_event_info;
268 }
269
270 /* ----------
271 * pgstat_report_wait_end() -
272 *
273 * Called to report end of a wait.
274 * ----------
275 */
276 static inline void
pgstat_report_wait_end(void)277 pgstat_report_wait_end(void)
278 {
279 /* see pgstat_report_wait_start() */
280 *(volatile uint32 *) my_wait_event_info = 0;
281 }
282
283
284 #endif /* WAIT_EVENT_H */
285