mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +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:
@ -17,9 +17,9 @@
|
||||
#include "port/atomics.h"
|
||||
#include "portability/instr_time.h"
|
||||
#include "postmaster/pgarch.h"
|
||||
#include "storage/proc.h"
|
||||
#include "utils/hsearch.h"
|
||||
#include "utils/relcache.h"
|
||||
#include "utils/wait_event.h" /* for backward compatibility */
|
||||
|
||||
|
||||
/* ----------
|
||||
@ -897,222 +897,6 @@ typedef enum BackendState
|
||||
STATE_DISABLED
|
||||
} BackendState;
|
||||
|
||||
|
||||
/* ----------
|
||||
* Wait Classes
|
||||
* ----------
|
||||
*/
|
||||
#define PG_WAIT_LWLOCK 0x01000000U
|
||||
#define PG_WAIT_LOCK 0x03000000U
|
||||
#define PG_WAIT_BUFFER_PIN 0x04000000U
|
||||
#define PG_WAIT_ACTIVITY 0x05000000U
|
||||
#define PG_WAIT_CLIENT 0x06000000U
|
||||
#define PG_WAIT_EXTENSION 0x07000000U
|
||||
#define PG_WAIT_IPC 0x08000000U
|
||||
#define PG_WAIT_TIMEOUT 0x09000000U
|
||||
#define PG_WAIT_IO 0x0A000000U
|
||||
|
||||
/* ----------
|
||||
* Wait Events - Activity
|
||||
*
|
||||
* Use this category when a process is waiting because it has no work to do,
|
||||
* unless the "Client" or "Timeout" category describes the situation better.
|
||||
* Typically, this should only be used for background processes.
|
||||
* ----------
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY,
|
||||
WAIT_EVENT_AUTOVACUUM_MAIN,
|
||||
WAIT_EVENT_BGWRITER_HIBERNATE,
|
||||
WAIT_EVENT_BGWRITER_MAIN,
|
||||
WAIT_EVENT_CHECKPOINTER_MAIN,
|
||||
WAIT_EVENT_LOGICAL_APPLY_MAIN,
|
||||
WAIT_EVENT_LOGICAL_LAUNCHER_MAIN,
|
||||
WAIT_EVENT_PGSTAT_MAIN,
|
||||
WAIT_EVENT_RECOVERY_WAL_STREAM,
|
||||
WAIT_EVENT_SYSLOGGER_MAIN,
|
||||
WAIT_EVENT_WAL_RECEIVER_MAIN,
|
||||
WAIT_EVENT_WAL_SENDER_MAIN,
|
||||
WAIT_EVENT_WAL_WRITER_MAIN
|
||||
} WaitEventActivity;
|
||||
|
||||
/* ----------
|
||||
* Wait Events - Client
|
||||
*
|
||||
* Use this category when a process is waiting to send data to or receive data
|
||||
* from the frontend process to which it is connected. This is never used for
|
||||
* a background process, which has no client connection.
|
||||
* ----------
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT,
|
||||
WAIT_EVENT_CLIENT_WRITE,
|
||||
WAIT_EVENT_GSS_OPEN_SERVER,
|
||||
WAIT_EVENT_LIBPQWALRECEIVER_CONNECT,
|
||||
WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE,
|
||||
WAIT_EVENT_SSL_OPEN_SERVER,
|
||||
WAIT_EVENT_WAL_SENDER_WAIT_WAL,
|
||||
WAIT_EVENT_WAL_SENDER_WRITE_DATA,
|
||||
} WaitEventClient;
|
||||
|
||||
/* ----------
|
||||
* Wait Events - IPC
|
||||
*
|
||||
* Use this category when a process cannot complete the work it is doing because
|
||||
* it is waiting for a notification from another process.
|
||||
* ----------
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
WAIT_EVENT_APPEND_READY = PG_WAIT_IPC,
|
||||
WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE,
|
||||
WAIT_EVENT_BGWORKER_SHUTDOWN,
|
||||
WAIT_EVENT_BGWORKER_STARTUP,
|
||||
WAIT_EVENT_BTREE_PAGE,
|
||||
WAIT_EVENT_BUFFER_IO,
|
||||
WAIT_EVENT_CHECKPOINT_DONE,
|
||||
WAIT_EVENT_CHECKPOINT_START,
|
||||
WAIT_EVENT_EXECUTE_GATHER,
|
||||
WAIT_EVENT_HASH_BATCH_ALLOCATE,
|
||||
WAIT_EVENT_HASH_BATCH_ELECT,
|
||||
WAIT_EVENT_HASH_BATCH_LOAD,
|
||||
WAIT_EVENT_HASH_BUILD_ALLOCATE,
|
||||
WAIT_EVENT_HASH_BUILD_ELECT,
|
||||
WAIT_EVENT_HASH_BUILD_HASH_INNER,
|
||||
WAIT_EVENT_HASH_BUILD_HASH_OUTER,
|
||||
WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE,
|
||||
WAIT_EVENT_HASH_GROW_BATCHES_DECIDE,
|
||||
WAIT_EVENT_HASH_GROW_BATCHES_ELECT,
|
||||
WAIT_EVENT_HASH_GROW_BATCHES_FINISH,
|
||||
WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION,
|
||||
WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE,
|
||||
WAIT_EVENT_HASH_GROW_BUCKETS_ELECT,
|
||||
WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT,
|
||||
WAIT_EVENT_LOGICAL_SYNC_DATA,
|
||||
WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE,
|
||||
WAIT_EVENT_MQ_INTERNAL,
|
||||
WAIT_EVENT_MQ_PUT_MESSAGE,
|
||||
WAIT_EVENT_MQ_RECEIVE,
|
||||
WAIT_EVENT_MQ_SEND,
|
||||
WAIT_EVENT_PARALLEL_BITMAP_SCAN,
|
||||
WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN,
|
||||
WAIT_EVENT_PARALLEL_FINISH,
|
||||
WAIT_EVENT_PROCARRAY_GROUP_UPDATE,
|
||||
WAIT_EVENT_PROC_SIGNAL_BARRIER,
|
||||
WAIT_EVENT_PROMOTE,
|
||||
WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT,
|
||||
WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE,
|
||||
WAIT_EVENT_RECOVERY_PAUSE,
|
||||
WAIT_EVENT_REPLICATION_ORIGIN_DROP,
|
||||
WAIT_EVENT_REPLICATION_SLOT_DROP,
|
||||
WAIT_EVENT_SAFE_SNAPSHOT,
|
||||
WAIT_EVENT_SYNC_REP,
|
||||
WAIT_EVENT_WAL_RECEIVER_EXIT,
|
||||
WAIT_EVENT_WAL_RECEIVER_WAIT_START,
|
||||
WAIT_EVENT_XACT_GROUP_UPDATE
|
||||
} WaitEventIPC;
|
||||
|
||||
/* ----------
|
||||
* Wait Events - Timeout
|
||||
*
|
||||
* Use this category when a process is waiting for a timeout to expire.
|
||||
* ----------
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT,
|
||||
WAIT_EVENT_PG_SLEEP,
|
||||
WAIT_EVENT_RECOVERY_APPLY_DELAY,
|
||||
WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL,
|
||||
WAIT_EVENT_VACUUM_DELAY
|
||||
} WaitEventTimeout;
|
||||
|
||||
/* ----------
|
||||
* Wait Events - IO
|
||||
*
|
||||
* Use this category when a process is waiting for a IO.
|
||||
* ----------
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO,
|
||||
WAIT_EVENT_BUFFILE_READ,
|
||||
WAIT_EVENT_BUFFILE_WRITE,
|
||||
WAIT_EVENT_BUFFILE_TRUNCATE,
|
||||
WAIT_EVENT_CONTROL_FILE_READ,
|
||||
WAIT_EVENT_CONTROL_FILE_SYNC,
|
||||
WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE,
|
||||
WAIT_EVENT_CONTROL_FILE_WRITE,
|
||||
WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE,
|
||||
WAIT_EVENT_COPY_FILE_READ,
|
||||
WAIT_EVENT_COPY_FILE_WRITE,
|
||||
WAIT_EVENT_DATA_FILE_EXTEND,
|
||||
WAIT_EVENT_DATA_FILE_FLUSH,
|
||||
WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC,
|
||||
WAIT_EVENT_DATA_FILE_PREFETCH,
|
||||
WAIT_EVENT_DATA_FILE_READ,
|
||||
WAIT_EVENT_DATA_FILE_SYNC,
|
||||
WAIT_EVENT_DATA_FILE_TRUNCATE,
|
||||
WAIT_EVENT_DATA_FILE_WRITE,
|
||||
WAIT_EVENT_DSM_FILL_ZERO_WRITE,
|
||||
WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ,
|
||||
WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC,
|
||||
WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE,
|
||||
WAIT_EVENT_LOCK_FILE_CREATE_READ,
|
||||
WAIT_EVENT_LOCK_FILE_CREATE_SYNC,
|
||||
WAIT_EVENT_LOCK_FILE_CREATE_WRITE,
|
||||
WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ,
|
||||
WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC,
|
||||
WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC,
|
||||
WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE,
|
||||
WAIT_EVENT_LOGICAL_REWRITE_SYNC,
|
||||
WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE,
|
||||
WAIT_EVENT_LOGICAL_REWRITE_WRITE,
|
||||
WAIT_EVENT_RELATION_MAP_READ,
|
||||
WAIT_EVENT_RELATION_MAP_SYNC,
|
||||
WAIT_EVENT_RELATION_MAP_WRITE,
|
||||
WAIT_EVENT_REORDER_BUFFER_READ,
|
||||
WAIT_EVENT_REORDER_BUFFER_WRITE,
|
||||
WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ,
|
||||
WAIT_EVENT_REPLICATION_SLOT_READ,
|
||||
WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC,
|
||||
WAIT_EVENT_REPLICATION_SLOT_SYNC,
|
||||
WAIT_EVENT_REPLICATION_SLOT_WRITE,
|
||||
WAIT_EVENT_SLRU_FLUSH_SYNC,
|
||||
WAIT_EVENT_SLRU_READ,
|
||||
WAIT_EVENT_SLRU_SYNC,
|
||||
WAIT_EVENT_SLRU_WRITE,
|
||||
WAIT_EVENT_SNAPBUILD_READ,
|
||||
WAIT_EVENT_SNAPBUILD_SYNC,
|
||||
WAIT_EVENT_SNAPBUILD_WRITE,
|
||||
WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC,
|
||||
WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE,
|
||||
WAIT_EVENT_TIMELINE_HISTORY_READ,
|
||||
WAIT_EVENT_TIMELINE_HISTORY_SYNC,
|
||||
WAIT_EVENT_TIMELINE_HISTORY_WRITE,
|
||||
WAIT_EVENT_TWOPHASE_FILE_READ,
|
||||
WAIT_EVENT_TWOPHASE_FILE_SYNC,
|
||||
WAIT_EVENT_TWOPHASE_FILE_WRITE,
|
||||
WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ,
|
||||
WAIT_EVENT_WAL_BOOTSTRAP_SYNC,
|
||||
WAIT_EVENT_WAL_BOOTSTRAP_WRITE,
|
||||
WAIT_EVENT_WAL_COPY_READ,
|
||||
WAIT_EVENT_WAL_COPY_SYNC,
|
||||
WAIT_EVENT_WAL_COPY_WRITE,
|
||||
WAIT_EVENT_WAL_INIT_SYNC,
|
||||
WAIT_EVENT_WAL_INIT_WRITE,
|
||||
WAIT_EVENT_WAL_READ,
|
||||
WAIT_EVENT_WAL_SYNC,
|
||||
WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,
|
||||
WAIT_EVENT_WAL_WRITE,
|
||||
WAIT_EVENT_LOGICAL_CHANGES_READ,
|
||||
WAIT_EVENT_LOGICAL_CHANGES_WRITE,
|
||||
WAIT_EVENT_LOGICAL_SUBXACT_READ,
|
||||
WAIT_EVENT_LOGICAL_SUBXACT_WRITE
|
||||
} WaitEventIO;
|
||||
|
||||
/* ----------
|
||||
* Command type for progress reporting purposes
|
||||
* ----------
|
||||
@ -1463,8 +1247,6 @@ extern void pgstat_report_activity(BackendState state, const char *cmd_str);
|
||||
extern void pgstat_report_tempfile(size_t filesize);
|
||||
extern void pgstat_report_appname(const char *appname);
|
||||
extern void pgstat_report_xact_timestamp(TimestampTz tstamp);
|
||||
extern const char *pgstat_get_wait_event(uint32 wait_event_info);
|
||||
extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);
|
||||
extern const char *pgstat_get_backend_current_activity(int pid, bool checkUser);
|
||||
extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer,
|
||||
int buflen);
|
||||
@ -1483,60 +1265,6 @@ extern void pgstat_initstats(Relation rel);
|
||||
|
||||
extern char *pgstat_clip_activity(const char *raw_activity);
|
||||
|
||||
/* ----------
|
||||
* pgstat_report_wait_start() -
|
||||
*
|
||||
* Called from places where server process needs to wait. This is called
|
||||
* to report wait event information. The wait information is stored
|
||||
* as 4-bytes where first byte represents the wait event class (type of
|
||||
* wait, for different types of wait, refer WaitClass) and the next
|
||||
* 3-bytes represent the actual wait event. Currently 2-bytes are used
|
||||
* for wait event which is sufficient for current usage, 1-byte is
|
||||
* reserved for future usage.
|
||||
*
|
||||
* NB: this *must* be able to survive being called before MyProc has been
|
||||
* initialized.
|
||||
* ----------
|
||||
*/
|
||||
static inline void
|
||||
pgstat_report_wait_start(uint32 wait_event_info)
|
||||
{
|
||||
volatile PGPROC *proc = MyProc;
|
||||
|
||||
if (!pgstat_track_activities || !proc)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Since this is a four-byte field which is always read and written as
|
||||
* four-bytes, updates are atomic.
|
||||
*/
|
||||
proc->wait_event_info = wait_event_info;
|
||||
}
|
||||
|
||||
/* ----------
|
||||
* pgstat_report_wait_end() -
|
||||
*
|
||||
* Called to report end of a wait.
|
||||
*
|
||||
* NB: this *must* be able to survive being called before MyProc has been
|
||||
* initialized.
|
||||
* ----------
|
||||
*/
|
||||
static inline void
|
||||
pgstat_report_wait_end(void)
|
||||
{
|
||||
volatile PGPROC *proc = MyProc;
|
||||
|
||||
if (!pgstat_track_activities || !proc)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Since this is a four-byte field which is always read and written as
|
||||
* four-bytes, updates are atomic.
|
||||
*/
|
||||
proc->wait_event_info = 0;
|
||||
}
|
||||
|
||||
/* nontransactional event counts are simple enough to inline */
|
||||
|
||||
#define pgstat_count_heap_scan(rel) \
|
||||
|
Reference in New Issue
Block a user