]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Split wait event related code from pgstat.[ch] into wait_event.[ch].
authorAndres Freund <andres@anarazel.de>
Sat, 3 Apr 2021 02:45:24 +0000 (19:45 -0700)
committerAndres Freund <andres@anarazel.de>
Sat, 3 Apr 2021 03:02:26 +0000 (20:02 -0700)
The wait event related code is independent from the rest of the
pgstat.[ch] code, of nontrivial size and changes on a regular
basis. Put it into its own set of files.

As there doesn't seem to be a good pre-existing directory for code
like this, add src/backend/utils/activity.

Reviewed-By: Robert Haas <robertmhaas@gmail.com>
Discussion: https://postgr.es/m/20210316195440.twxmlov24rr2nxrg@alap3.anarazel.de

src/backend/postmaster/pgstat.c
src/backend/utils/Makefile
src/backend/utils/activity/Makefile [new file with mode: 0644]
src/backend/utils/activity/wait_event.c [new file with mode: 0644]
src/include/pgstat.h
src/include/utils/wait_event.h [new file with mode: 0644]

index 2f3f378e633b2946b75799e4d8c63d4a4ac17907..de239136f48642faea80eba14d33184ccd5af809 100644 (file)
@@ -352,12 +352,6 @@ static PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared);
 
 static void pgstat_setup_memcxt(void);
 
-static const char *pgstat_get_wait_activity(WaitEventActivity w);
-static const char *pgstat_get_wait_client(WaitEventClient w);
-static const char *pgstat_get_wait_ipc(WaitEventIPC w);
-static const char *pgstat_get_wait_timeout(WaitEventTimeout w);
-static const char *pgstat_get_wait_io(WaitEventIO w);
-
 static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype);
 static void pgstat_send(void *msg, int len);
 
@@ -3751,673 +3745,6 @@ pgstat_read_current_status(void)
        localBackendStatusTable = localtable;
 }
 
