mirror of https://github.com/postgres/postgres
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.depull/64/head
parent
1267d9862f
commit
a333476b92
@ -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 |
||||
@ -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; |
||||
} |
||||
@ -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 */ |
||||
Loading…
Reference in new issue