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