LCOV - differential code coverage report
Current view: top level - src/include/utils - wait_event.h (source / functions) Coverage Total Hit GIC ECB
Current: Differential Code Coverage HEAD vs 15 Lines: 100.0 % 6 6 6 6
Current Date: 2023-04-08 17:13:01 Functions: 100.0 % 2 2 2 2
Baseline: 15 Line coverage date bins:
Baseline Date: 2023-04-08 15:09:40 (240..) days: 100.0 % 6 6 6 4
Legend: Lines: hit not hit Function coverage date bins:
(240..) days: 50.0 % 4 2 2 2

 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 */
        

Generated by: LCOV version v1.16-55-g56c0a2a