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