mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
Split wait event related code from pgstat.[ch] into wait_event.[ch].
The wait event related code is independent from the rest of the pgstat.[ch] code, of nontrivial size and changes on a regular basis. Put it into its own set of files. As there doesn't seem to be a good pre-existing directory for code like this, add src/backend/utils/activity. Reviewed-By: Robert Haas <robertmhaas@gmail.com> Discussion: https://postgr.es/m/20210316195440.twxmlov24rr2nxrg@alap3.anarazel.de
This commit is contained in:
parent
1267d9862f
commit
a333476b92
@ -352,12 +352,6 @@ static PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared);
|
|||||||
|
|
||||||
static void pgstat_setup_memcxt(void);
|
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_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype);
|
||||||
static void pgstat_send(void *msg, int len);
|
static void pgstat_send(void *msg, int len);
|
||||||
|
|
||||||
@ -3751,673 +3745,6 @@ pgstat_read_current_status(void)
|
|||||||
localBackendStatusTable = localtable;
|
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() -
|
* pgstat_get_backend_current_activity() -
|
||||||
*
|
*
|
||||||
|
@ -14,7 +14,20 @@ top_builddir = ../../..
|
|||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
|
|
||||||
OBJS = fmgrtab.o
|
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
|
# location of Catalog.pm
|
||||||
catalogdir = $(top_srcdir)/src/backend/catalog
|
catalogdir = $(top_srcdir)/src/backend/catalog
|
||||||
|
19
src/backend/utils/activity/Makefile
Normal file
19
src/backend/utils/activity/Makefile
Normal file
@ -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
|
690
src/backend/utils/activity/wait_event.c
Normal file
690
src/backend/utils/activity/wait_event.c
Normal file
@ -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;
|
||||||
|
}
|
@ -17,9 +17,9 @@
|
|||||||
#include "port/atomics.h"
|
#include "port/atomics.h"
|
||||||
#include "portability/instr_time.h"
|
#include "portability/instr_time.h"
|
||||||
#include "postmaster/pgarch.h"
|
#include "postmaster/pgarch.h"
|
||||||
#include "storage/proc.h"
|
|
||||||
#include "utils/hsearch.h"
|
#include "utils/hsearch.h"
|
||||||
#include "utils/relcache.h"
|
#include "utils/relcache.h"
|
||||||
|
#include "utils/wait_event.h" /* for backward compatibility */
|
||||||
|
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
@ -897,222 +897,6 @@ typedef enum BackendState
|
|||||||
STATE_DISABLED
|
STATE_DISABLED
|
||||||
} BackendState;
|
} 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
|
* Command type for progress reporting purposes
|
||||||
* ----------
|
* ----------
|
||||||
@ -1463,8 +1247,6 @@ extern void pgstat_report_activity(BackendState state, const char *cmd_str);
|
|||||||
extern void pgstat_report_tempfile(size_t filesize);
|
extern void pgstat_report_tempfile(size_t filesize);
|
||||||
extern void pgstat_report_appname(const char *appname);
|
extern void pgstat_report_appname(const char *appname);
|
||||||
extern void pgstat_report_xact_timestamp(TimestampTz tstamp);
|
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_backend_current_activity(int pid, bool checkUser);
|
||||||
extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer,
|
extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer,
|
||||||
int buflen);
|
int buflen);
|
||||||
@ -1483,60 +1265,6 @@ extern void pgstat_initstats(Relation rel);
|
|||||||
|
|
||||||
extern char *pgstat_clip_activity(const char *raw_activity);
|
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 */
|
/* nontransactional event counts are simple enough to inline */
|
||||||
|
|
||||||
#define pgstat_count_heap_scan(rel) \
|
#define pgstat_count_heap_scan(rel) \
|
||||||
|
301
src/include/utils/wait_event.h
Normal file
301
src/include/utils/wait_event.h
Normal file
@ -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…
x
Reference in New Issue
Block a user