2
0

wait_event.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /*-------------------------------------------------------------------------
  2. * wait_event.h
  3. * Definitions related to wait event reporting
  4. *
  5. * Copyright (c) 2001-2022, 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. * Wait Classes
  14. * ----------
  15. */
  16. #define PG_WAIT_LWLOCK 0x01000000U
  17. #define PG_WAIT_LOCK 0x03000000U
  18. #define PG_WAIT_BUFFER_PIN 0x04000000U
  19. #define PG_WAIT_ACTIVITY 0x05000000U
  20. #define PG_WAIT_CLIENT 0x06000000U
  21. #define PG_WAIT_EXTENSION 0x07000000U
  22. #define PG_WAIT_IPC 0x08000000U
  23. #define PG_WAIT_TIMEOUT 0x09000000U
  24. #define PG_WAIT_IO 0x0A000000U
  25. /* ----------
  26. * Wait Events - Activity
  27. *
  28. * Use this category when a process is waiting because it has no work to do,
  29. * unless the "Client" or "Timeout" category describes the situation better.
  30. * Typically, this should only be used for background processes.
  31. * ----------
  32. */
  33. typedef enum
  34. {
  35. WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY,
  36. WAIT_EVENT_AUTOVACUUM_MAIN,
  37. WAIT_EVENT_BGWRITER_HIBERNATE,
  38. WAIT_EVENT_BGWRITER_MAIN,
  39. WAIT_EVENT_CHECKPOINTER_MAIN,
  40. WAIT_EVENT_LOGICAL_APPLY_MAIN,
  41. WAIT_EVENT_LOGICAL_LAUNCHER_MAIN,
  42. WAIT_EVENT_RECOVERY_WAL_STREAM,
  43. WAIT_EVENT_SYSLOGGER_MAIN,
  44. WAIT_EVENT_WAL_RECEIVER_MAIN,
  45. WAIT_EVENT_WAL_SENDER_MAIN,
  46. WAIT_EVENT_WAL_WRITER_MAIN
  47. } WaitEventActivity;
  48. /* ----------
  49. * Wait Events - Client
  50. *
  51. * Use this category when a process is waiting to send data to or receive data
  52. * from the frontend process to which it is connected. This is never used for
  53. * a background process, which has no client connection.
  54. * ----------
  55. */
  56. typedef enum
  57. {
  58. WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT,
  59. WAIT_EVENT_CLIENT_WRITE,
  60. WAIT_EVENT_GSS_OPEN_SERVER,
  61. WAIT_EVENT_LIBPQWALRECEIVER_CONNECT,
  62. WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE,
  63. WAIT_EVENT_SSL_OPEN_SERVER,
  64. WAIT_EVENT_WAL_SENDER_WAIT_WAL,
  65. WAIT_EVENT_WAL_SENDER_WRITE_DATA,
  66. } WaitEventClient;
  67. /* ----------
  68. * Wait Events - IPC
  69. *
  70. * Use this category when a process cannot complete the work it is doing because
  71. * it is waiting for a notification from another process.
  72. * ----------
  73. */
  74. typedef enum
  75. {
  76. WAIT_EVENT_APPEND_READY = PG_WAIT_IPC,
  77. WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND,
  78. WAIT_EVENT_ARCHIVE_COMMAND,
  79. WAIT_EVENT_BACKEND_TERMINATION,
  80. WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE,
  81. WAIT_EVENT_BGWORKER_SHUTDOWN,
  82. WAIT_EVENT_BGWORKER_STARTUP,
  83. WAIT_EVENT_BTREE_PAGE,
  84. WAIT_EVENT_BUFFER_IO,
  85. WAIT_EVENT_CHECKPOINT_DONE,
  86. WAIT_EVENT_CHECKPOINT_START,
  87. WAIT_EVENT_EXECUTE_GATHER,
  88. WAIT_EVENT_HASH_BATCH_ALLOCATE,
  89. WAIT_EVENT_HASH_BATCH_ELECT,
  90. WAIT_EVENT_HASH_BATCH_LOAD,
  91. WAIT_EVENT_HASH_BUILD_ALLOCATE,
  92. WAIT_EVENT_HASH_BUILD_ELECT,
  93. WAIT_EVENT_HASH_BUILD_HASH_INNER,
  94. WAIT_EVENT_HASH_BUILD_HASH_OUTER,
  95. WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE,
  96. WAIT_EVENT_HASH_GROW_BATCHES_DECIDE,
  97. WAIT_EVENT_HASH_GROW_BATCHES_ELECT,
  98. WAIT_EVENT_HASH_GROW_BATCHES_FINISH,
  99. WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION,
  100. WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE,
  101. WAIT_EVENT_HASH_GROW_BUCKETS_ELECT,
  102. WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT,
  103. WAIT_EVENT_LOGICAL_SYNC_DATA,
  104. WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE,
  105. WAIT_EVENT_MQ_INTERNAL,
  106. WAIT_EVENT_MQ_PUT_MESSAGE,
  107. WAIT_EVENT_MQ_RECEIVE,
  108. WAIT_EVENT_MQ_SEND,
  109. WAIT_EVENT_PARALLEL_BITMAP_SCAN,
  110. WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN,
  111. WAIT_EVENT_PARALLEL_FINISH,
  112. WAIT_EVENT_PROCARRAY_GROUP_UPDATE,
  113. WAIT_EVENT_PROC_SIGNAL_BARRIER,
  114. WAIT_EVENT_PROMOTE,
  115. WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT,
  116. WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE,
  117. WAIT_EVENT_RECOVERY_END_COMMAND,
  118. WAIT_EVENT_RECOVERY_PAUSE,
  119. WAIT_EVENT_REPLICATION_ORIGIN_DROP,
  120. WAIT_EVENT_REPLICATION_SLOT_DROP,
  121. WAIT_EVENT_RESTORE_COMMAND,
  122. WAIT_EVENT_SAFE_SNAPSHOT,
  123. WAIT_EVENT_SYNC_REP,
  124. WAIT_EVENT_WAL_RECEIVER_EXIT,
  125. WAIT_EVENT_WAL_RECEIVER_WAIT_START,
  126. WAIT_EVENT_XACT_GROUP_UPDATE
  127. } WaitEventIPC;
  128. /* ----------
  129. * Wait Events - Timeout
  130. *
  131. * Use this category when a process is waiting for a timeout to expire.
  132. * ----------
  133. */
  134. typedef enum
  135. {
  136. WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT,
  137. WAIT_EVENT_CHECKPOINT_WRITE_DELAY,
  138. WAIT_EVENT_PG_SLEEP,
  139. WAIT_EVENT_RECOVERY_APPLY_DELAY,
  140. WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL,
  141. WAIT_EVENT_REGISTER_SYNC_REQUEST,
  142. WAIT_EVENT_VACUUM_DELAY,
  143. WAIT_EVENT_VACUUM_TRUNCATE
  144. } WaitEventTimeout;
  145. /* ----------
  146. * Wait Events - IO
  147. *
  148. * Use this category when a process is waiting for a IO.
  149. * ----------
  150. */
  151. typedef enum
  152. {
  153. WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO,
  154. WAIT_EVENT_BASEBACKUP_SYNC,
  155. WAIT_EVENT_BASEBACKUP_WRITE,
  156. WAIT_EVENT_BUFFILE_READ,
  157. WAIT_EVENT_BUFFILE_WRITE,
  158. WAIT_EVENT_BUFFILE_TRUNCATE,
  159. WAIT_EVENT_CONTROL_FILE_READ,
  160. WAIT_EVENT_CONTROL_FILE_SYNC,
  161. WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE,
  162. WAIT_EVENT_CONTROL_FILE_WRITE,
  163. WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE,
  164. WAIT_EVENT_COPY_FILE_READ,
  165. WAIT_EVENT_COPY_FILE_WRITE,
  166. WAIT_EVENT_DATA_FILE_EXTEND,
  167. WAIT_EVENT_DATA_FILE_FLUSH,
  168. WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC,
  169. WAIT_EVENT_DATA_FILE_PREFETCH,
  170. WAIT_EVENT_DATA_FILE_READ,
  171. WAIT_EVENT_DATA_FILE_SYNC,
  172. WAIT_EVENT_DATA_FILE_TRUNCATE,
  173. WAIT_EVENT_DATA_FILE_WRITE,
  174. WAIT_EVENT_DSM_FILL_ZERO_WRITE,
  175. WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ,
  176. WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC,
  177. WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE,
  178. WAIT_EVENT_LOCK_FILE_CREATE_READ,
  179. WAIT_EVENT_LOCK_FILE_CREATE_SYNC,
  180. WAIT_EVENT_LOCK_FILE_CREATE_WRITE,
  181. WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ,
  182. WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC,
  183. WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC,
  184. WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE,
  185. WAIT_EVENT_LOGICAL_REWRITE_SYNC,
  186. WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE,
  187. WAIT_EVENT_LOGICAL_REWRITE_WRITE,
  188. WAIT_EVENT_RELATION_MAP_READ,
  189. WAIT_EVENT_RELATION_MAP_SYNC,
  190. WAIT_EVENT_RELATION_MAP_WRITE,
  191. WAIT_EVENT_REORDER_BUFFER_READ,
  192. WAIT_EVENT_REORDER_BUFFER_WRITE,
  193. WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ,
  194. WAIT_EVENT_REPLICATION_SLOT_READ,
  195. WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC,
  196. WAIT_EVENT_REPLICATION_SLOT_SYNC,
  197. WAIT_EVENT_REPLICATION_SLOT_WRITE,
  198. WAIT_EVENT_SLRU_FLUSH_SYNC,
  199. WAIT_EVENT_SLRU_READ,
  200. WAIT_EVENT_SLRU_SYNC,
  201. WAIT_EVENT_SLRU_WRITE,
  202. WAIT_EVENT_SNAPBUILD_READ,
  203. WAIT_EVENT_SNAPBUILD_SYNC,
  204. WAIT_EVENT_SNAPBUILD_WRITE,
  205. WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC,
  206. WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE,
  207. WAIT_EVENT_TIMELINE_HISTORY_READ,
  208. WAIT_EVENT_TIMELINE_HISTORY_SYNC,
  209. WAIT_EVENT_TIMELINE_HISTORY_WRITE,
  210. WAIT_EVENT_TWOPHASE_FILE_READ,
  211. WAIT_EVENT_TWOPHASE_FILE_SYNC,
  212. WAIT_EVENT_TWOPHASE_FILE_WRITE,
  213. WAIT_EVENT_VERSION_FILE_WRITE,
  214. WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ,
  215. WAIT_EVENT_WAL_BOOTSTRAP_SYNC,
  216. WAIT_EVENT_WAL_BOOTSTRAP_WRITE,
  217. WAIT_EVENT_WAL_COPY_READ,
  218. WAIT_EVENT_WAL_COPY_SYNC,
  219. WAIT_EVENT_WAL_COPY_WRITE,
  220. WAIT_EVENT_WAL_INIT_SYNC,
  221. WAIT_EVENT_WAL_INIT_WRITE,
  222. WAIT_EVENT_WAL_READ,
  223. WAIT_EVENT_WAL_SYNC,
  224. WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,
  225. WAIT_EVENT_WAL_WRITE
  226. } WaitEventIO;
  227. extern const char *pgstat_get_wait_event(uint32 wait_event_info);
  228. extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);
  229. static inline void pgstat_report_wait_start(uint32 wait_event_info);
  230. static inline void pgstat_report_wait_end(void);
  231. extern void pgstat_set_wait_event_storage(uint32 *wait_event_info);
  232. extern void pgstat_reset_wait_event_storage(void);
  233. extern PGDLLIMPORT uint32 *my_wait_event_info;
  234. /* ----------
  235. * pgstat_report_wait_start() -
  236. *
  237. * Called from places where server process needs to wait. This is called
  238. * to report wait event information. The wait information is stored
  239. * as 4-bytes where first byte represents the wait event class (type of
  240. * wait, for different types of wait, refer WaitClass) and the next
  241. * 3-bytes represent the actual wait event. Currently 2-bytes are used
  242. * for wait event which is sufficient for current usage, 1-byte is
  243. * reserved for future usage.
  244. *
  245. * Historically we used to make this reporting conditional on
  246. * pgstat_track_activities, but the check for that seems to add more cost
  247. * than it saves.
  248. *
  249. * my_wait_event_info initially points to local memory, making it safe to
  250. * call this before MyProc has been initialized.
  251. * ----------
  252. */
  253. static inline void
  254. pgstat_report_wait_start(uint32 wait_event_info)
  255. {
  256. /*
  257. * Since this is a four-byte field which is always read and written as
  258. * four-bytes, updates are atomic.
  259. */
  260. *(volatile uint32 *) my_wait_event_info = wait_event_info;
  261. }
  262. /* ----------
  263. * pgstat_report_wait_end() -
  264. *
  265. * Called to report end of a wait.
  266. * ----------
  267. */
  268. static inline void
  269. pgstat_report_wait_end(void)
  270. {
  271. /* see pgstat_report_wait_start() */
  272. *(volatile uint32 *) my_wait_event_info = 0;
  273. }
  274. #endif /* WAIT_EVENT_H */