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);
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() -
*
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
--- /dev/null
+#-------------------------------------------------------------------------
+#
+# 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
--- /dev/null
+/* ----------
+ * 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;
+}
#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 */
/* ----------
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
* ----------
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);
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) \
--- /dev/null
+/*-------------------------------------------------------------------------
+ * 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 */