-/* ----------
- * pgstat_get_wait_event_type() -
- *
- *     Return a string representing the current wait event type, backend is
- *     waiting on.
- */
-const char *
-pgstat_get_wait_event_type(uint32 wait_event_info)
-{
-       uint32          classId;
-       const char *event_type;
-
-       /* report process as not waiting. */
-       if (wait_event_info == 0)
-               return NULL;
-
-       classId = wait_event_info & 0xFF000000;
-
-       switch (classId)
-       {
-               case PG_WAIT_LWLOCK:
-                       event_type = "LWLock";
-                       break;
-               case PG_WAIT_LOCK:
-                       event_type = "Lock";
-                       break;
-               case PG_WAIT_BUFFER_PIN:
-                       event_type = "BufferPin";
-                       break;
-               case PG_WAIT_ACTIVITY:
-                       event_type = "Activity";
-                       break;
-               case PG_WAIT_CLIENT:
-                       event_type = "Client";
-                       break;
-               case PG_WAIT_EXTENSION:
-                       event_type = "Extension";
-                       break;
-               case PG_WAIT_IPC:
-                       event_type = "IPC";
-                       break;
-               case PG_WAIT_TIMEOUT:
-                       event_type = "Timeout";
-                       break;
-               case PG_WAIT_IO:
-                       event_type = "IO";
-                       break;
-               default:
-                       event_type = "???";
-                       break;
-       }
-
-       return event_type;
-}
-
-/* ----------
- * pgstat_get_wait_event() -
- *
- *     Return a string representing the current wait event, backend is
- *     waiting on.
- */
-const char *
-pgstat_get_wait_event(uint32 wait_event_info)
-{
-       uint32          classId;
-       uint16          eventId;
-       const char *event_name;
-
-       /* report process as not waiting. */
-       if (wait_event_info == 0)
-               return NULL;
-
-       classId = wait_event_info & 0xFF000000;
-       eventId = wait_event_info & 0x0000FFFF;
-
-       switch (classId)
-       {
-               case PG_WAIT_LWLOCK:
-                       event_name = GetLWLockIdentifier(classId, eventId);
-                       break;
-               case PG_WAIT_LOCK:
-                       event_name = GetLockNameFromTagType(eventId);
-                       break;
-               case PG_WAIT_BUFFER_PIN:
-                       event_name = "BufferPin";
-                       break;
-               case PG_WAIT_ACTIVITY:
-                       {
-                               WaitEventActivity w = (WaitEventActivity) wait_event_info;
-
-                               event_name = pgstat_get_wait_activity(w);
-                               break;
-                       }
-               case PG_WAIT_CLIENT:
-                       {
-                               WaitEventClient w = (WaitEventClient) wait_event_info;
-
-                               event_name = pgstat_get_wait_client(w);
-                               break;
-                       }
-               case PG_WAIT_EXTENSION:
-                       event_name = "Extension";
-                       break;
-               case PG_WAIT_IPC:
-                       {
-                               WaitEventIPC w = (WaitEventIPC) wait_event_info;
-
-                               event_name = pgstat_get_wait_ipc(w);
-                               break;
-                       }
-               case PG_WAIT_TIMEOUT:
-                       {
-                               WaitEventTimeout w = (WaitEventTimeout) wait_event_info;
-
-                               event_name = pgstat_get_wait_timeout(w);
-                               break;
-                       }
-               case PG_WAIT_IO:
-                       {
-                               WaitEventIO w = (WaitEventIO) wait_event_info;
-
-                               event_name = pgstat_get_wait_io(w);
-                               break;
-                       }
-               default:
-                       event_name = "unknown wait event";
-                       break;
-       }
-
-       return event_name;
-}
-
-/* ----------
- * pgstat_get_wait_activity() -
- *
- * Convert WaitEventActivity to string.
- * ----------
- */
-static const char *
-pgstat_get_wait_activity(WaitEventActivity w)
-{
-       const char *event_name = "unknown wait event";
-
-       switch (w)
-       {
-               case WAIT_EVENT_ARCHIVER_MAIN:
-                       event_name = "ArchiverMain";
-                       break;
-               case WAIT_EVENT_AUTOVACUUM_MAIN:
-                       event_name = "AutoVacuumMain";
-                       break;
-               case WAIT_EVENT_BGWRITER_HIBERNATE:
-                       event_name = "BgWriterHibernate";
-                       break;
-               case WAIT_EVENT_BGWRITER_MAIN:
-                       event_name = "BgWriterMain";
-                       break;
-               case WAIT_EVENT_CHECKPOINTER_MAIN:
-                       event_name = "CheckpointerMain";
-                       break;
-               case WAIT_EVENT_LOGICAL_APPLY_MAIN:
-                       event_name = "LogicalApplyMain";
-                       break;
-               case WAIT_EVENT_LOGICAL_LAUNCHER_MAIN:
-                       event_name = "LogicalLauncherMain";
-                       break;
-               case WAIT_EVENT_PGSTAT_MAIN:
-                       event_name = "PgStatMain";
-                       break;
-               case WAIT_EVENT_RECOVERY_WAL_STREAM:
-                       event_name = "RecoveryWalStream";
-                       break;
-               case WAIT_EVENT_SYSLOGGER_MAIN:
-                       event_name = "SysLoggerMain";
-                       break;
-               case WAIT_EVENT_WAL_RECEIVER_MAIN:
-                       event_name = "WalReceiverMain";
-                       break;
-               case WAIT_EVENT_WAL_SENDER_MAIN:
-                       event_name = "WalSenderMain";
-                       break;
-               case WAIT_EVENT_WAL_WRITER_MAIN:
-                       event_name = "WalWriterMain";
-                       break;
-                       /* no default case, so that compiler will warn */
-       }
-
-       return event_name;
-}
-
-/* ----------
- * pgstat_get_wait_client() -
- *
- * Convert WaitEventClient to string.
- * ----------
- */
-static const char *
-pgstat_get_wait_client(WaitEventClient w)
-{
-       const char *event_name = "unknown wait event";
-
-       switch (w)
-       {
-               case WAIT_EVENT_CLIENT_READ:
-                       event_name = "ClientRead";
-                       break;
-               case WAIT_EVENT_CLIENT_WRITE:
-                       event_name = "ClientWrite";
-                       break;
-               case WAIT_EVENT_GSS_OPEN_SERVER:
-                       event_name = "GSSOpenServer";
-                       break;
-               case WAIT_EVENT_LIBPQWALRECEIVER_CONNECT:
-                       event_name = "LibPQWalReceiverConnect";
-                       break;
-               case WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE:
-                       event_name = "LibPQWalReceiverReceive";
-                       break;
-               case WAIT_EVENT_SSL_OPEN_SERVER:
-                       event_name = "SSLOpenServer";
-                       break;
-               case WAIT_EVENT_WAL_SENDER_WAIT_WAL:
-                       event_name = "WalSenderWaitForWAL";
-                       break;
-               case WAIT_EVENT_WAL_SENDER_WRITE_DATA:
-                       event_name = "WalSenderWriteData";
-                       break;
-                       /* no default case, so that compiler will warn */
-       }
-
-       return event_name;
-}
-
-/* ----------
- * pgstat_get_wait_ipc() -
- *
- * Convert WaitEventIPC to string.
- * ----------
- */
-static const char *
-pgstat_get_wait_ipc(WaitEventIPC w)
-{
-       const char *event_name = "unknown wait event";
-
-       switch (w)
-       {
-               case WAIT_EVENT_APPEND_READY:
-                       event_name = "AppendReady";
-                       break;
-               case WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE:
-                       event_name = "BackupWaitWalArchive";
-                       break;
-               case WAIT_EVENT_BGWORKER_SHUTDOWN:
-                       event_name = "BgWorkerShutdown";
-                       break;
-               case WAIT_EVENT_BGWORKER_STARTUP:
-                       event_name = "BgWorkerStartup";
-                       break;
-               case WAIT_EVENT_BTREE_PAGE:
-                       event_name = "BtreePage";
-                       break;
-               case WAIT_EVENT_BUFFER_IO:
-                       event_name = "BufferIO";
-                       break;
-               case WAIT_EVENT_CHECKPOINT_DONE:
-                       event_name = "CheckpointDone";
-                       break;
-               case WAIT_EVENT_CHECKPOINT_START:
-                       event_name = "CheckpointStart";
-                       break;
-               case WAIT_EVENT_EXECUTE_GATHER:
-                       event_name = "ExecuteGather";
-                       break;
-               case WAIT_EVENT_HASH_BATCH_ALLOCATE:
-                       event_name = "HashBatchAllocate";
-                       break;
-               case WAIT_EVENT_HASH_BATCH_ELECT:
-                       event_name = "HashBatchElect";
-                       break;
-               case WAIT_EVENT_HASH_BATCH_LOAD:
-                       event_name = "HashBatchLoad";
-                       break;
-               case WAIT_EVENT_HASH_BUILD_ALLOCATE:
-                       event_name = "HashBuildAllocate";
-                       break;
-               case WAIT_EVENT_HASH_BUILD_ELECT:
-                       event_name = "HashBuildElect";
-                       break;
-               case WAIT_EVENT_HASH_BUILD_HASH_INNER:
-                       event_name = "HashBuildHashInner";
-                       break;
-               case WAIT_EVENT_HASH_BUILD_HASH_OUTER:
-                       event_name = "HashBuildHashOuter";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE:
-                       event_name = "HashGrowBatchesAllocate";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BATCHES_DECIDE:
-                       event_name = "HashGrowBatchesDecide";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BATCHES_ELECT:
-                       event_name = "HashGrowBatchesElect";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BATCHES_FINISH:
-                       event_name = "HashGrowBatchesFinish";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION:
-                       event_name = "HashGrowBatchesRepartition";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE:
-                       event_name = "HashGrowBucketsAllocate";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BUCKETS_ELECT:
-                       event_name = "HashGrowBucketsElect";
-                       break;
-               case WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT:
-                       event_name = "HashGrowBucketsReinsert";
-                       break;
-               case WAIT_EVENT_LOGICAL_SYNC_DATA:
-                       event_name = "LogicalSyncData";
-                       break;
-               case WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE:
-                       event_name = "LogicalSyncStateChange";
-                       break;
-               case WAIT_EVENT_MQ_INTERNAL:
-                       event_name = "MessageQueueInternal";
-                       break;
-               case WAIT_EVENT_MQ_PUT_MESSAGE:
-                       event_name = "MessageQueuePutMessage";
-                       break;
-               case WAIT_EVENT_MQ_RECEIVE:
-                       event_name = "MessageQueueReceive";
-                       break;
-               case WAIT_EVENT_MQ_SEND:
-                       event_name = "MessageQueueSend";
-                       break;
-               case WAIT_EVENT_PARALLEL_BITMAP_SCAN:
-                       event_name = "ParallelBitmapScan";
-                       break;
-               case WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN:
-                       event_name = "ParallelCreateIndexScan";
-                       break;
-               case WAIT_EVENT_PARALLEL_FINISH:
-                       event_name = "ParallelFinish";
-                       break;
-               case WAIT_EVENT_PROCARRAY_GROUP_UPDATE:
-                       event_name = "ProcArrayGroupUpdate";
-                       break;
-               case WAIT_EVENT_PROC_SIGNAL_BARRIER:
-                       event_name = "ProcSignalBarrier";
-                       break;
-               case WAIT_EVENT_PROMOTE:
-                       event_name = "Promote";
-                       break;
-               case WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT:
-                       event_name = "RecoveryConflictSnapshot";
-                       break;
-               case WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE:
-                       event_name = "RecoveryConflictTablespace";
-                       break;
-               case WAIT_EVENT_RECOVERY_PAUSE:
-                       event_name = "RecoveryPause";
-                       break;
-               case WAIT_EVENT_REPLICATION_ORIGIN_DROP:
-                       event_name = "ReplicationOriginDrop";
-                       break;
-               case WAIT_EVENT_REPLICATION_SLOT_DROP:
-                       event_name = "ReplicationSlotDrop";
-                       break;
-               case WAIT_EVENT_SAFE_SNAPSHOT:
-                       event_name = "SafeSnapshot";
-                       break;
-               case WAIT_EVENT_SYNC_REP:
-                       event_name = "SyncRep";
-                       break;
-               case WAIT_EVENT_WAL_RECEIVER_EXIT:
-                       event_name = "WalReceiverExit";
-                       break;
-               case WAIT_EVENT_WAL_RECEIVER_WAIT_START:
-                       event_name = "WalReceiverWaitStart";
-                       break;
-               case WAIT_EVENT_XACT_GROUP_UPDATE:
-                       event_name = "XactGroupUpdate";
-                       break;
-                       /* no default case, so that compiler will warn */
-       }
-
-       return event_name;
-}
-
-/* ----------
- * pgstat_get_wait_timeout() -
- *
- * Convert WaitEventTimeout to string.
- * ----------
- */
-static const char *
-pgstat_get_wait_timeout(WaitEventTimeout w)
-{
-       const char *event_name = "unknown wait event";
-
-       switch (w)
-       {
-               case WAIT_EVENT_BASE_BACKUP_THROTTLE:
-                       event_name = "BaseBackupThrottle";
-                       break;
-               case WAIT_EVENT_PG_SLEEP:
-                       event_name = "PgSleep";
-                       break;
-               case WAIT_EVENT_RECOVERY_APPLY_DELAY:
-                       event_name = "RecoveryApplyDelay";
-                       break;
-               case WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL:
-                       event_name = "RecoveryRetrieveRetryInterval";
-                       break;
-               case WAIT_EVENT_VACUUM_DELAY:
-                       event_name = "VacuumDelay";
-                       break;
-                       /* no default case, so that compiler will warn */
-       }
-
-       return event_name;
-}
-
-/* ----------
- * pgstat_get_wait_io() -
- *
- * Convert WaitEventIO to string.
- * ----------
- */
-static const char *
-pgstat_get_wait_io(WaitEventIO w)
-{
-       const char *event_name = "unknown wait event";
-
-       switch (w)
-       {
-               case WAIT_EVENT_BASEBACKUP_READ:
-                       event_name = "BaseBackupRead";
-                       break;
-               case WAIT_EVENT_BUFFILE_READ:
-                       event_name = "BufFileRead";
-                       break;
-               case WAIT_EVENT_BUFFILE_WRITE:
-                       event_name = "BufFileWrite";
-                       break;
-               case WAIT_EVENT_BUFFILE_TRUNCATE:
-                       event_name = "BufFileTruncate";
-                       break;
-               case WAIT_EVENT_CONTROL_FILE_READ:
-                       event_name = "ControlFileRead";
-                       break;
-               case WAIT_EVENT_CONTROL_FILE_SYNC:
-                       event_name = "ControlFileSync";
-                       break;
-               case WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE:
-                       event_name = "ControlFileSyncUpdate";
-                       break;
-               case WAIT_EVENT_CONTROL_FILE_WRITE:
-                       event_name = "ControlFileWrite";
-                       break;
-               case WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE:
-                       event_name = "ControlFileWriteUpdate";
-                       break;
-               case WAIT_EVENT_COPY_FILE_READ:
-                       event_name = "CopyFileRead";
-                       break;
-               case WAIT_EVENT_COPY_FILE_WRITE:
-                       event_name = "CopyFileWrite";
-                       break;
-               case WAIT_EVENT_DATA_FILE_EXTEND:
-                       event_name = "DataFileExtend";
-                       break;
-               case WAIT_EVENT_DATA_FILE_FLUSH:
-                       event_name = "DataFileFlush";
-                       break;
-               case WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC:
-                       event_name = "DataFileImmediateSync";
-                       break;
-               case WAIT_EVENT_DATA_FILE_PREFETCH:
-                       event_name = "DataFilePrefetch";
-                       break;
-               case WAIT_EVENT_DATA_FILE_READ:
-                       event_name = "DataFileRead";
-                       break;
-               case WAIT_EVENT_DATA_FILE_SYNC:
-                       event_name = "DataFileSync";
-                       break;
-               case WAIT_EVENT_DATA_FILE_TRUNCATE:
-                       event_name = "DataFileTruncate";
-                       break;
-               case WAIT_EVENT_DATA_FILE_WRITE:
-                       event_name = "DataFileWrite";
-                       break;
-               case WAIT_EVENT_DSM_FILL_ZERO_WRITE:
-                       event_name = "DSMFillZeroWrite";
-                       break;
-               case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ:
-                       event_name = "LockFileAddToDataDirRead";
-                       break;
-               case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC:
-                       event_name = "LockFileAddToDataDirSync";
-                       break;
-               case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE:
-                       event_name = "LockFileAddToDataDirWrite";
-                       break;
-               case WAIT_EVENT_LOCK_FILE_CREATE_READ:
-                       event_name = "LockFileCreateRead";
-                       break;
-               case WAIT_EVENT_LOCK_FILE_CREATE_SYNC:
-                       event_name = "LockFileCreateSync";
-                       break;
-               case WAIT_EVENT_LOCK_FILE_CREATE_WRITE:
-                       event_name = "LockFileCreateWrite";
-                       break;
-               case WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ:
-                       event_name = "LockFileReCheckDataDirRead";
-                       break;
-               case WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC:
-                       event_name = "LogicalRewriteCheckpointSync";
-                       break;
-               case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC:
-                       event_name = "LogicalRewriteMappingSync";
-                       break;
-               case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE:
-                       event_name = "LogicalRewriteMappingWrite";
-                       break;
-               case WAIT_EVENT_LOGICAL_REWRITE_SYNC:
-                       event_name = "LogicalRewriteSync";
-                       break;
-               case WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE:
-                       event_name = "LogicalRewriteTruncate";
-                       break;
-               case WAIT_EVENT_LOGICAL_REWRITE_WRITE:
-                       event_name = "LogicalRewriteWrite";
-                       break;
-               case WAIT_EVENT_RELATION_MAP_READ:
-                       event_name = "RelationMapRead";
-                       break;
-               case WAIT_EVENT_RELATION_MAP_SYNC:
-                       event_name = "RelationMapSync";
-                       break;
-               case WAIT_EVENT_RELATION_MAP_WRITE:
-                       event_name = "RelationMapWrite";
-                       break;
-               case WAIT_EVENT_REORDER_BUFFER_READ:
-                       event_name = "ReorderBufferRead";
-                       break;
-               case WAIT_EVENT_REORDER_BUFFER_WRITE:
-                       event_name = "ReorderBufferWrite";
-                       break;
-               case WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ:
-                       event_name = "ReorderLogicalMappingRead";
-                       break;
-               case WAIT_EVENT_REPLICATION_SLOT_READ:
-                       event_name = "ReplicationSlotRead";
-                       break;
-               case WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC:
-                       event_name = "ReplicationSlotRestoreSync";
-                       break;
-               case WAIT_EVENT_REPLICATION_SLOT_SYNC:
-                       event_name = "ReplicationSlotSync";
-                       break;
-               case WAIT_EVENT_REPLICATION_SLOT_WRITE:
-                       event_name = "ReplicationSlotWrite";
-                       break;
-               case WAIT_EVENT_SLRU_FLUSH_SYNC:
-                       event_name = "SLRUFlushSync";
-                       break;
-               case WAIT_EVENT_SLRU_READ:
-                       event_name = "SLRURead";
-                       break;
-               case WAIT_EVENT_SLRU_SYNC:
-                       event_name = "SLRUSync";
-                       break;
-               case WAIT_EVENT_SLRU_WRITE:
-                       event_name = "SLRUWrite";
-                       break;
-               case WAIT_EVENT_SNAPBUILD_READ:
-                       event_name = "SnapbuildRead";
-                       break;
-               case WAIT_EVENT_SNAPBUILD_SYNC:
-                       event_name = "SnapbuildSync";
-                       break;
-               case WAIT_EVENT_SNAPBUILD_WRITE:
-                       event_name = "SnapbuildWrite";
-                       break;
-               case WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC:
-                       event_name = "TimelineHistoryFileSync";
-                       break;
-               case WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE:
-                       event_name = "TimelineHistoryFileWrite";
-                       break;
-               case WAIT_EVENT_TIMELINE_HISTORY_READ:
-                       event_name = "TimelineHistoryRead";
-                       break;
-               case WAIT_EVENT_TIMELINE_HISTORY_SYNC:
-                       event_name = "TimelineHistorySync";
-                       break;
-               case WAIT_EVENT_TIMELINE_HISTORY_WRITE:
-                       event_name = "TimelineHistoryWrite";
-                       break;
-               case WAIT_EVENT_TWOPHASE_FILE_READ:
-                       event_name = "TwophaseFileRead";
-                       break;
-               case WAIT_EVENT_TWOPHASE_FILE_SYNC:
-                       event_name = "TwophaseFileSync";
-                       break;
-               case WAIT_EVENT_TWOPHASE_FILE_WRITE:
-                       event_name = "TwophaseFileWrite";
-                       break;
-               case WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ:
-                       event_name = "WALSenderTimelineHistoryRead";
-                       break;
-               case WAIT_EVENT_WAL_BOOTSTRAP_SYNC:
-                       event_name = "WALBootstrapSync";
-                       break;
-               case WAIT_EVENT_WAL_BOOTSTRAP_WRITE:
-                       event_name = "WALBootstrapWrite";
-                       break;
-               case WAIT_EVENT_WAL_COPY_READ:
-                       event_name = "WALCopyRead";
-                       break;
-               case WAIT_EVENT_WAL_COPY_SYNC:
-                       event_name = "WALCopySync";
-                       break;
-               case WAIT_EVENT_WAL_COPY_WRITE:
-                       event_name = "WALCopyWrite";
-                       break;
-               case WAIT_EVENT_WAL_INIT_SYNC:
-                       event_name = "WALInitSync";
-                       break;
-               case WAIT_EVENT_WAL_INIT_WRITE:
-                       event_name = "WALInitWrite";
-                       break;
-               case WAIT_EVENT_WAL_READ:
-                       event_name = "WALRead";
-                       break;
-               case WAIT_EVENT_WAL_SYNC:
-                       event_name = "WALSync";
-                       break;
-               case WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN:
-                       event_name = "WALSyncMethodAssign";
-                       break;
-               case WAIT_EVENT_WAL_WRITE:
-                       event_name = "WALWrite";
-                       break;
-               case WAIT_EVENT_LOGICAL_CHANGES_READ:
-                       event_name = "LogicalChangesRead";
-                       break;
-               case WAIT_EVENT_LOGICAL_CHANGES_WRITE:
-                       event_name = "LogicalChangesWrite";
-                       break;
-               case WAIT_EVENT_LOGICAL_SUBXACT_READ:
-                       event_name = "LogicalSubxactRead";
-                       break;
-               case WAIT_EVENT_LOGICAL_SUBXACT_WRITE:
-                       event_name = "LogicalSubxactWrite";
-                       break;
-
-                       /* no default case, so that compiler will warn */
-       }
-
-       return event_name;
-}
-
-
 /* ----------
  * pgstat_get_backend_current_activity() -
  *
index 26e07100a5d13e15748495d45a43dea835c2ab74..59b22552606fde676cad452a5b7dfdb6eacd1de3 100644 (file)
@@ -14,7 +14,20 @@ top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
 OBJS        = fmgrtab.o
-SUBDIRS     = adt cache error fmgr hash init mb misc mmgr resowner sort time
+SUBDIRS     = \
+       activity \
+       adt \
+       cache \
+       error \
+       fmgr \
+       hash \
+       init \
+       mb \
+       misc \
+       mmgr \
+       resowner \
+       sort \
+       time
 
 # location of Catalog.pm
 catalogdir  = $(top_srcdir)/src/backend/catalog
diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile
new file mode 100644 (file)
index 0000000..7cbe0cd
--- /dev/null
@@ -0,0 +1,19 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for backend/utils/activity
+#
+# Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/backend/utils/activity/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/activity
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+       wait_event.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c
new file mode 100644 (file)
index 0000000..840ebef
--- /dev/null
@@ -0,0 +1,690 @@
+/* ----------
+ * wait_event.c
+ *       Wait event reporting infrastructure.
+ *
+ * Copyright (c) 2001-2021, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ *       src/backend/postmaster/wait_event.c
+ * ----------
+ */
+#include "postgres.h"
+
+#include "storage/lmgr.h" /* for GetLockNameFromTagType */
+#include "storage/lwlock.h" /* for GetLWLockIdentifier */
+#include "utils/wait_event.h"
+
+
+static const char *pgstat_get_wait_activity(WaitEventActivity w);
+static const char *pgstat_get_wait_client(WaitEventClient w);
+static const char *pgstat_get_wait_ipc(WaitEventIPC w);
+static const char *pgstat_get_wait_timeout(WaitEventTimeout w);
+static const char *pgstat_get_wait_io(WaitEventIO w);
+
+
+/* ----------
+ * pgstat_get_wait_event_type() -
+ *
+ *     Return a string representing the current wait event type, backend is
+ *     waiting on.
+ */
+const char *
+pgstat_get_wait_event_type(uint32 wait_event_info)
+{
+       uint32          classId;
+       const char *event_type;
+
+       /* report process as not waiting. */
+       if (wait_event_info == 0)
+               return NULL;
+
+       classId = wait_event_info & 0xFF000000;
+
+       switch (classId)
+       {
+               case PG_WAIT_LWLOCK:
+                       event_type = "LWLock";
+                       break;
+               case PG_WAIT_LOCK:
+                       event_type = "Lock";
+                       break;
+               case PG_WAIT_BUFFER_PIN:
+                       event_type = "BufferPin";
+                       break;
+               case PG_WAIT_ACTIVITY:
+                       event_type = "Activity";
+                       break;
+               case PG_WAIT_CLIENT:
+                       event_type = "Client";
+                       break;
+               case PG_WAIT_EXTENSION:
+                       event_type = "Extension";
+                       break;
+               case PG_WAIT_IPC:
+                       event_type = "IPC";
+                       break;
+               case PG_WAIT_TIMEOUT:
+                       event_type = "Timeout";
+                       break;
+               case PG_WAIT_IO:
+                       event_type = "IO";
+                       break;
+               default:
+                       event_type = "???";
+                       break;
+       }
+
+       return event_type;
+}
+
+/* ----------
+ * pgstat_get_wait_event() -
+ *
+ *     Return a string representing the current wait event, backend is
+ *     waiting on.
+ */
+const char *
+pgstat_get_wait_event(uint32 wait_event_info)
+{
+       uint32          classId;
+       uint16          eventId;
+       const char *event_name;
+
+       /* report process as not waiting. */
+       if (wait_event_info == 0)
+               return NULL;
+
+       classId = wait_event_info & 0xFF000000;
+       eventId = wait_event_info & 0x0000FFFF;
+
+       switch (classId)
+       {
+               case PG_WAIT_LWLOCK:
+                       event_name = GetLWLockIdentifier(classId, eventId);
+                       break;
+               case PG_WAIT_LOCK:
+                       event_name = GetLockNameFromTagType(eventId);
+                       break;
+               case PG_WAIT_BUFFER_PIN:
+                       event_name = "BufferPin";
+                       break;
+               case PG_WAIT_ACTIVITY:
+                       {
+                               WaitEventActivity w = (WaitEventActivity) wait_event_info;
+
+                               event_name = pgstat_get_wait_activity(w);
+                               break;
+                       }
+               case PG_WAIT_CLIENT:
+                       {
+                               WaitEventClient w = (WaitEventClient) wait_event_info;
+
+                               event_name = pgstat_get_wait_client(w);
+                               break;
+                       }
+               case PG_WAIT_EXTENSION:
+                       event_name = "Extension";
+                       break;
+               case PG_WAIT_IPC:
+                       {
+                               WaitEventIPC w = (WaitEventIPC) wait_event_info;
+
+                               event_name = pgstat_get_wait_ipc(w);
+                               break;
+                       }
+               case PG_WAIT_TIMEOUT:
+                       {
+                               WaitEventTimeout w = (WaitEventTimeout) wait_event_info;
+
+                               event_name = pgstat_get_wait_timeout(w);
+                               break;
+                       }
+               case PG_WAIT_IO:
+                       {
+                               WaitEventIO w = (WaitEventIO) wait_event_info;
+
+                               event_name = pgstat_get_wait_io(w);
+                               break;
+                       }
+               default:
+                       event_name = "unknown wait event";
+                       break;
+       }
+
+       return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_activity() -
+ *
+ * Convert WaitEventActivity to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_activity(WaitEventActivity w)
+{
+       const char *event_name = "unknown wait event";
+
+       switch (w)
+       {
+               case WAIT_EVENT_ARCHIVER_MAIN:
+                       event_name = "ArchiverMain";
+                       break;
+               case WAIT_EVENT_AUTOVACUUM_MAIN:
+                       event_name = "AutoVacuumMain";
+                       break;
+               case WAIT_EVENT_BGWRITER_HIBERNATE:
+                       event_name = "BgWriterHibernate";
+                       break;
+               case WAIT_EVENT_BGWRITER_MAIN:
+                       event_name = "BgWriterMain";
+                       break;
+               case WAIT_EVENT_CHECKPOINTER_MAIN:
+                       event_name = "CheckpointerMain";
+                       break;
+               case WAIT_EVENT_LOGICAL_APPLY_MAIN:
+                       event_name = "LogicalApplyMain";
+                       break;
+               case WAIT_EVENT_LOGICAL_LAUNCHER_MAIN:
+                       event_name = "LogicalLauncherMain";
+                       break;
+               case WAIT_EVENT_PGSTAT_MAIN:
+                       event_name = "PgStatMain";
+                       break;
+               case WAIT_EVENT_RECOVERY_WAL_STREAM:
+                       event_name = "RecoveryWalStream";
+                       break;
+               case WAIT_EVENT_SYSLOGGER_MAIN:
+                       event_name = "SysLoggerMain";
+                       break;
+               case WAIT_EVENT_WAL_RECEIVER_MAIN:
+                       event_name = "WalReceiverMain";
+                       break;
+               case WAIT_EVENT_WAL_SENDER_MAIN:
+                       event_name = "WalSenderMain";
+                       break;
+               case WAIT_EVENT_WAL_WRITER_MAIN:
+                       event_name = "WalWriterMain";
+                       break;
+                       /* no default case, so that compiler will warn */
+       }
+
+       return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_client() -
+ *
+ * Convert WaitEventClient to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_client(WaitEventClient w)
+{
+       const char *event_name = "unknown wait event";
+
+       switch (w)
+       {
+               case WAIT_EVENT_CLIENT_READ:
+                       event_name = "ClientRead";
+                       break;
+               case WAIT_EVENT_CLIENT_WRITE:
+                       event_name = "ClientWrite";
+                       break;
+               case WAIT_EVENT_GSS_OPEN_SERVER:
+                       event_name = "GSSOpenServer";
+                       break;
+               case WAIT_EVENT_LIBPQWALRECEIVER_CONNECT:
+                       event_name = "LibPQWalReceiverConnect";
+                       break;
+               case WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE:
+                       event_name = "LibPQWalReceiverReceive";
+                       break;
+               case WAIT_EVENT_SSL_OPEN_SERVER:
+                       event_name = "SSLOpenServer";
+                       break;
+               case WAIT_EVENT_WAL_SENDER_WAIT_WAL:
+                       event_name = "WalSenderWaitForWAL";
+                       break;
+               case WAIT_EVENT_WAL_SENDER_WRITE_DATA:
+                       event_name = "WalSenderWriteData";
+                       break;
+                       /* no default case, so that compiler will warn */
+       }
+
+       return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_ipc() -
+ *
+ * Convert WaitEventIPC to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_ipc(WaitEventIPC w)
+{
+       const char *event_name = "unknown wait event";
+
+       switch (w)
+       {
+               case WAIT_EVENT_APPEND_READY:
+                       event_name = "AppendReady";
+                       break;
+               case WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE:
+                       event_name = "BackupWaitWalArchive";
+                       break;
+               case WAIT_EVENT_BGWORKER_SHUTDOWN:
+                       event_name = "BgWorkerShutdown";
+                       break;
+               case WAIT_EVENT_BGWORKER_STARTUP:
+                       event_name = "BgWorkerStartup";
+                       break;
+               case WAIT_EVENT_BTREE_PAGE:
+                       event_name = "BtreePage";
+                       break;
+               case WAIT_EVENT_BUFFER_IO:
+                       event_name = "BufferIO";
+                       break;
+               case WAIT_EVENT_CHECKPOINT_DONE:
+                       event_name = "CheckpointDone";
+                       break;
+               case WAIT_EVENT_CHECKPOINT_START:
+                       event_name = "CheckpointStart";
+                       break;
+               case WAIT_EVENT_EXECUTE_GATHER:
+                       event_name = "ExecuteGather";
+                       break;
+               case WAIT_EVENT_HASH_BATCH_ALLOCATE:
+                       event_name = "HashBatchAllocate";
+                       break;
+               case WAIT_EVENT_HASH_BATCH_ELECT:
+                       event_name = "HashBatchElect";
+                       break;
+               case WAIT_EVENT_HASH_BATCH_LOAD:
+                       event_name = "HashBatchLoad";
+                       break;
+               case WAIT_EVENT_HASH_BUILD_ALLOCATE:
+                       event_name = "HashBuildAllocate";
+                       break;
+               case WAIT_EVENT_HASH_BUILD_ELECT:
+                       event_name = "HashBuildElect";
+                       break;
+               case WAIT_EVENT_HASH_BUILD_HASH_INNER:
+                       event_name = "HashBuildHashInner";
+                       break;
+               case WAIT_EVENT_HASH_BUILD_HASH_OUTER:
+                       event_name = "HashBuildHashOuter";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE:
+                       event_name = "HashGrowBatchesAllocate";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BATCHES_DECIDE:
+                       event_name = "HashGrowBatchesDecide";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BATCHES_ELECT:
+                       event_name = "HashGrowBatchesElect";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BATCHES_FINISH:
+                       event_name = "HashGrowBatchesFinish";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION:
+                       event_name = "HashGrowBatchesRepartition";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE:
+                       event_name = "HashGrowBucketsAllocate";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BUCKETS_ELECT:
+                       event_name = "HashGrowBucketsElect";
+                       break;
+               case WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT:
+                       event_name = "HashGrowBucketsReinsert";
+                       break;
+               case WAIT_EVENT_LOGICAL_SYNC_DATA:
+                       event_name = "LogicalSyncData";
+                       break;
+               case WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE:
+                       event_name = "LogicalSyncStateChange";
+                       break;
+               case WAIT_EVENT_MQ_INTERNAL:
+                       event_name = "MessageQueueInternal";
+                       break;
+               case WAIT_EVENT_MQ_PUT_MESSAGE:
+                       event_name = "MessageQueuePutMessage";
+                       break;
+               case WAIT_EVENT_MQ_RECEIVE:
+                       event_name = "MessageQueueReceive";
+                       break;
+               case WAIT_EVENT_MQ_SEND:
+                       event_name = "MessageQueueSend";
+                       break;
+               case WAIT_EVENT_PARALLEL_BITMAP_SCAN:
+                       event_name = "ParallelBitmapScan";
+                       break;
+               case WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN:
+                       event_name = "ParallelCreateIndexScan";
+                       break;
+               case WAIT_EVENT_PARALLEL_FINISH:
+                       event_name = "ParallelFinish";
+                       break;
+               case WAIT_EVENT_PROCARRAY_GROUP_UPDATE:
+                       event_name = "ProcArrayGroupUpdate";
+                       break;
+               case WAIT_EVENT_PROC_SIGNAL_BARRIER:
+                       event_name = "ProcSignalBarrier";
+                       break;
+               case WAIT_EVENT_PROMOTE:
+                       event_name = "Promote";
+                       break;
+               case WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT:
+                       event_name = "RecoveryConflictSnapshot";
+                       break;
+               case WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE:
+                       event_name = "RecoveryConflictTablespace";
+                       break;
+               case WAIT_EVENT_RECOVERY_PAUSE:
+                       event_name = "RecoveryPause";
+                       break;
+               case WAIT_EVENT_REPLICATION_ORIGIN_DROP:
+                       event_name = "ReplicationOriginDrop";
+                       break;
+               case WAIT_EVENT_REPLICATION_SLOT_DROP:
+                       event_name = "ReplicationSlotDrop";
+                       break;
+               case WAIT_EVENT_SAFE_SNAPSHOT:
+                       event_name = "SafeSnapshot";
+                       break;
+               case WAIT_EVENT_SYNC_REP:
+                       event_name = "SyncRep";
+                       break;
+               case WAIT_EVENT_WAL_RECEIVER_EXIT:
+                       event_name = "WalReceiverExit";
+                       break;
+               case WAIT_EVENT_WAL_RECEIVER_WAIT_START:
+                       event_name = "WalReceiverWaitStart";
+                       break;
+               case WAIT_EVENT_XACT_GROUP_UPDATE:
+                       event_name = "XactGroupUpdate";
+                       break;
+                       /* no default case, so that compiler will warn */
+       }
+
+       return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_timeout() -
+ *
+ * Convert WaitEventTimeout to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_timeout(WaitEventTimeout w)
+{
+       const char *event_name = "unknown wait event";
+
+       switch (w)
+       {
+               case WAIT_EVENT_BASE_BACKUP_THROTTLE:
+                       event_name = "BaseBackupThrottle";
+                       break;
+               case WAIT_EVENT_PG_SLEEP:
+                       event_name = "PgSleep";
+                       break;
+               case WAIT_EVENT_RECOVERY_APPLY_DELAY:
+                       event_name = "RecoveryApplyDelay";
+                       break;
+               case WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL:
+                       event_name = "RecoveryRetrieveRetryInterval";
+                       break;
+               case WAIT_EVENT_VACUUM_DELAY:
+                       event_name = "VacuumDelay";
+                       break;
+                       /* no default case, so that compiler will warn */
+       }
+
+       return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_io() -
+ *
+ * Convert WaitEventIO to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_io(WaitEventIO w)
+{
+       const char *event_name = "unknown wait event";
+
+       switch (w)
+       {
+               case WAIT_EVENT_BASEBACKUP_READ:
+                       event_name = "BaseBackupRead";
+                       break;
+               case WAIT_EVENT_BUFFILE_READ:
+                       event_name = "BufFileRead";
+                       break;
+               case WAIT_EVENT_BUFFILE_WRITE:
+                       event_name = "BufFileWrite";
+                       break;
+               case WAIT_EVENT_BUFFILE_TRUNCATE:
+                       event_name = "BufFileTruncate";
+                       break;
+               case WAIT_EVENT_CONTROL_FILE_READ:
+                       event_name = "ControlFileRead";
+                       break;
+               case WAIT_EVENT_CONTROL_FILE_SYNC:
+                       event_name = "ControlFileSync";
+                       break;
+               case WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE:
+                       event_name = "ControlFileSyncUpdate";
+                       break;
+               case WAIT_EVENT_CONTROL_FILE_WRITE:
+                       event_name = "ControlFileWrite";
+                       break;
+               case WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE:
+                       event_name = "ControlFileWriteUpdate";
+                       break;
+               case WAIT_EVENT_COPY_FILE_READ:
+                       event_name = "CopyFileRead";
+                       break;
+               case WAIT_EVENT_COPY_FILE_WRITE:
+                       event_name = "CopyFileWrite";
+                       break;
+               case WAIT_EVENT_DATA_FILE_EXTEND:
+                       event_name = "DataFileExtend";
+                       break;
+               case WAIT_EVENT_DATA_FILE_FLUSH:
+                       event_name = "DataFileFlush";
+                       break;
+               case WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC:
+                       event_name = "DataFileImmediateSync";
+                       break;
+               case WAIT_EVENT_DATA_FILE_PREFETCH:
+                       event_name = "DataFilePrefetch";
+                       break;
+               case WAIT_EVENT_DATA_FILE_READ:
+                       event_name = "DataFileRead";
+                       break;
+               case WAIT_EVENT_DATA_FILE_SYNC:
+                       event_name = "DataFileSync";
+                       break;
+               case WAIT_EVENT_DATA_FILE_TRUNCATE:
+                       event_name = "DataFileTruncate";
+                       break;
+               case WAIT_EVENT_DATA_FILE_WRITE:
+                       event_name = "DataFileWrite";
+                       break;
+               case WAIT_EVENT_DSM_FILL_ZERO_WRITE:
+                       event_name = "DSMFillZeroWrite";
+                       break;
+               case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ:
+                       event_name = "LockFileAddToDataDirRead";
+                       break;
+               case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC:
+                       event_name = "LockFileAddToDataDirSync";
+                       break;
+               case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE:
+                       event_name = "LockFileAddToDataDirWrite";
+                       break;
+               case WAIT_EVENT_LOCK_FILE_CREATE_READ:
+                       event_name = "LockFileCreateRead";
+                       break;
+               case WAIT_EVENT_LOCK_FILE_CREATE_SYNC:
+                       event_name = "LockFileCreateSync";
+                       break;
+               case WAIT_EVENT_LOCK_FILE_CREATE_WRITE:
+                       event_name = "LockFileCreateWrite";
+                       break;
+               case WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ:
+                       event_name = "LockFileReCheckDataDirRead";
+                       break;
+               case WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC:
+                       event_name = "LogicalRewriteCheckpointSync";
+                       break;
+               case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC:
+                       event_name = "LogicalRewriteMappingSync";
+                       break;
+               case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE:
+                       event_name = "LogicalRewriteMappingWrite";
+                       break;
+               case WAIT_EVENT_LOGICAL_REWRITE_SYNC:
+                       event_name = "LogicalRewriteSync";
+                       break;
+               case WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE:
+                       event_name = "LogicalRewriteTruncate";
+                       break;
+               case WAIT_EVENT_LOGICAL_REWRITE_WRITE:
+                       event_name = "LogicalRewriteWrite";
+                       break;
+               case WAIT_EVENT_RELATION_MAP_READ:
+                       event_name = "RelationMapRead";
+                       break;
+               case WAIT_EVENT_RELATION_MAP_SYNC:
+                       event_name = "RelationMapSync";
+                       break;
+               case WAIT_EVENT_RELATION_MAP_WRITE:
+                       event_name = "RelationMapWrite";
+                       break;
+               case WAIT_EVENT_REORDER_BUFFER_READ:
+                       event_name = "ReorderBufferRead";
+                       break;
+               case WAIT_EVENT_REORDER_BUFFER_WRITE:
+                       event_name = "ReorderBufferWrite";
+                       break;
+               case WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ:
+                       event_name = "ReorderLogicalMappingRead";
+                       break;
+               case WAIT_EVENT_REPLICATION_SLOT_READ:
+                       event_name = "ReplicationSlotRead";
+                       break;
+               case WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC:
+                       event_name = "ReplicationSlotRestoreSync";
+                       break;
+               case WAIT_EVENT_REPLICATION_SLOT_SYNC:
+                       event_name = "ReplicationSlotSync";
+                       break;
+               case WAIT_EVENT_REPLICATION_SLOT_WRITE:
+                       event_name = "ReplicationSlotWrite";
+                       break;
+               case WAIT_EVENT_SLRU_FLUSH_SYNC:
+                       event_name = "SLRUFlushSync";
+                       break;
+               case WAIT_EVENT_SLRU_READ:
+                       event_name = "SLRURead";
+                       break;
+               case WAIT_EVENT_SLRU_SYNC:
+                       event_name = "SLRUSync";
+                       break;
+               case WAIT_EVENT_SLRU_WRITE:
+                       event_name = "SLRUWrite";
+                       break;
+               case WAIT_EVENT_SNAPBUILD_READ:
+                       event_name = "SnapbuildRead";
+                       break;
+               case WAIT_EVENT_SNAPBUILD_SYNC:
+                       event_name = "SnapbuildSync";
+                       break;
+               case WAIT_EVENT_SNAPBUILD_WRITE:
+                       event_name = "SnapbuildWrite";
+                       break;
+               case WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC:
+                       event_name = "TimelineHistoryFileSync";
+                       break;
+               case WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE:
+                       event_name = "TimelineHistoryFileWrite";
+                       break;
+               case WAIT_EVENT_TIMELINE_HISTORY_READ:
+                       event_name = "TimelineHistoryRead";
+                       break;
+               case WAIT_EVENT_TIMELINE_HISTORY_SYNC:
+                       event_name = "TimelineHistorySync";
+                       break;
+               case WAIT_EVENT_TIMELINE_HISTORY_WRITE:
+                       event_name = "TimelineHistoryWrite";
+                       break;
+               case WAIT_EVENT_TWOPHASE_FILE_READ:
+                       event_name = "TwophaseFileRead";
+                       break;
+               case WAIT_EVENT_TWOPHASE_FILE_SYNC:
+                       event_name = "TwophaseFileSync";
+                       break;
+               case WAIT_EVENT_TWOPHASE_FILE_WRITE:
+                       event_name = "TwophaseFileWrite";
+                       break;
+               case WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ:
+                       event_name = "WALSenderTimelineHistoryRead";
+                       break;
+               case WAIT_EVENT_WAL_BOOTSTRAP_SYNC:
+                       event_name = "WALBootstrapSync";
+                       break;
+               case WAIT_EVENT_WAL_BOOTSTRAP_WRITE:
+                       event_name = "WALBootstrapWrite";
+                       break;
+               case WAIT_EVENT_WAL_COPY_READ:
+                       event_name = "WALCopyRead";
+                       break;
+               case WAIT_EVENT_WAL_COPY_SYNC:
+                       event_name = "WALCopySync";
+                       break;
+               case WAIT_EVENT_WAL_COPY_WRITE:
+                       event_name = "WALCopyWrite";
+                       break;
+               case WAIT_EVENT_WAL_INIT_SYNC:
+                       event_name = "WALInitSync";
+                       break;
+               case WAIT_EVENT_WAL_INIT_WRITE:
+                       event_name = "WALInitWrite";
+                       break;
+               case WAIT_EVENT_WAL_READ:
+                       event_name = "WALRead";
+                       break;
+               case WAIT_EVENT_WAL_SYNC:
+                       event_name = "WALSync";
+                       break;
+               case WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN:
+                       event_name = "WALSyncMethodAssign";
+                       break;
+               case WAIT_EVENT_WAL_WRITE:
+                       event_name = "WALWrite";
+                       break;
+               case WAIT_EVENT_LOGICAL_CHANGES_READ:
+                       event_name = "LogicalChangesRead";
+                       break;
+               case WAIT_EVENT_LOGICAL_CHANGES_WRITE:
+                       event_name = "LogicalChangesWrite";
+                       break;
+               case WAIT_EVENT_LOGICAL_SUBXACT_READ:
+                       event_name = "LogicalSubxactRead";
+                       break;
+               case WAIT_EVENT_LOGICAL_SUBXACT_WRITE:
+                       event_name = "LogicalSubxactWrite";
+                       break;
+
+                       /* no default case, so that compiler will warn */
+       }
+
+       return event_name;
+}
index fe6683cf5c8c2c3af6b3795b060569abc531a468..3247c7b8ad0d26420c137765bd72e0ccd548773d 100644 (file)
@@ -17,9 +17,9 @@
 #include "port/atomics.h"
 #include "portability/instr_time.h"
 #include "postmaster/pgarch.h"
-#include "storage/proc.h"
 #include "utils/hsearch.h"
 #include "utils/relcache.h"
+#include "utils/wait_event.h" /* for backward compatibility */
 
 
 /* ----------
@@ -897,222 +897,6 @@ typedef enum BackendState
        STATE_DISABLED
 } BackendState;
 
-
-/* ----------
- * Wait Classes
- * ----------
- */
-#define PG_WAIT_LWLOCK                         0x01000000U
-#define PG_WAIT_LOCK                           0x03000000U
-#define PG_WAIT_BUFFER_PIN                     0x04000000U
-#define PG_WAIT_ACTIVITY                       0x05000000U
-#define PG_WAIT_CLIENT                         0x06000000U
-#define PG_WAIT_EXTENSION                      0x07000000U
-#define PG_WAIT_IPC                                    0x08000000U
-#define PG_WAIT_TIMEOUT                                0x09000000U
-#define PG_WAIT_IO                                     0x0A000000U
-
-/* ----------
- * Wait Events - Activity
- *
- * Use this category when a process is waiting because it has no work to do,
- * unless the "Client" or "Timeout" category describes the situation better.
- * Typically, this should only be used for background processes.
- * ----------
- */
-typedef enum
-{
-       WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY,
-       WAIT_EVENT_AUTOVACUUM_MAIN,
-       WAIT_EVENT_BGWRITER_HIBERNATE,
-       WAIT_EVENT_BGWRITER_MAIN,
-       WAIT_EVENT_CHECKPOINTER_MAIN,
-       WAIT_EVENT_LOGICAL_APPLY_MAIN,
-       WAIT_EVENT_LOGICAL_LAUNCHER_MAIN,
-       WAIT_EVENT_PGSTAT_MAIN,
-       WAIT_EVENT_RECOVERY_WAL_STREAM,
-       WAIT_EVENT_SYSLOGGER_MAIN,
-       WAIT_EVENT_WAL_RECEIVER_MAIN,
-       WAIT_EVENT_WAL_SENDER_MAIN,
-       WAIT_EVENT_WAL_WRITER_MAIN
-} WaitEventActivity;
-
-/* ----------
- * Wait Events - Client
- *
- * Use this category when a process is waiting to send data to or receive data
- * from the frontend process to which it is connected.  This is never used for
- * a background process, which has no client connection.
- * ----------
- */
-typedef enum
-{
-       WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT,
-       WAIT_EVENT_CLIENT_WRITE,
-       WAIT_EVENT_GSS_OPEN_SERVER,
-       WAIT_EVENT_LIBPQWALRECEIVER_CONNECT,
-       WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE,
-       WAIT_EVENT_SSL_OPEN_SERVER,
-       WAIT_EVENT_WAL_SENDER_WAIT_WAL,
-       WAIT_EVENT_WAL_SENDER_WRITE_DATA,
-} WaitEventClient;
-
-/* ----------
- * Wait Events - IPC
- *
- * Use this category when a process cannot complete the work it is doing because
- * it is waiting for a notification from another process.
- * ----------
- */
-typedef enum
-{
-       WAIT_EVENT_APPEND_READY = PG_WAIT_IPC,
-       WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE,
-       WAIT_EVENT_BGWORKER_SHUTDOWN,
-       WAIT_EVENT_BGWORKER_STARTUP,
-       WAIT_EVENT_BTREE_PAGE,
-       WAIT_EVENT_BUFFER_IO,
-       WAIT_EVENT_CHECKPOINT_DONE,
-       WAIT_EVENT_CHECKPOINT_START,
-       WAIT_EVENT_EXECUTE_GATHER,
-       WAIT_EVENT_HASH_BATCH_ALLOCATE,
-       WAIT_EVENT_HASH_BATCH_ELECT,
-       WAIT_EVENT_HASH_BATCH_LOAD,
-       WAIT_EVENT_HASH_BUILD_ALLOCATE,
-       WAIT_EVENT_HASH_BUILD_ELECT,
-       WAIT_EVENT_HASH_BUILD_HASH_INNER,
-       WAIT_EVENT_HASH_BUILD_HASH_OUTER,
-       WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE,
-       WAIT_EVENT_HASH_GROW_BATCHES_DECIDE,
-       WAIT_EVENT_HASH_GROW_BATCHES_ELECT,
-       WAIT_EVENT_HASH_GROW_BATCHES_FINISH,
-       WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION,
-       WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE,
-       WAIT_EVENT_HASH_GROW_BUCKETS_ELECT,
-       WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT,
-       WAIT_EVENT_LOGICAL_SYNC_DATA,
-       WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE,
-       WAIT_EVENT_MQ_INTERNAL,
-       WAIT_EVENT_MQ_PUT_MESSAGE,
-       WAIT_EVENT_MQ_RECEIVE,
-       WAIT_EVENT_MQ_SEND,
-       WAIT_EVENT_PARALLEL_BITMAP_SCAN,
-       WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN,
-       WAIT_EVENT_PARALLEL_FINISH,
-       WAIT_EVENT_PROCARRAY_GROUP_UPDATE,
-       WAIT_EVENT_PROC_SIGNAL_BARRIER,
-       WAIT_EVENT_PROMOTE,
-       WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT,
-       WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE,
-       WAIT_EVENT_RECOVERY_PAUSE,
-       WAIT_EVENT_REPLICATION_ORIGIN_DROP,
-       WAIT_EVENT_REPLICATION_SLOT_DROP,
-       WAIT_EVENT_SAFE_SNAPSHOT,
-       WAIT_EVENT_SYNC_REP,
-       WAIT_EVENT_WAL_RECEIVER_EXIT,
-       WAIT_EVENT_WAL_RECEIVER_WAIT_START,
-       WAIT_EVENT_XACT_GROUP_UPDATE
-} WaitEventIPC;
-
-/* ----------
- * Wait Events - Timeout
- *
- * Use this category when a process is waiting for a timeout to expire.
- * ----------
- */
-typedef enum
-{
-       WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT,
-       WAIT_EVENT_PG_SLEEP,
-       WAIT_EVENT_RECOVERY_APPLY_DELAY,
-       WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL,
-       WAIT_EVENT_VACUUM_DELAY
-} WaitEventTimeout;
-
-/* ----------
- * Wait Events - IO
- *
- * Use this category when a process is waiting for a IO.
- * ----------
- */
-typedef enum
-{
-       WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO,
-       WAIT_EVENT_BUFFILE_READ,
-       WAIT_EVENT_BUFFILE_WRITE,
-       WAIT_EVENT_BUFFILE_TRUNCATE,
-       WAIT_EVENT_CONTROL_FILE_READ,
-       WAIT_EVENT_CONTROL_FILE_SYNC,
-       WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE,
-       WAIT_EVENT_CONTROL_FILE_WRITE,
-       WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE,
-       WAIT_EVENT_COPY_FILE_READ,
-       WAIT_EVENT_COPY_FILE_WRITE,
-       WAIT_EVENT_DATA_FILE_EXTEND,
-       WAIT_EVENT_DATA_FILE_FLUSH,
-       WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC,
-       WAIT_EVENT_DATA_FILE_PREFETCH,
-       WAIT_EVENT_DATA_FILE_READ,
-       WAIT_EVENT_DATA_FILE_SYNC,
-       WAIT_EVENT_DATA_FILE_TRUNCATE,
-       WAIT_EVENT_DATA_FILE_WRITE,
-       WAIT_EVENT_DSM_FILL_ZERO_WRITE,
-       WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ,
-       WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC,
-       WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE,
-       WAIT_EVENT_LOCK_FILE_CREATE_READ,
-       WAIT_EVENT_LOCK_FILE_CREATE_SYNC,
-       WAIT_EVENT_LOCK_FILE_CREATE_WRITE,
-       WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ,
-       WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC,
-       WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC,
-       WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE,
-       WAIT_EVENT_LOGICAL_REWRITE_SYNC,
-       WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE,
-       WAIT_EVENT_LOGICAL_REWRITE_WRITE,
-       WAIT_EVENT_RELATION_MAP_READ,
-       WAIT_EVENT_RELATION_MAP_SYNC,
-       WAIT_EVENT_RELATION_MAP_WRITE,
-       WAIT_EVENT_REORDER_BUFFER_READ,
-       WAIT_EVENT_REORDER_BUFFER_WRITE,
-       WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ,
-       WAIT_EVENT_REPLICATION_SLOT_READ,
-       WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC,
-       WAIT_EVENT_REPLICATION_SLOT_SYNC,
-       WAIT_EVENT_REPLICATION_SLOT_WRITE,
-       WAIT_EVENT_SLRU_FLUSH_SYNC,
-       WAIT_EVENT_SLRU_READ,
-       WAIT_EVENT_SLRU_SYNC,
-       WAIT_EVENT_SLRU_WRITE,
-       WAIT_EVENT_SNAPBUILD_READ,
-       WAIT_EVENT_SNAPBUILD_SYNC,
-       WAIT_EVENT_SNAPBUILD_WRITE,
-       WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC,
-       WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE,
-       WAIT_EVENT_TIMELINE_HISTORY_READ,
-       WAIT_EVENT_TIMELINE_HISTORY_SYNC,
-       WAIT_EVENT_TIMELINE_HISTORY_WRITE,
-       WAIT_EVENT_TWOPHASE_FILE_READ,
-       WAIT_EVENT_TWOPHASE_FILE_SYNC,
-       WAIT_EVENT_TWOPHASE_FILE_WRITE,
-       WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ,
-       WAIT_EVENT_WAL_BOOTSTRAP_SYNC,
-       WAIT_EVENT_WAL_BOOTSTRAP_WRITE,
-       WAIT_EVENT_WAL_COPY_READ,
-       WAIT_EVENT_WAL_COPY_SYNC,
-       WAIT_EVENT_WAL_COPY_WRITE,
-       WAIT_EVENT_WAL_INIT_SYNC,
-       WAIT_EVENT_WAL_INIT_WRITE,
-       WAIT_EVENT_WAL_READ,
-       WAIT_EVENT_WAL_SYNC,
-       WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,
-       WAIT_EVENT_WAL_WRITE,
-       WAIT_EVENT_LOGICAL_CHANGES_READ,
-       WAIT_EVENT_LOGICAL_CHANGES_WRITE,
-       WAIT_EVENT_LOGICAL_SUBXACT_READ,
-       WAIT_EVENT_LOGICAL_SUBXACT_WRITE
-} WaitEventIO;
-
 /* ----------
  * Command type for progress reporting purposes
  * ----------
@@ -1463,8 +1247,6 @@ extern void pgstat_report_activity(BackendState state, const char *cmd_str);
 extern void pgstat_report_tempfile(size_t filesize);
 extern void pgstat_report_appname(const char *appname);
 extern void pgstat_report_xact_timestamp(TimestampTz tstamp);
-extern const char *pgstat_get_wait_event(uint32 wait_event_info);
-extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);
 extern const char *pgstat_get_backend_current_activity(int pid, bool checkUser);
 extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer,
                                                                                                           int buflen);
@@ -1483,60 +1265,6 @@ extern void pgstat_initstats(Relation rel);
 
 extern char *pgstat_clip_activity(const char *raw_activity);
 
-/* ----------
- * pgstat_report_wait_start() -
- *
- *     Called from places where server process needs to wait.  This is called
- *     to report wait event information.  The wait information is stored
- *     as 4-bytes where first byte represents the wait event class (type of
- *     wait, for different types of wait, refer WaitClass) and the next
- *     3-bytes represent the actual wait event.  Currently 2-bytes are used
- *     for wait event which is sufficient for current usage, 1-byte is
- *     reserved for future usage.
- *
- * NB: this *must* be able to survive being called before MyProc has been
- * initialized.
- * ----------
- */
-static inline void
-pgstat_report_wait_start(uint32 wait_event_info)
-{
-       volatile PGPROC *proc = MyProc;
-
-       if (!pgstat_track_activities || !proc)
-               return;
-
-       /*
-        * Since this is a four-byte field which is always read and written as
-        * four-bytes, updates are atomic.
-        */
-       proc->wait_event_info = wait_event_info;
-}
-
-/* ----------
- * pgstat_report_wait_end() -
- *
- *     Called to report end of a wait.
- *
- * NB: this *must* be able to survive being called before MyProc has been
- * initialized.
- * ----------
- */
-static inline void
-pgstat_report_wait_end(void)
-{
-       volatile PGPROC *proc = MyProc;
-
-       if (!pgstat_track_activities || !proc)
-               return;
-
-       /*
-        * Since this is a four-byte field which is always read and written as
-        * four-bytes, updates are atomic.
-        */
-       proc->wait_event_info = 0;
-}
-
 /* nontransactional event counts are simple enough to inline */
 
 #define pgstat_count_heap_scan(rel)                                                                    \
diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h
new file mode 100644 (file)
index 0000000..2c88346
--- /dev/null
@@ -0,0 +1,301 @@
+/*-------------------------------------------------------------------------
+ * wait_event.h
+ *       Definitions related to wait event reporting
+ *
+ * Copyright (c) 2001-2021, PostgreSQL Global Development Group
+ *
+ * src/include/utils/wait_event.h
+ * ----------
+ */
+#ifndef WAIT_EVENT_H
+#define WAIT_EVENT_H
+
+
+#include "storage/proc.h" /* for MyProc */
+
+
+/* ----------
+ * Wait Classes
+ * ----------
+ */
+#define PG_WAIT_LWLOCK                         0x01000000U
+#define PG_WAIT_LOCK                           0x03000000U
+#define PG_WAIT_BUFFER_PIN                     0x04000000U
+#define PG_WAIT_ACTIVITY                       0x05000000U
+#define PG_WAIT_CLIENT                         0x06000000U
+#define PG_WAIT_EXTENSION                      0x07000000U
+#define PG_WAIT_IPC                                    0x08000000U
+#define PG_WAIT_TIMEOUT                                0x09000000U
+#define PG_WAIT_IO                                     0x0A000000U
+
+/* ----------
+ * Wait Events - Activity
+ *
+ * Use this category when a process is waiting because it has no work to do,
+ * unless the "Client" or "Timeout" category describes the situation better.
+ * Typically, this should only be used for background processes.
+ * ----------
+ */
+typedef enum
+{
+       WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY,
+       WAIT_EVENT_AUTOVACUUM_MAIN,
+       WAIT_EVENT_BGWRITER_HIBERNATE,
+       WAIT_EVENT_BGWRITER_MAIN,
+       WAIT_EVENT_CHECKPOINTER_MAIN,
+       WAIT_EVENT_LOGICAL_APPLY_MAIN,
+       WAIT_EVENT_LOGICAL_LAUNCHER_MAIN,
+       WAIT_EVENT_PGSTAT_MAIN,
+       WAIT_EVENT_RECOVERY_WAL_STREAM,
+       WAIT_EVENT_SYSLOGGER_MAIN,
+       WAIT_EVENT_WAL_RECEIVER_MAIN,
+       WAIT_EVENT_WAL_SENDER_MAIN,
+       WAIT_EVENT_WAL_WRITER_MAIN
+} WaitEventActivity;
+
+/* ----------
+ * Wait Events - Client
+ *
+ * Use this category when a process is waiting to send data to or receive data
+ * from the frontend process to which it is connected.  This is never used for
+ * a background process, which has no client connection.
+ * ----------
+ */
+typedef enum
+{
+       WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT,
+       WAIT_EVENT_CLIENT_WRITE,
+       WAIT_EVENT_GSS_OPEN_SERVER,
+       WAIT_EVENT_LIBPQWALRECEIVER_CONNECT,
+       WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE,
+       WAIT_EVENT_SSL_OPEN_SERVER,
+       WAIT_EVENT_WAL_SENDER_WAIT_WAL,
+       WAIT_EVENT_WAL_SENDER_WRITE_DATA,
+} WaitEventClient;
+
+/* ----------
+ * Wait Events - IPC
+ *
+ * Use this category when a process cannot complete the work it is doing because
+ * it is waiting for a notification from another process.
+ * ----------
+ */
+typedef enum
+{
+       WAIT_EVENT_APPEND_READY = PG_WAIT_IPC,
+       WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE,
+       WAIT_EVENT_BGWORKER_SHUTDOWN,
+       WAIT_EVENT_BGWORKER_STARTUP,
+       WAIT_EVENT_BTREE_PAGE,
+       WAIT_EVENT_BUFFER_IO,
+       WAIT_EVENT_CHECKPOINT_DONE,
+       WAIT_EVENT_CHECKPOINT_START,
+       WAIT_EVENT_EXECUTE_GATHER,
+       WAIT_EVENT_HASH_BATCH_ALLOCATE,
+       WAIT_EVENT_HASH_BATCH_ELECT,
+       WAIT_EVENT_HASH_BATCH_LOAD,
+       WAIT_EVENT_HASH_BUILD_ALLOCATE,
+       WAIT_EVENT_HASH_BUILD_ELECT,
+       WAIT_EVENT_HASH_BUILD_HASH_INNER,
+       WAIT_EVENT_HASH_BUILD_HASH_OUTER,
+       WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE,
+       WAIT_EVENT_HASH_GROW_BATCHES_DECIDE,
+       WAIT_EVENT_HASH_GROW_BATCHES_ELECT,
+       WAIT_EVENT_HASH_GROW_BATCHES_FINISH,
+       WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION,
+       WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE,
+       WAIT_EVENT_HASH_GROW_BUCKETS_ELECT,
+       WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT,
+       WAIT_EVENT_LOGICAL_SYNC_DATA,
+       WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE,
+       WAIT_EVENT_MQ_INTERNAL,
+       WAIT_EVENT_MQ_PUT_MESSAGE,
+       WAIT_EVENT_MQ_RECEIVE,
+       WAIT_EVENT_MQ_SEND,
+       WAIT_EVENT_PARALLEL_BITMAP_SCAN,
+       WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN,
+       WAIT_EVENT_PARALLEL_FINISH,
+       WAIT_EVENT_PROCARRAY_GROUP_UPDATE,
+       WAIT_EVENT_PROC_SIGNAL_BARRIER,
+       WAIT_EVENT_PROMOTE,
+       WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT,
+       WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE,
+       WAIT_EVENT_RECOVERY_PAUSE,
+       WAIT_EVENT_REPLICATION_ORIGIN_DROP,
+       WAIT_EVENT_REPLICATION_SLOT_DROP,
+       WAIT_EVENT_SAFE_SNAPSHOT,
+       WAIT_EVENT_SYNC_REP,
+       WAIT_EVENT_WAL_RECEIVER_EXIT,
+       WAIT_EVENT_WAL_RECEIVER_WAIT_START,
+       WAIT_EVENT_XACT_GROUP_UPDATE
+} WaitEventIPC;
+
+/* ----------
+ * Wait Events - Timeout
+ *
+ * Use this category when a process is waiting for a timeout to expire.
+ * ----------
+ */
+typedef enum
+{
+       WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT,
+       WAIT_EVENT_PG_SLEEP,
+       WAIT_EVENT_RECOVERY_APPLY_DELAY,
+       WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL,
+       WAIT_EVENT_VACUUM_DELAY
+} WaitEventTimeout;
+
+/* ----------
+ * Wait Events - IO
+ *
+ * Use this category when a process is waiting for a IO.
+ * ----------
+ */
+typedef enum
+{
+       WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO,
+       WAIT_EVENT_BUFFILE_READ,
+       WAIT_EVENT_BUFFILE_WRITE,
+       WAIT_EVENT_BUFFILE_TRUNCATE,
+       WAIT_EVENT_CONTROL_FILE_READ,
+       WAIT_EVENT_CONTROL_FILE_SYNC,
+       WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE,
+       WAIT_EVENT_CONTROL_FILE_WRITE,
+       WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE,
+       WAIT_EVENT_COPY_FILE_READ,
+       WAIT_EVENT_COPY_FILE_WRITE,
+       WAIT_EVENT_DATA_FILE_EXTEND,
+       WAIT_EVENT_DATA_FILE_FLUSH,
+       WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC,
+       WAIT_EVENT_DATA_FILE_PREFETCH,
+       WAIT_EVENT_DATA_FILE_READ,
+       WAIT_EVENT_DATA_FILE_SYNC,
+       WAIT_EVENT_DATA_FILE_TRUNCATE,
+       WAIT_EVENT_DATA_FILE_WRITE,
+       WAIT_EVENT_DSM_FILL_ZERO_WRITE,
+       WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ,
+       WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC,
+       WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE,
+       WAIT_EVENT_LOCK_FILE_CREATE_READ,
+       WAIT_EVENT_LOCK_FILE_CREATE_SYNC,
+       WAIT_EVENT_LOCK_FILE_CREATE_WRITE,
+       WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ,
+       WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC,
+       WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC,
+       WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE,
+       WAIT_EVENT_LOGICAL_REWRITE_SYNC,
+       WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE,
+       WAIT_EVENT_LOGICAL_REWRITE_WRITE,
+       WAIT_EVENT_RELATION_MAP_READ,
+       WAIT_EVENT_RELATION_MAP_SYNC,
+       WAIT_EVENT_RELATION_MAP_WRITE,
+       WAIT_EVENT_REORDER_BUFFER_READ,
+       WAIT_EVENT_REORDER_BUFFER_WRITE,
+       WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ,
+       WAIT_EVENT_REPLICATION_SLOT_READ,
+       WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC,
+       WAIT_EVENT_REPLICATION_SLOT_SYNC,
+       WAIT_EVENT_REPLICATION_SLOT_WRITE,
+       WAIT_EVENT_SLRU_FLUSH_SYNC,
+       WAIT_EVENT_SLRU_READ,
+       WAIT_EVENT_SLRU_SYNC,
+       WAIT_EVENT_SLRU_WRITE,
+       WAIT_EVENT_SNAPBUILD_READ,
+       WAIT_EVENT_SNAPBUILD_SYNC,
+       WAIT_EVENT_SNAPBUILD_WRITE,
+       WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC,
+       WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE,
+       WAIT_EVENT_TIMELINE_HISTORY_READ,
+       WAIT_EVENT_TIMELINE_HISTORY_SYNC,
+       WAIT_EVENT_TIMELINE_HISTORY_WRITE,
+       WAIT_EVENT_TWOPHASE_FILE_READ,
+       WAIT_EVENT_TWOPHASE_FILE_SYNC,
+       WAIT_EVENT_TWOPHASE_FILE_WRITE,
+       WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ,
+       WAIT_EVENT_WAL_BOOTSTRAP_SYNC,
+       WAIT_EVENT_WAL_BOOTSTRAP_WRITE,
+       WAIT_EVENT_WAL_COPY_READ,
+       WAIT_EVENT_WAL_COPY_SYNC,
+       WAIT_EVENT_WAL_COPY_WRITE,
+       WAIT_EVENT_WAL_INIT_SYNC,
+       WAIT_EVENT_WAL_INIT_WRITE,
+       WAIT_EVENT_WAL_READ,
+       WAIT_EVENT_WAL_SYNC,
+       WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,
+       WAIT_EVENT_WAL_WRITE,
+       WAIT_EVENT_LOGICAL_CHANGES_READ,
+       WAIT_EVENT_LOGICAL_CHANGES_WRITE,
+       WAIT_EVENT_LOGICAL_SUBXACT_READ,
+       WAIT_EVENT_LOGICAL_SUBXACT_WRITE
+} WaitEventIO;
+
+
+extern const char *pgstat_get_wait_event(uint32 wait_event_info);
+extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);
+static inline void pgstat_report_wait_start(uint32 wait_event_info);
+static inline void pgstat_report_wait_end(void);
+
+
+/*
+ * Repeated here for the inline functions because it is declared in pgstat.h,
+ * which includes this header.
+ */
+extern PGDLLIMPORT bool pgstat_track_activities;
+
+
+/* ----------
+ * pgstat_report_wait_start() -
+ *
+ *     Called from places where server process needs to wait.  This is called
+ *     to report wait event information.  The wait information is stored
+ *     as 4-bytes where first byte represents the wait event class (type of
+ *     wait, for different types of wait, refer WaitClass) and the next
+ *     3-bytes represent the actual wait event.  Currently 2-bytes are used
+ *     for wait event which is sufficient for current usage, 1-byte is
+ *     reserved for future usage.
+ *
+ * NB: this *must* be able to survive being called before MyProc has been
+ * initialized.
+ * ----------
+ */
+static inline void
+pgstat_report_wait_start(uint32 wait_event_info)
+{
+       volatile PGPROC *proc = MyProc;
+
+       if (!pgstat_track_activities || !proc)
+               return;
+
+       /*
+        * Since this is a four-byte field which is always read and written as
+        * four-bytes, updates are atomic.
+        */
+       proc->wait_event_info = wait_event_info;
+}
+
+/* ----------
+ * pgstat_report_wait_end() -
+ *
+ *     Called to report end of a wait.
+ *
+ * NB: this *must* be able to survive being called before MyProc has been
+ * initialized.
+ * ----------
+ */
+static inline void
+pgstat_report_wait_end(void)
+{
+       volatile PGPROC *proc = MyProc;
+
+       if (!pgstat_track_activities || !proc)
+               return;
+
+       /*
+        * Since this is a four-byte field which is always read and written as
+        * four-bytes, updates are atomic.
+        */
+       proc->wait_event_info = 0;
+}
+
+
+#endif /* WAIT_EVENT_H */