PostgreSQL Source Code  git master
pgstat.h File Reference
#include "datatype/timestamp.h"
#include "libpq/pqcomm.h"
#include "miscadmin.h"
#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 dependency graph for pgstat.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  PgStat_TableCounts
 
struct  PgStat_TableStatus
 
struct  PgStat_TableXactStatus
 
struct  PgStat_MsgHdr
 
struct  PgStat_MsgDummy
 
struct  PgStat_MsgInquiry
 
struct  PgStat_TableEntry
 
struct  PgStat_MsgTabstat
 
struct  PgStat_MsgTabpurge
 
struct  PgStat_MsgDropdb
 
struct  PgStat_MsgResetcounter
 
struct  PgStat_MsgResetsharedcounter
 
struct  PgStat_MsgResetsinglecounter
 
struct  PgStat_MsgResetslrucounter
 
struct  PgStat_MsgAutovacStart
 
struct  PgStat_MsgVacuum
 
struct  PgStat_MsgAnalyze
 
struct  PgStat_MsgArchiver
 
struct  PgStat_MsgBgWriter
 
struct  PgStat_MsgSLRU
 
struct  PgStat_MsgRecoveryConflict
 
struct  PgStat_MsgTempFile
 
struct  PgStat_FunctionCounts
 
struct  PgStat_BackendFunctionEntry
 
struct  PgStat_FunctionEntry
 
struct  PgStat_MsgFuncstat
 
struct  PgStat_MsgFuncpurge
 
struct  PgStat_MsgDeadlock
 
struct  PgStat_MsgChecksumFailure
 
union  PgStat_Msg
 
struct  PgStat_StatDBEntry
 
struct  PgStat_StatTabEntry
 
struct  PgStat_StatFuncEntry
 
struct  PgStat_ArchiverStats
 
struct  PgStat_GlobalStats
 
struct  PgStat_SLRUStats
 
struct  PgBackendSSLStatus
 
struct  PgBackendGSSStatus
 
struct  PgBackendStatus
 
struct  LocalPgBackendStatus
 
struct  PgStat_FunctionCallUsage
 

Macros

#define PGSTAT_STAT_PERMANENT_DIRECTORY   "pg_stat"
 
#define PGSTAT_STAT_PERMANENT_FILENAME   "pg_stat/global.stat"
 
#define PGSTAT_STAT_PERMANENT_TMPFILE   "pg_stat/global.tmp"
 
#define PG_STAT_TMP_DIR   "pg_stat_tmp"
 
#define PGSTAT_MAX_MSG_SIZE   1000
 
#define PGSTAT_MSG_PAYLOAD   (PGSTAT_MAX_MSG_SIZE - sizeof(PgStat_MsgHdr))
 
#define PGSTAT_NUM_TABENTRIES
 
#define PGSTAT_NUM_TABPURGE
 
#define PGSTAT_NUM_FUNCENTRIES
 
#define PGSTAT_NUM_FUNCPURGE
 
#define PGSTAT_FILE_FORMAT_ID   0x01A5BC9D
 
#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
 
#define PGSTAT_NUM_PROGRESS_PARAM   20
 
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
 
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
 
#define pgstat_begin_read_activity(beentry, before_changecount)
 
#define pgstat_end_read_activity(beentry, after_changecount)
 
#define pgstat_read_activity_complete(before_changecount, after_changecount)
 
#define pgstat_count_heap_scan(rel)
 
#define pgstat_count_heap_getnext(rel)
 
#define pgstat_count_heap_fetch(rel)
 
#define pgstat_count_index_scan(rel)
 
#define pgstat_count_index_tuples(rel, n)
 
#define pgstat_count_buffer_read(rel)
 
#define pgstat_count_buffer_hit(rel)
 
#define pgstat_count_buffer_read_time(n)   (pgStatBlockReadTime += (n))
 
#define pgstat_count_buffer_write_time(n)   (pgStatBlockWriteTime += (n))
 

Typedefs

typedef enum TrackFunctionsLevel TrackFunctionsLevel
 
typedef enum StatMsgType StatMsgType
 
typedef int64 PgStat_Counter
 
typedef struct PgStat_TableCounts PgStat_TableCounts
 
typedef enum PgStat_Shared_Reset_Target PgStat_Shared_Reset_Target
 
typedef enum PgStat_Single_Reset_Type PgStat_Single_Reset_Type
 
typedef struct PgStat_TableStatus PgStat_TableStatus
 
typedef struct PgStat_TableXactStatus PgStat_TableXactStatus
 
typedef struct PgStat_MsgHdr PgStat_MsgHdr
 
typedef struct PgStat_MsgDummy PgStat_MsgDummy
 
typedef struct PgStat_MsgInquiry PgStat_MsgInquiry
 
typedef struct PgStat_TableEntry PgStat_TableEntry
 
typedef struct PgStat_MsgTabstat PgStat_MsgTabstat
 
typedef struct PgStat_MsgTabpurge PgStat_MsgTabpurge
 
typedef struct PgStat_MsgDropdb PgStat_MsgDropdb
 
typedef struct PgStat_MsgResetcounter PgStat_MsgResetcounter
 
typedef struct PgStat_MsgResetsharedcounter PgStat_MsgResetsharedcounter
 
typedef struct PgStat_MsgResetsinglecounter PgStat_MsgResetsinglecounter
 
typedef struct PgStat_MsgResetslrucounter PgStat_MsgResetslrucounter
 
typedef struct PgStat_MsgAutovacStart PgStat_MsgAutovacStart
 
typedef struct PgStat_MsgVacuum PgStat_MsgVacuum
 
typedef struct PgStat_MsgAnalyze PgStat_MsgAnalyze
 
typedef struct PgStat_MsgArchiver PgStat_MsgArchiver
 
typedef struct PgStat_MsgBgWriter PgStat_MsgBgWriter
 
typedef struct PgStat_MsgSLRU PgStat_MsgSLRU
 
typedef struct PgStat_MsgRecoveryConflict PgStat_MsgRecoveryConflict
 
typedef struct PgStat_MsgTempFile PgStat_MsgTempFile
 
typedef struct PgStat_FunctionCounts PgStat_FunctionCounts
 
typedef struct PgStat_BackendFunctionEntry PgStat_BackendFunctionEntry
 
typedef struct PgStat_FunctionEntry PgStat_FunctionEntry
 
typedef struct PgStat_MsgFuncstat PgStat_MsgFuncstat
 
typedef struct PgStat_MsgFuncpurge PgStat_MsgFuncpurge
 
typedef struct PgStat_MsgDeadlock PgStat_MsgDeadlock
 
typedef struct PgStat_MsgChecksumFailure PgStat_MsgChecksumFailure
 
typedef union PgStat_Msg PgStat_Msg
 
typedef struct PgStat_StatDBEntry PgStat_StatDBEntry
 
typedef struct PgStat_StatTabEntry PgStat_StatTabEntry
 
typedef struct PgStat_StatFuncEntry PgStat_StatFuncEntry
 
typedef struct PgStat_ArchiverStats PgStat_ArchiverStats
 
typedef struct PgStat_GlobalStats PgStat_GlobalStats
 
typedef struct PgStat_SLRUStats PgStat_SLRUStats
 
typedef enum BackendState BackendState
 
typedef enum ProgressCommandType ProgressCommandType
 
typedef struct PgBackendSSLStatus PgBackendSSLStatus
 
typedef struct PgBackendGSSStatus PgBackendGSSStatus
 
typedef struct PgBackendStatus PgBackendStatus
 
typedef struct LocalPgBackendStatus LocalPgBackendStatus
 
typedef struct PgStat_FunctionCallUsage PgStat_FunctionCallUsage
 

Enumerations

enum  TrackFunctionsLevel { TRACK_FUNC_OFF, TRACK_FUNC_PL, TRACK_FUNC_ALL }
 
enum  StatMsgType {
  PGSTAT_MTYPE_DUMMY, PGSTAT_MTYPE_INQUIRY, PGSTAT_MTYPE_TABSTAT, PGSTAT_MTYPE_TABPURGE,
  PGSTAT_MTYPE_DROPDB, PGSTAT_MTYPE_RESETCOUNTER, PGSTAT_MTYPE_RESETSHAREDCOUNTER, PGSTAT_MTYPE_RESETSINGLECOUNTER,
  PGSTAT_MTYPE_RESETSLRUCOUNTER, PGSTAT_MTYPE_AUTOVAC_START, PGSTAT_MTYPE_VACUUM, PGSTAT_MTYPE_ANALYZE,
  PGSTAT_MTYPE_ARCHIVER, PGSTAT_MTYPE_BGWRITER, PGSTAT_MTYPE_SLRU, PGSTAT_MTYPE_FUNCSTAT,
  PGSTAT_MTYPE_FUNCPURGE, PGSTAT_MTYPE_RECOVERYCONFLICT, PGSTAT_MTYPE_TEMPFILE, PGSTAT_MTYPE_DEADLOCK,
  PGSTAT_MTYPE_CHECKSUMFAILURE
}
 
enum  PgStat_Shared_Reset_Target { RESET_ARCHIVER, RESET_BGWRITER }
 
enum  PgStat_Single_Reset_Type { RESET_TABLE, RESET_FUNCTION }
 
enum  BackendState {
  STATE_UNDEFINED, STATE_IDLE, STATE_RUNNING, STATE_IDLEINTRANSACTION,
  STATE_FASTPATH, STATE_IDLEINTRANSACTION_ABORTED, STATE_DISABLED
}
 
enum  WaitEventActivity {
  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
}
 
enum  WaitEventClient {
  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_RECEIVER_WAIT_START, WAIT_EVENT_WAL_SENDER_WAIT_WAL,
  WAIT_EVENT_WAL_SENDER_WRITE_DATA
}
 
enum  WaitEventIPC {
  WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE = PG_WAIT_IPC, WAIT_EVENT_BGWORKER_SHUTDOWN, WAIT_EVENT_BGWORKER_STARTUP, WAIT_EVENT_BTREE_PAGE,
  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_XACT_GROUP_UPDATE
}
 
enum  WaitEventTimeout {
  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
}
 
enum  WaitEventIO {
  WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO, WAIT_EVENT_BUFFILE_READ, WAIT_EVENT_BUFFILE_WRITE, 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
}
 
enum  ProgressCommandType {
  PROGRESS_COMMAND_INVALID, PROGRESS_COMMAND_VACUUM, PROGRESS_COMMAND_ANALYZE, PROGRESS_COMMAND_CLUSTER,
  PROGRESS_COMMAND_CREATE_INDEX, PROGRESS_COMMAND_BASEBACKUP
}
 

Functions

Size BackendStatusShmemSize (void)
 
void CreateSharedBackendStatus (void)
 
void pgstat_init (void)
 
int pgstat_start (void)
 
void pgstat_reset_all (void)
 
void allow_immediate_pgstat_restart (void)
 
void pgstat_ping (void)
 
void pgstat_report_stat (bool force)
 
void pgstat_vacuum_stat (void)
 
void pgstat_drop_database (Oid databaseid)
 
void pgstat_clear_snapshot (void)
 
void pgstat_reset_counters (void)
 
void pgstat_reset_shared_counters (const char *)
 
void pgstat_reset_single_counter (Oid objectid, PgStat_Single_Reset_Type type)
 
void pgstat_reset_slru_counter (const char *)
 
void pgstat_report_autovac (Oid dboid)
 
void pgstat_report_vacuum (Oid tableoid, bool shared, PgStat_Counter livetuples, PgStat_Counter deadtuples)
 
void pgstat_report_analyze (Relation rel, PgStat_Counter livetuples, PgStat_Counter deadtuples, bool resetcounter)
 
void pgstat_report_recovery_conflict (int reason)
 
void pgstat_report_deadlock (void)
 
void pgstat_report_checksum_failures_in_db (Oid dboid, int failurecount)
 
void pgstat_report_checksum_failure (void)
 
void pgstat_initialize (void)
 
void pgstat_bestart (void)
 
void pgstat_report_activity (BackendState state, const char *cmd_str)
 
void pgstat_report_tempfile (size_t filesize)
 
void pgstat_report_appname (const char *appname)
 
void pgstat_report_xact_timestamp (TimestampTz tstamp)
 
const char * pgstat_get_wait_event (uint32 wait_event_info)
 
const char * pgstat_get_wait_event_type (uint32 wait_event_info)
 
const char * pgstat_get_backend_current_activity (int pid, bool checkUser)
 
const char * pgstat_get_crashed_backend_activity (int pid, char *buffer, int buflen)
 
void pgstat_progress_start_command (ProgressCommandType cmdtype, Oid relid)
 
void pgstat_progress_update_param (int index, int64 val)
 
void pgstat_progress_update_multi_param (int nparam, const int *index, const int64 *val)
 
void pgstat_progress_end_command (void)
 
PgStat_TableStatusfind_tabstat_entry (Oid rel_id)
 
PgStat_BackendFunctionEntryfind_funcstat_entry (Oid func_id)
 
void pgstat_initstats (Relation rel)
 
char * pgstat_clip_activity (const char *raw_activity)
 
static void pgstat_report_wait_start (uint32 wait_event_info)
 
static void pgstat_report_wait_end (void)
 
void pgstat_count_heap_insert (Relation rel, PgStat_Counter n)
 
void pgstat_count_heap_update (Relation rel, bool hot)
 
void pgstat_count_heap_delete (Relation rel)
 
void pgstat_count_truncate (Relation rel)
 
void pgstat_update_heap_dead_tuples (Relation rel, int delta)
 
void pgstat_init_function_usage (struct FunctionCallInfoBaseData *fcinfo, PgStat_FunctionCallUsage *fcu)
 
void pgstat_end_function_usage (PgStat_FunctionCallUsage *fcu, bool finalize)
 
void AtEOXact_PgStat (bool isCommit, bool parallel)
 
void AtEOSubXact_PgStat (bool isCommit, int nestDepth)
 
void AtPrepare_PgStat (void)
 
void PostPrepare_PgStat (void)
 
void pgstat_twophase_postcommit (TransactionId xid, uint16 info, void *recdata, uint32 len)
 
void pgstat_twophase_postabort (TransactionId xid, uint16 info, void *recdata, uint32 len)
 
void pgstat_send_archiver (const char *xlog, bool failed)
 
void pgstat_send_bgwriter (void)
 
PgStat_StatDBEntrypgstat_fetch_stat_dbentry (Oid dbid)
 
PgStat_StatTabEntrypgstat_fetch_stat_tabentry (Oid relid)
 
PgBackendStatuspgstat_fetch_stat_beentry (int beid)
 
LocalPgBackendStatuspgstat_fetch_stat_local_beentry (int beid)
 
PgStat_StatFuncEntrypgstat_fetch_stat_funcentry (Oid funcid)
 
int pgstat_fetch_stat_numbackends (void)
 
PgStat_ArchiverStatspgstat_fetch_stat_archiver (void)
 
PgStat_GlobalStatspgstat_fetch_global (void)
 
PgStat_SLRUStatspgstat_fetch_slru (void)
 
void pgstat_count_slru_page_zeroed (int slru_idx)
 
void pgstat_count_slru_page_hit (int slru_idx)
 
void pgstat_count_slru_page_read (int slru_idx)
 
void pgstat_count_slru_page_written (int slru_idx)
 
void pgstat_count_slru_page_exists (int slru_idx)
 
void pgstat_count_slru_flush (int slru_idx)
 
void pgstat_count_slru_truncate (int slru_idx)
 
const char * pgstat_slru_name (int slru_idx)
 
int pgstat_slru_index (const char *name)
 

Variables

PGDLLIMPORT bool pgstat_track_activities
 
PGDLLIMPORT bool pgstat_track_counts
 
PGDLLIMPORT int pgstat_track_functions
 
PGDLLIMPORT int pgstat_track_activity_query_size
 
char * pgstat_stat_directory
 
char * pgstat_stat_tmpname
 
char * pgstat_stat_filename
 
PgStat_MsgBgWriter BgWriterStats
 
PgStat_Counter pgStatBlockReadTime
 
PgStat_Counter pgStatBlockWriteTime
 

Macro Definition Documentation

◆ PG_STAT_TMP_DIR

#define PG_STAT_TMP_DIR   "pg_stat_tmp"

Definition at line 34 of file pgstat.h.

◆ PG_WAIT_ACTIVITY

#define PG_WAIT_ACTIVITY   0x05000000U

Definition at line 787 of file pgstat.h.

Referenced by pgstat_get_wait_event(), and pgstat_get_wait_event_type().

◆ PG_WAIT_BUFFER_PIN

#define PG_WAIT_BUFFER_PIN   0x04000000U

◆ PG_WAIT_CLIENT

#define PG_WAIT_CLIENT   0x06000000U

Definition at line 788 of file pgstat.h.

Referenced by pgstat_get_wait_event(), and pgstat_get_wait_event_type().

◆ PG_WAIT_EXTENSION

◆ PG_WAIT_IO

#define PG_WAIT_IO   0x0A000000U

Definition at line 792 of file pgstat.h.

Referenced by pgstat_get_wait_event(), and pgstat_get_wait_event_type().

◆ PG_WAIT_IPC

#define PG_WAIT_IPC   0x08000000U

Definition at line 790 of file pgstat.h.

Referenced by pgstat_get_wait_event(), and pgstat_get_wait_event_type().

◆ PG_WAIT_LOCK

#define PG_WAIT_LOCK   0x03000000U

◆ PG_WAIT_LWLOCK

#define PG_WAIT_LWLOCK   0x01000000U

◆ PG_WAIT_TIMEOUT

#define PG_WAIT_TIMEOUT   0x09000000U

Definition at line 791 of file pgstat.h.

Referenced by pgstat_get_wait_event(), and pgstat_get_wait_event_type().

◆ pgstat_begin_read_activity

#define pgstat_begin_read_activity (   beentry,
  before_changecount 
)
Value:
do { \
(before_changecount) = (beentry)->st_changecount; \
pg_read_barrier(); \
} while (0)

Definition at line 1184 of file pgstat.h.

Referenced by pgstat_get_backend_current_activity(), and pgstat_read_current_status().

◆ PGSTAT_BEGIN_WRITE_ACTIVITY

#define PGSTAT_BEGIN_WRITE_ACTIVITY (   beentry)

◆ pgstat_count_buffer_hit

#define pgstat_count_buffer_hit (   rel)
Value:
do { \
if ((rel)->pgstat_info != NULL) \
(rel)->pgstat_info->t_counts.t_blocks_hit++; \
} while (0)

Definition at line 1427 of file pgstat.h.

Referenced by ReadBufferExtended().

◆ pgstat_count_buffer_read

#define pgstat_count_buffer_read (   rel)
Value:
do { \
if ((rel)->pgstat_info != NULL) \
(rel)->pgstat_info->t_counts.t_blocks_fetched++; \
} while (0)

Definition at line 1422 of file pgstat.h.

Referenced by ReadBufferExtended().

◆ pgstat_count_buffer_read_time

#define pgstat_count_buffer_read_time (   n)    (pgStatBlockReadTime += (n))

Definition at line 1432 of file pgstat.h.

Referenced by ReadBuffer_common().

◆ pgstat_count_buffer_write_time

#define pgstat_count_buffer_write_time (   n)    (pgStatBlockWriteTime += (n))

Definition at line 1434 of file pgstat.h.

Referenced by FlushBuffer().

◆ pgstat_count_heap_fetch

#define pgstat_count_heap_fetch (   rel)
Value:
do { \
if ((rel)->pgstat_info != NULL) \
(rel)->pgstat_info->t_counts.t_tuples_fetched++; \
} while (0)

Definition at line 1407 of file pgstat.h.

Referenced by heapam_scan_bitmap_next_tuple(), and index_fetch_heap().

◆ pgstat_count_heap_getnext

#define pgstat_count_heap_getnext (   rel)
Value:
do { \
if ((rel)->pgstat_info != NULL) \
(rel)->pgstat_info->t_counts.t_tuples_returned++; \
} while (0)

Definition at line 1402 of file pgstat.h.

Referenced by heap_getnext(), heap_getnextslot(), and heapam_scan_sample_next_tuple().

◆ pgstat_count_heap_scan

#define pgstat_count_heap_scan (   rel)
Value:
do { \
if ((rel)->pgstat_info != NULL) \
(rel)->pgstat_info->t_counts.t_numscans++; \
} while (0)

Definition at line 1397 of file pgstat.h.

Referenced by initscan().

◆ pgstat_count_index_scan

#define pgstat_count_index_scan (   rel)
Value:
do { \
if ((rel)->pgstat_info != NULL) \
(rel)->pgstat_info->t_counts.t_numscans++; \
} while (0)

Definition at line 1412 of file pgstat.h.

Referenced by _bt_first(), _hash_first(), bringetbitmap(), gistgetbitmap(), and gistgettuple().

◆ pgstat_count_index_tuples

#define pgstat_count_index_tuples (   rel,
 
)
Value:
do { \
if ((rel)->pgstat_info != NULL) \
(rel)->pgstat_info->t_counts.t_tuples_returned += (n); \
} while (0)

Definition at line 1417 of file pgstat.h.

Referenced by index_getbitmap(), and index_getnext_tid().

◆ pgstat_end_read_activity

#define pgstat_end_read_activity (   beentry,
  after_changecount 
)
Value:
do { \
pg_read_barrier(); \
(after_changecount) = (beentry)->st_changecount; \
} while (0)

Definition at line 1190 of file pgstat.h.

Referenced by pgstat_get_backend_current_activity(), and pgstat_read_current_status().

◆ PGSTAT_END_WRITE_ACTIVITY

#define PGSTAT_END_WRITE_ACTIVITY (   beentry)
Value:
do { \
pg_write_barrier(); \
(beentry)->st_changecount++; \
Assert(((beentry)->st_changecount & 1) == 0); \
END_CRIT_SECTION(); \
} while (0)

Definition at line 1176 of file pgstat.h.

Referenced by pgstat_beshutdown_hook(), pgstat_bestart(), pgstat_progress_end_command(), pgstat_progress_start_command(), pgstat_progress_update_multi_param(), pgstat_progress_update_param(), pgstat_report_activity(), pgstat_report_appname(), and pgstat_report_xact_timestamp().

◆ PGSTAT_FILE_FORMAT_ID

#define PGSTAT_FILE_FORMAT_ID   0x01A5BC9D

◆ PGSTAT_MAX_MSG_SIZE

#define PGSTAT_MAX_MSG_SIZE   1000

Definition at line 209 of file pgstat.h.

Referenced by pgstat_init().

◆ PGSTAT_MSG_PAYLOAD

#define PGSTAT_MSG_PAYLOAD   (PGSTAT_MAX_MSG_SIZE - sizeof(PgStat_MsgHdr))

Definition at line 210 of file pgstat.h.

◆ PGSTAT_NUM_FUNCENTRIES

#define PGSTAT_NUM_FUNCENTRIES
Value:
((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \
unsigned int Oid
Definition: postgres_ext.h:31
#define PGSTAT_MSG_PAYLOAD
Definition: pgstat.h:210

Definition at line 524 of file pgstat.h.

Referenced by pgstat_send_funcstats().

◆ PGSTAT_NUM_FUNCPURGE

#define PGSTAT_NUM_FUNCPURGE
Value:
((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \
/ sizeof(Oid))
unsigned int Oid
Definition: postgres_ext.h:31
#define PGSTAT_MSG_PAYLOAD
Definition: pgstat.h:210

Definition at line 541 of file pgstat.h.

Referenced by pgstat_vacuum_stat().

◆ PGSTAT_NUM_PROGRESS_PARAM

#define PGSTAT_NUM_PROGRESS_PARAM   20

◆ PGSTAT_NUM_TABENTRIES

#define PGSTAT_NUM_TABENTRIES
Value:
((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - 3 * sizeof(int) - 2 * sizeof(PgStat_Counter)) \
/ sizeof(PgStat_TableEntry))
int64 PgStat_Counter
Definition: pgstat.h:77
unsigned int Oid
Definition: postgres_ext.h:31
struct PgStat_TableEntry PgStat_TableEntry
#define PGSTAT_MSG_PAYLOAD
Definition: pgstat.h:210

Definition at line 266 of file pgstat.h.

Referenced by pgstat_report_stat().

◆ PGSTAT_NUM_TABPURGE

#define PGSTAT_NUM_TABPURGE
Value:
((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \
/ sizeof(Oid))
unsigned int Oid
Definition: postgres_ext.h:31
#define PGSTAT_MSG_PAYLOAD
Definition: pgstat.h:210

Definition at line 288 of file pgstat.h.

Referenced by pgstat_vacuum_stat().

◆ pgstat_read_activity_complete

#define pgstat_read_activity_complete (   before_changecount,
  after_changecount 
)
Value:
((before_changecount) == (after_changecount) && \
((before_changecount) & 1) == 0)

Definition at line 1196 of file pgstat.h.

Referenced by pgstat_get_backend_current_activity(), and pgstat_read_current_status().

◆ PGSTAT_STAT_PERMANENT_DIRECTORY

#define PGSTAT_STAT_PERMANENT_DIRECTORY   "pg_stat"

Definition at line 29 of file pgstat.h.

Referenced by get_dbstat_filename(), and pgstat_reset_all().

◆ PGSTAT_STAT_PERMANENT_FILENAME

#define PGSTAT_STAT_PERMANENT_FILENAME   "pg_stat/global.stat"

◆ PGSTAT_STAT_PERMANENT_TMPFILE

#define PGSTAT_STAT_PERMANENT_TMPFILE   "pg_stat/global.tmp"

Definition at line 31 of file pgstat.h.

Referenced by pgstat_write_statsfiles().

Typedef Documentation

◆ BackendState

typedef enum BackendState BackendState

◆ LocalPgBackendStatus

◆ PgBackendGSSStatus

◆ PgBackendSSLStatus

◆ PgBackendStatus

◆ PgStat_ArchiverStats

◆ PgStat_BackendFunctionEntry

◆ PgStat_Counter

typedef int64 PgStat_Counter

Definition at line 77 of file pgstat.h.

◆ PgStat_FunctionCallUsage

◆ PgStat_FunctionCounts

◆ PgStat_FunctionEntry

◆ PgStat_GlobalStats

◆ PgStat_Msg

typedef union PgStat_Msg PgStat_Msg

◆ PgStat_MsgAnalyze

◆ PgStat_MsgArchiver

◆ PgStat_MsgAutovacStart

◆ PgStat_MsgBgWriter

◆ PgStat_MsgChecksumFailure

◆ PgStat_MsgDeadlock

◆ PgStat_MsgDropdb

◆ PgStat_MsgDummy

◆ PgStat_MsgFuncpurge

◆ PgStat_MsgFuncstat

◆ PgStat_MsgHdr

typedef struct PgStat_MsgHdr PgStat_MsgHdr

◆ PgStat_MsgInquiry

◆ PgStat_MsgRecoveryConflict

◆ PgStat_MsgResetcounter

◆ PgStat_MsgResetsharedcounter

◆ PgStat_MsgResetsinglecounter

◆ PgStat_MsgResetslrucounter

◆ PgStat_MsgSLRU

◆ PgStat_MsgTabpurge

◆ PgStat_MsgTabstat

◆ PgStat_MsgTempFile

◆ PgStat_MsgVacuum

◆ PgStat_Shared_Reset_Target

◆ PgStat_Single_Reset_Type

◆ PgStat_SLRUStats

◆ PgStat_StatDBEntry

◆ PgStat_StatFuncEntry

◆ PgStat_StatTabEntry

◆ PgStat_TableCounts

◆ PgStat_TableEntry

◆ PgStat_TableStatus

◆ PgStat_TableXactStatus

◆ ProgressCommandType

◆ StatMsgType

typedef enum StatMsgType StatMsgType

◆ TrackFunctionsLevel

Enumeration Type Documentation

◆ BackendState

Enumerator
STATE_UNDEFINED 
STATE_IDLE 
STATE_RUNNING 
STATE_IDLEINTRANSACTION 
STATE_FASTPATH 
STATE_IDLEINTRANSACTION_ABORTED 
STATE_DISABLED 

Definition at line 768 of file pgstat.h.

◆ PgStat_Shared_Reset_Target

Enumerator
RESET_ARCHIVER 
RESET_BGWRITER 

Definition at line 122 of file pgstat.h.

123 {
PgStat_Shared_Reset_Target
Definition: pgstat.h:122

◆ PgStat_Single_Reset_Type

Enumerator
RESET_TABLE 
RESET_FUNCTION 

Definition at line 129 of file pgstat.h.

130 {
131  RESET_TABLE,
PgStat_Single_Reset_Type
Definition: pgstat.h:129

◆ ProgressCommandType

Enumerator
PROGRESS_COMMAND_INVALID 
PROGRESS_COMMAND_VACUUM 
PROGRESS_COMMAND_ANALYZE 
PROGRESS_COMMAND_CLUSTER 
PROGRESS_COMMAND_CREATE_INDEX 
PROGRESS_COMMAND_BASEBACKUP 

Definition at line 991 of file pgstat.h.

◆ StatMsgType

Enumerator
PGSTAT_MTYPE_DUMMY 
PGSTAT_MTYPE_INQUIRY 
PGSTAT_MTYPE_TABSTAT 
PGSTAT_MTYPE_TABPURGE 
PGSTAT_MTYPE_DROPDB 
PGSTAT_MTYPE_RESETCOUNTER 
PGSTAT_MTYPE_RESETSHAREDCOUNTER 
PGSTAT_MTYPE_RESETSINGLECOUNTER 
PGSTAT_MTYPE_RESETSLRUCOUNTER 
PGSTAT_MTYPE_AUTOVAC_START 
PGSTAT_MTYPE_VACUUM 
PGSTAT_MTYPE_ANALYZE 
PGSTAT_MTYPE_ARCHIVER 
PGSTAT_MTYPE_BGWRITER 
PGSTAT_MTYPE_SLRU 
PGSTAT_MTYPE_FUNCSTAT 
PGSTAT_MTYPE_FUNCPURGE 
PGSTAT_MTYPE_RECOVERYCONFLICT 
PGSTAT_MTYPE_TEMPFILE 
PGSTAT_MTYPE_DEADLOCK 
PGSTAT_MTYPE_CHECKSUMFAILURE 

Definition at line 48 of file pgstat.h.

49 {
71 } StatMsgType;
StatMsgType
Definition: pgstat.h:48

◆ TrackFunctionsLevel

Enumerator
TRACK_FUNC_OFF 
TRACK_FUNC_PL 
TRACK_FUNC_ALL 

Definition at line 37 of file pgstat.h.

◆ WaitEventActivity

Enumerator
WAIT_EVENT_ARCHIVER_MAIN 
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 

Definition at line 802 of file pgstat.h.

◆ WaitEventClient

Enumerator
WAIT_EVENT_CLIENT_READ 
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_RECEIVER_WAIT_START 
WAIT_EVENT_WAL_SENDER_WAIT_WAL 
WAIT_EVENT_WAL_SENDER_WRITE_DATA 

Definition at line 827 of file pgstat.h.

◆ WaitEventIO

Enumerator
WAIT_EVENT_BASEBACKUP_READ 
WAIT_EVENT_BUFFILE_READ 
WAIT_EVENT_BUFFILE_WRITE 
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 

Definition at line 914 of file pgstat.h.

915 {
985 } WaitEventIO;
#define PG_WAIT_IO
Definition: pgstat.h:792
WaitEventIO
Definition: pgstat.h:914

◆ WaitEventIPC

Enumerator
WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE 
WAIT_EVENT_BGWORKER_SHUTDOWN 
WAIT_EVENT_BGWORKER_STARTUP 
WAIT_EVENT_BTREE_PAGE 
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_XACT_GROUP_UPDATE 

Definition at line 847 of file pgstat.h.

848 {
891 } WaitEventIPC;
WaitEventIPC
Definition: pgstat.h:847
#define PG_WAIT_IPC
Definition: pgstat.h:790

◆ WaitEventTimeout

Enumerator
WAIT_EVENT_BASE_BACKUP_THROTTLE 
WAIT_EVENT_PG_SLEEP 
WAIT_EVENT_RECOVERY_APPLY_DELAY 
WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL 
WAIT_EVENT_VACUUM_DELAY 

Definition at line 899 of file pgstat.h.

Function Documentation

◆ allow_immediate_pgstat_restart()

void allow_immediate_pgstat_restart ( void  )

Definition at line 817 of file pgstat.c.

References last_pgstat_start_time.

Referenced by HandleChildCrash().

818 {
820 }
static time_t last_pgstat_start_time
Definition: pgstat.c:178

◆ AtEOSubXact_PgStat()

void AtEOSubXact_PgStat ( bool  isCommit,
int  nestDepth 
)

Definition at line 2230 of file pgstat.c.

References Assert, PgStat_SubXactStatus::first, get_tabstat_stack_level(), PgStat_TableXactStatus::nest_level, PgStat_SubXactStatus::nest_level, PgStat_TableXactStatus::next, PgStat_TableXactStatus::parent, pfree(), pgstat_truncate_restore_counters(), pgstat_truncate_save_counters(), pgStatXactStack, PgStat_SubXactStatus::prev, PgStat_TableStatus::t_counts, PgStat_TableCounts::t_delta_dead_tuples, PgStat_TableCounts::t_tuples_deleted, PgStat_TableCounts::t_tuples_inserted, PgStat_TableCounts::t_tuples_updated, PgStat_TableStatus::trans, trans, PgStat_TableXactStatus::truncated, PgStat_TableXactStatus::tuples_deleted, PgStat_TableXactStatus::tuples_inserted, PgStat_TableXactStatus::tuples_updated, and PgStat_TableXactStatus::upper.

Referenced by AbortSubTransaction(), and CommitSubTransaction().

2231 {
2232  PgStat_SubXactStatus *xact_state;
2233 
2234  /*
2235  * Transfer transactional insert/update counts into the next higher
2236  * subtransaction state.
2237  */
2238  xact_state = pgStatXactStack;
2239  if (xact_state != NULL &&
2240  xact_state->nest_level >= nestDepth)
2241  {
2243  PgStat_TableXactStatus *next_trans;
2244 
2245  /* delink xact_state from stack immediately to simplify reuse case */
2246  pgStatXactStack = xact_state->prev;
2247 
2248  for (trans = xact_state->first; trans != NULL; trans = next_trans)
2249  {
2250  PgStat_TableStatus *tabstat;
2251 
2252  next_trans = trans->next;
2253  Assert(trans->nest_level == nestDepth);
2254  tabstat = trans->parent;
2255  Assert(tabstat->trans == trans);
2256  if (isCommit)
2257  {
2258  if (trans->upper && trans->upper->nest_level == nestDepth - 1)
2259  {
2260  if (trans->truncated)
2261  {
2262  /* propagate the truncate status one level up */
2264  /* replace upper xact stats with ours */
2265  trans->upper->tuples_inserted = trans->tuples_inserted;
2266  trans->upper->tuples_updated = trans->tuples_updated;
2267  trans->upper->tuples_deleted = trans->tuples_deleted;
2268  }
2269  else
2270  {
2271  trans->upper->tuples_inserted += trans->tuples_inserted;
2272  trans->upper->tuples_updated += trans->tuples_updated;
2273  trans->upper->tuples_deleted += trans->tuples_deleted;
2274  }
2275  tabstat->trans = trans->upper;
2276  pfree(trans);
2277  }
2278  else
2279  {
2280  /*
2281  * When there isn't an immediate parent state, we can just
2282  * reuse the record instead of going through a
2283  * palloc/pfree pushup (this works since it's all in
2284  * TopTransactionContext anyway). We have to re-link it
2285  * into the parent level, though, and that might mean
2286  * pushing a new entry into the pgStatXactStack.
2287  */
2288  PgStat_SubXactStatus *upper_xact_state;
2289 
2290  upper_xact_state = get_tabstat_stack_level(nestDepth - 1);
2291  trans->next = upper_xact_state->first;
2292  upper_xact_state->first = trans;
2293  trans->nest_level = nestDepth - 1;
2294  }
2295  }
2296  else
2297  {
2298  /*
2299  * On abort, update top-level tabstat counts, then forget the
2300  * subtransaction
2301  */
2302 
2303  /* first restore values obliterated by truncate */
2305  /* count attempted actions regardless of commit/abort */
2306  tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted;
2307  tabstat->t_counts.t_tuples_updated += trans->tuples_updated;
2308  tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted;
2309  /* inserted tuples are dead, deleted tuples are unaffected */
2310  tabstat->t_counts.t_delta_dead_tuples +=
2311  trans->tuples_inserted + trans->tuples_updated;
2312  tabstat->trans = trans->upper;
2313  pfree(trans);
2314  }
2315  }
2316  pfree(xact_state);
2317  }
2318 }
PgStat_Counter tuples_updated
Definition: pgstat.h:171
struct PgStat_TableXactStatus * next
Definition: pgstat.h:182
PgStat_TableCounts t_counts
Definition: pgstat.h:161
static PgStat_SubXactStatus * get_tabstat_stack_level(int nest_level)
Definition: pgstat.c:1948
void pfree(void *pointer)
Definition: mcxt.c:1056
PgStat_Counter t_tuples_updated
Definition: pgstat.h:108
static void pgstat_truncate_restore_counters(PgStat_TableXactStatus *trans)
Definition: pgstat.c:2084
PgStat_Counter tuples_inserted
Definition: pgstat.h:170
PgStat_Counter t_delta_dead_tuples
Definition: pgstat.h:114
struct PgStat_TableXactStatus * upper
Definition: pgstat.h:179
PgStat_Counter t_tuples_deleted
Definition: pgstat.h:109
PgStat_Counter tuples_deleted
Definition: pgstat.h:172
struct PgStat_SubXactStatus * prev
Definition: pgstat.c:240
#define Assert(condition)
Definition: c.h:745
static PgStat_SubXactStatus * pgStatXactStack
Definition: pgstat.c:244
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160
static zic_t trans[TZ_MAX_LEAPS]
Definition: zic.c:402
PgStat_TableXactStatus * first
Definition: pgstat.c:241
static void pgstat_truncate_save_counters(PgStat_TableXactStatus *trans)
Definition: pgstat.c:2069
PgStat_Counter t_tuples_inserted
Definition: pgstat.h:107
PgStat_TableStatus * parent
Definition: pgstat.h:180

◆ AtEOXact_PgStat()

void AtEOXact_PgStat ( bool  isCommit,
bool  parallel 
)

Definition at line 2143 of file pgstat.c.

References Assert, PgStat_SubXactStatus::first, PgStat_TableXactStatus::nest_level, PgStat_SubXactStatus::nest_level, PgStat_TableXactStatus::next, PgStat_TableXactStatus::parent, pgstat_clear_snapshot(), pgstat_truncate_restore_counters(), pgStatXactCommit, pgStatXactRollback, pgStatXactStack, PgStat_SubXactStatus::prev, PgStat_TableCounts::t_changed_tuples, PgStat_TableStatus::t_counts, PgStat_TableCounts::t_delta_dead_tuples, PgStat_TableCounts::t_delta_live_tuples, PgStat_TableCounts::t_truncated, PgStat_TableCounts::t_tuples_deleted, PgStat_TableCounts::t_tuples_inserted, PgStat_TableCounts::t_tuples_updated, PgStat_TableStatus::trans, trans, PgStat_TableXactStatus::truncated, PgStat_TableXactStatus::tuples_deleted, PgStat_TableXactStatus::tuples_inserted, PgStat_TableXactStatus::tuples_updated, and PgStat_TableXactStatus::upper.

Referenced by AbortTransaction(), CommitTransaction(), and FinishPreparedTransaction().

2144 {
2145  PgStat_SubXactStatus *xact_state;
2146 
2147  /* Don't count parallel worker transaction stats */
2148  if (!parallel)
2149  {
2150  /*
2151  * Count transaction commit or abort. (We use counters, not just
2152  * bools, in case the reporting message isn't sent right away.)
2153  */
2154  if (isCommit)
2155  pgStatXactCommit++;
2156  else
2158  }
2159 
2160  /*
2161  * Transfer transactional insert/update counts into the base tabstat
2162  * entries. We don't bother to free any of the transactional state, since
2163  * it's all in TopTransactionContext and will go away anyway.
2164  */
2165  xact_state = pgStatXactStack;
2166  if (xact_state != NULL)
2167  {
2169 
2170  Assert(xact_state->nest_level == 1);
2171  Assert(xact_state->prev == NULL);
2172  for (trans = xact_state->first; trans != NULL; trans = trans->next)
2173  {
2174  PgStat_TableStatus *tabstat;
2175 
2176  Assert(trans->nest_level == 1);
2177  Assert(trans->upper == NULL);
2178  tabstat = trans->parent;
2179  Assert(tabstat->trans == trans);
2180  /* restore pre-truncate stats (if any) in case of aborted xact */
2181  if (!isCommit)
2183  /* count attempted actions regardless of commit/abort */
2184  tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted;
2185  tabstat->t_counts.t_tuples_updated += trans->tuples_updated;
2186  tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted;
2187  if (isCommit)
2188  {
2189  tabstat->t_counts.t_truncated = trans->truncated;
2190  if (trans->truncated)
2191  {
2192  /* forget live/dead stats seen by backend thus far */
2193  tabstat->t_counts.t_delta_live_tuples = 0;
2194  tabstat->t_counts.t_delta_dead_tuples = 0;
2195  }
2196  /* insert adds a live tuple, delete removes one */
2197  tabstat->t_counts.t_delta_live_tuples +=
2198  trans->tuples_inserted - trans->tuples_deleted;
2199  /* update and delete each create a dead tuple */
2200  tabstat->t_counts.t_delta_dead_tuples +=
2201  trans->tuples_updated + trans->tuples_deleted;
2202  /* insert, update, delete each count as one change event */
2203  tabstat->t_counts.t_changed_tuples +=
2204  trans->tuples_inserted + trans->tuples_updated +
2205  trans->tuples_deleted;
2206  }
2207  else
2208  {
2209  /* inserted tuples are dead, deleted tuples are unaffected */
2210  tabstat->t_counts.t_delta_dead_tuples +=
2211  trans->tuples_inserted + trans->tuples_updated;
2212  /* an aborted xact generates no changed_tuple events */
2213  }
2214  tabstat->trans = NULL;
2215  }
2216  }
2217  pgStatXactStack = NULL;
2218 
2219  /* Make sure any stats snapshot is thrown away */
2221 }
PgStat_Counter t_delta_live_tuples
Definition: pgstat.h:113
PgStat_Counter tuples_updated
Definition: pgstat.h:171
static int pgStatXactCommit
Definition: pgstat.c:246
struct PgStat_TableXactStatus * next
Definition: pgstat.h:182
PgStat_TableCounts t_counts
Definition: pgstat.h:161
PgStat_Counter t_tuples_updated
Definition: pgstat.h:108
static void pgstat_truncate_restore_counters(PgStat_TableXactStatus *trans)
Definition: pgstat.c:2084
static int pgStatXactRollback
Definition: pgstat.c:247
PgStat_Counter tuples_inserted
Definition: pgstat.h:170
PgStat_Counter t_delta_dead_tuples
Definition: pgstat.h:114
struct PgStat_TableXactStatus * upper
Definition: pgstat.h:179
PgStat_Counter t_tuples_deleted
Definition: pgstat.h:109
PgStat_Counter tuples_deleted
Definition: pgstat.h:172
struct PgStat_SubXactStatus * prev
Definition: pgstat.c:240
PgStat_Counter t_changed_tuples
Definition: pgstat.h:115
#define Assert(condition)
Definition: c.h:745
void pgstat_clear_snapshot(void)
Definition: pgstat.c:5840
static PgStat_SubXactStatus * pgStatXactStack
Definition: pgstat.c:244
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160
static zic_t trans[TZ_MAX_LEAPS]
Definition: zic.c:402
PgStat_TableXactStatus * first
Definition: pgstat.c:241
PgStat_Counter t_tuples_inserted
Definition: pgstat.h:107
PgStat_TableStatus * parent
Definition: pgstat.h:180

◆ AtPrepare_PgStat()

void AtPrepare_PgStat ( void  )

Definition at line 2329 of file pgstat.c.

References Assert, PgStat_TableXactStatus::deleted_pre_trunc, TwoPhasePgStatRecord::deleted_pre_trunc, PgStat_SubXactStatus::first, PgStat_TableXactStatus::inserted_pre_trunc, TwoPhasePgStatRecord::inserted_pre_trunc, PgStat_TableXactStatus::nest_level, PgStat_SubXactStatus::nest_level, PgStat_TableXactStatus::next, PgStat_TableXactStatus::parent, pgStatXactStack, PgStat_SubXactStatus::prev, RegisterTwoPhaseRecord(), PgStat_TableStatus::t_id, TwoPhasePgStatRecord::t_id, PgStat_TableStatus::t_shared, TwoPhasePgStatRecord::t_shared, TwoPhasePgStatRecord::t_truncated, PgStat_TableStatus::trans, trans, PgStat_TableXactStatus::truncated, PgStat_TableXactStatus::tuples_deleted, TwoPhasePgStatRecord::tuples_deleted, PgStat_TableXactStatus::tuples_inserted, TwoPhasePgStatRecord::tuples_inserted, PgStat_TableXactStatus::tuples_updated, TwoPhasePgStatRecord::tuples_updated, TWOPHASE_RM_PGSTAT_ID, PgStat_TableXactStatus::updated_pre_trunc, TwoPhasePgStatRecord::updated_pre_trunc, and PgStat_TableXactStatus::upper.

Referenced by PrepareTransaction().

2330 {
2331  PgStat_SubXactStatus *xact_state;
2332 
2333  xact_state = pgStatXactStack;
2334  if (xact_state != NULL)
2335  {
2337 
2338  Assert(xact_state->nest_level == 1);
2339  Assert(xact_state->prev == NULL);
2340  for (trans = xact_state->first; trans != NULL; trans = trans->next)
2341  {
2342  PgStat_TableStatus *tabstat;
2343  TwoPhasePgStatRecord record;
2344 
2345  Assert(trans->nest_level == 1);
2346  Assert(trans->upper == NULL);
2347  tabstat = trans->parent;
2348  Assert(tabstat->trans == trans);
2349 
2350  record.tuples_inserted = trans->tuples_inserted;
2351  record.tuples_updated = trans->tuples_updated;
2352  record.tuples_deleted = trans->tuples_deleted;
2353  record.inserted_pre_trunc = trans->inserted_pre_trunc;
2354  record.updated_pre_trunc = trans->updated_pre_trunc;
2355  record.deleted_pre_trunc = trans->deleted_pre_trunc;
2356  record.t_id = tabstat->t_id;
2357  record.t_shared = tabstat->t_shared;
2358  record.t_truncated = trans->truncated;
2359 
2361  &record, sizeof(TwoPhasePgStatRecord));
2362  }
2363  }
2364 }
PgStat_Counter tuples_updated
Definition: pgstat.h:171
struct PgStat_TableXactStatus * next
Definition: pgstat.h:182
PgStat_Counter deleted_pre_trunc
Definition: pgstat.h:176
PgStat_Counter deleted_pre_trunc
Definition: pgstat.c:259
void RegisterTwoPhaseRecord(TwoPhaseRmgrId rmid, uint16 info, const void *data, uint32 len)
Definition: twophase.c:1187
PgStat_Counter tuples_inserted
Definition: pgstat.h:170
PgStat_Counter updated_pre_trunc
Definition: pgstat.c:258
PgStat_Counter inserted_pre_trunc
Definition: pgstat.c:257
struct PgStat_TableXactStatus * upper
Definition: pgstat.h:179
PgStat_Counter tuples_updated
Definition: pgstat.c:255
PgStat_Counter tuples_deleted
Definition: pgstat.h:172
struct PgStat_SubXactStatus * prev
Definition: pgstat.c:240
#define Assert(condition)
Definition: c.h:745
PgStat_Counter inserted_pre_trunc
Definition: pgstat.h:174
PgStat_Counter tuples_inserted
Definition: pgstat.c:254
static PgStat_SubXactStatus * pgStatXactStack
Definition: pgstat.c:244
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160
PgStat_Counter tuples_deleted
Definition: pgstat.c:256
#define TWOPHASE_RM_PGSTAT_ID
Definition: twophase_rmgr.h:26
PgStat_Counter updated_pre_trunc
Definition: pgstat.h:175
static zic_t trans[TZ_MAX_LEAPS]
Definition: zic.c:402
PgStat_TableXactStatus * first
Definition: pgstat.c:241
PgStat_TableStatus * parent
Definition: pgstat.h:180

◆ BackendStatusShmemSize()

Size BackendStatusShmemSize ( void  )

Definition at line 2718 of file pgstat.c.

References add_size(), mul_size(), NAMEDATALEN, NumBackendStatSlots, and pgstat_track_activity_query_size.

Referenced by CreateSharedMemoryAndSemaphores().

2719 {
2720  Size size;
2721 
2722  /* BackendStatusArray: */
2723  size = mul_size(sizeof(PgBackendStatus), NumBackendStatSlots);
2724  /* BackendAppnameBuffer: */
2725  size = add_size(size,
2727  /* BackendClientHostnameBuffer: */
2728  size = add_size(size,
2730  /* BackendActivityBuffer: */
2731  size = add_size(size,
2733 #ifdef USE_SSL
2734  /* BackendSslStatusBuffer: */
2735  size = add_size(size,
2737 #endif
2738  return size;
2739 }
#define NumBackendStatSlots
Definition: pgstat.c:117
#define NAMEDATALEN
int pgstat_track_activity_query_size
Definition: pgstat.c:127
Size mul_size(Size s1, Size s2)
Definition: shmem.c:515
Size add_size(Size s1, Size s2)
Definition: shmem.c:498
size_t Size
Definition: c.h:473

◆ CreateSharedBackendStatus()

void CreateSharedBackendStatus ( void  )

Definition at line 2746 of file pgstat.c.

References BackendActivityBuffer, BackendActivityBufferSize, BackendAppnameBuffer, BackendClientHostnameBuffer, i, MemSet, mul_size(), NAMEDATALEN, NumBackendStatSlots, pgstat_track_activity_query_size, ShmemInitStruct(), PgBackendStatus::st_activity_raw, PgBackendStatus::st_appname, PgBackendStatus::st_clienthostname, PgBackendStatus::st_gssstatus, and PgBackendStatus::st_sslstatus.

Referenced by CreateSharedMemoryAndSemaphores().

2747 {
2748  Size size;
2749  bool found;
2750  int i;
2751  char *buffer;
2752 
2753  /* Create or attach to the shared array */
2754  size = mul_size(sizeof(PgBackendStatus), NumBackendStatSlots);
2756  ShmemInitStruct("Backend Status Array", size, &found);
2757 
2758  if (!found)
2759  {
2760  /*
2761  * We're the first - initialize.
2762  */
2763  MemSet(BackendStatusArray, 0, size);
2764  }
2765 
2766  /* Create or attach to the shared appname buffer */
2768  BackendAppnameBuffer = (char *)
2769  ShmemInitStruct("Backend Application Name Buffer", size, &found);
2770 
2771  if (!found)
2772  {
2773  MemSet(BackendAppnameBuffer, 0, size);
2774 
2775  /* Initialize st_appname pointers. */
2776  buffer = BackendAppnameBuffer;
2777  for (i = 0; i < NumBackendStatSlots; i++)
2778  {
2779  BackendStatusArray[i].st_appname = buffer;
2780  buffer += NAMEDATALEN;
2781  }
2782  }
2783 
2784  /* Create or attach to the shared client hostname buffer */
2786  BackendClientHostnameBuffer = (char *)
2787  ShmemInitStruct("Backend Client Host Name Buffer", size, &found);
2788 
2789  if (!found)
2790  {
2792 
2793  /* Initialize st_clienthostname pointers. */
2794  buffer = BackendClientHostnameBuffer;
2795  for (i = 0; i < NumBackendStatSlots; i++)
2796  {
2798  buffer += NAMEDATALEN;
2799  }
2800  }
2801 
2802  /* Create or attach to the shared activity buffer */
2805  BackendActivityBuffer = (char *)
2806  ShmemInitStruct("Backend Activity Buffer",
2808  &found);
2809 
2810  if (!found)
2811  {
2813 
2814  /* Initialize st_activity pointers. */
2815  buffer = BackendActivityBuffer;
2816  for (i = 0; i < NumBackendStatSlots; i++)
2817  {
2820  }
2821  }
2822 
2823 #ifdef USE_SSL
2824  /* Create or attach to the shared SSL status buffer */
2826  BackendSslStatusBuffer = (PgBackendSSLStatus *)
2827  ShmemInitStruct("Backend SSL Status Buffer", size, &found);
2828 
2829  if (!found)
2830  {
2831  PgBackendSSLStatus *ptr;
2832 
2833  MemSet(BackendSslStatusBuffer, 0, size);
2834 
2835  /* Initialize st_sslstatus pointers. */
2836  ptr = BackendSslStatusBuffer;
2837  for (i = 0; i < NumBackendStatSlots; i++)
2838  {
2840  ptr++;
2841  }
2842  }
2843 #endif
2844 
2845 #ifdef ENABLE_GSS
2846  /* Create or attach to the shared GSSAPI status buffer */
2848  BackendGssStatusBuffer = (PgBackendGSSStatus *)
2849  ShmemInitStruct("Backend GSS Status Buffer", size, &found);
2850 
2851  if (!found)
2852  {
2853  PgBackendGSSStatus *ptr;
2854 
2855  MemSet(BackendGssStatusBuffer, 0, size);
2856 
2857  /* Initialize st_gssstatus pointers. */
2858  ptr = BackendGssStatusBuffer;
2859  for (i = 0; i < NumBackendStatSlots; i++)
2860  {
2862  ptr++;
2863  }
2864  }
2865 #endif
2866 }
static PgBackendStatus * BackendStatusArray
Definition: pgstat.c:2700
static char * BackendActivityBuffer
Definition: pgstat.c:2704
static Size BackendActivityBufferSize
Definition: pgstat.c:2705
#define MemSet(start, val, len)
Definition: c.h:978
#define NumBackendStatSlots
Definition: pgstat.c:117
char * st_clienthostname
Definition: pgstat.h:1101
#define NAMEDATALEN
static char * BackendAppnameBuffer
Definition: pgstat.c:2702
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition: shmem.c:392
char * st_activity_raw
Definition: pgstat.h:1124
int pgstat_track_activity_query_size
Definition: pgstat.c:127
char * st_appname
Definition: pgstat.h:1115
Size mul_size(Size s1, Size s2)
Definition: shmem.c:515
size_t Size
Definition: c.h:473
int i
PgBackendSSLStatus * st_sslstatus
Definition: pgstat.h:1105
PgBackendGSSStatus * st_gssstatus
Definition: pgstat.h:1109
static char * BackendClientHostnameBuffer
Definition: pgstat.c:2703

◆ find_funcstat_entry()

PgStat_BackendFunctionEntry* find_funcstat_entry ( Oid  func_id)

Definition at line 1727 of file pgstat.c.

References HASH_FIND, and hash_search().

Referenced by pg_stat_get_xact_function_calls(), pg_stat_get_xact_function_self_time(), and pg_stat_get_xact_function_total_time().

1728 {
1729  if (pgStatFunctions == NULL)
1730  return NULL;
1731 
1733  (void *) &func_id,
1734  HASH_FIND, NULL);
1735 }
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:917
static HTAB * pgStatFunctions
Definition: pgstat.c:222

◆ find_tabstat_entry()

PgStat_TableStatus* find_tabstat_entry ( Oid  rel_id)

Definition at line 1928 of file pgstat.c.

References HASH_FIND, hash_search(), and TabStatHashEntry::tsa_entry.

Referenced by pg_stat_get_xact_blocks_fetched(), pg_stat_get_xact_blocks_hit(), pg_stat_get_xact_numscans(), pg_stat_get_xact_tuples_deleted(), pg_stat_get_xact_tuples_fetched(), pg_stat_get_xact_tuples_hot_updated(), pg_stat_get_xact_tuples_inserted(), pg_stat_get_xact_tuples_returned(), and pg_stat_get_xact_tuples_updated().

1929 {
1930  TabStatHashEntry *hash_entry;
1931 
1932  /* If hashtable doesn't exist, there are no entries at all */
1933  if (!pgStatTabHash)
1934  return NULL;
1935 
1936  hash_entry = hash_search(pgStatTabHash, &rel_id, HASH_FIND, NULL);
1937  if (!hash_entry)
1938  return NULL;
1939 
1940  /* Note that this step could also return NULL, but that's correct */
1941  return hash_entry->tsa_entry;
1942 }
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:917
static HTAB * pgStatTabHash
Definition: pgstat.c:216
PgStat_TableStatus * tsa_entry
Definition: pgstat.c:210

◆ pgstat_bestart()

void pgstat_bestart ( void  )

Definition at line 2923 of file pgstat.c.

References application_name, Assert, B_BACKEND, B_BG_WORKER, B_WAL_SENDER, be_gssapi_get_auth(), be_gssapi_get_enc(), be_gssapi_get_princ(), be_tls_get_cipher(), be_tls_get_cipher_bits(), be_tls_get_compression(), be_tls_get_peer_issuer_name(), be_tls_get_peer_serial(), be_tls_get_peer_subject_name(), be_tls_get_version(), GetSessionUserId(), Port::gss, PgBackendGSSStatus::gss_auth, PgBackendGSSStatus::gss_enc, PgBackendGSSStatus::gss_princ, InvalidOid, MemSet, MyBackendType, MyBEEntry, MyDatabaseId, MyProcPid, MyProcPort, MyStartTimestamp, NAMEDATALEN, PGSTAT_BEGIN_WRITE_ACTIVITY, PGSTAT_END_WRITE_ACTIVITY, pgstat_report_appname(), pgstat_track_activity_query_size, PROGRESS_COMMAND_INVALID, Port::raddr, Port::remote_hostname, PgBackendSSLStatus::ssl_bits, PgBackendSSLStatus::ssl_cipher, PgBackendSSLStatus::ssl_client_dn, PgBackendSSLStatus::ssl_client_serial, PgBackendSSLStatus::ssl_compression, Port::ssl_in_use, PgBackendSSLStatus::ssl_issuer_dn, PgBackendSSLStatus::ssl_version, PgBackendStatus::st_activity_raw, PgBackendStatus::st_activity_start_timestamp, PgBackendStatus::st_appname, PgBackendStatus::st_backendType, PgBackendStatus::st_changecount, PgBackendStatus::st_clientaddr, PgBackendStatus::st_clienthostname, PgBackendStatus::st_databaseid, PgBackendStatus::st_gss, PgBackendStatus::st_gssstatus, PgBackendStatus::st_proc_start_timestamp, PgBackendStatus::st_procpid, PgBackendStatus::st_progress_command, PgBackendStatus::st_progress_command_target, PgBackendStatus::st_ssl, PgBackendStatus::st_sslstatus, PgBackendStatus::st_state, PgBackendStatus::st_state_start_timestamp, PgBackendStatus::st_userid, PgBackendStatus::st_xact_start_timestamp, STATE_UNDEFINED, strlcpy(), and unvolatize.

Referenced by AuxiliaryProcessMain(), and InitPostgres().

2924 {
2925  volatile PgBackendStatus *vbeentry = MyBEEntry;
2926  PgBackendStatus lbeentry;
2927 #ifdef USE_SSL
2928  PgBackendSSLStatus lsslstatus;
2929 #endif
2930 #ifdef ENABLE_GSS
2931  PgBackendGSSStatus lgssstatus;
2932 #endif
2933 
2934  /* pgstats state must be initialized from pgstat_initialize() */
2935  Assert(vbeentry != NULL);
2936 
2937  /*
2938  * To minimize the time spent modifying the PgBackendStatus entry, and
2939  * avoid risk of errors inside the critical section, we first copy the
2940  * shared-memory struct to a local variable, then modify the data in the
2941  * local variable, then copy the local variable back to shared memory.
2942  * Only the last step has to be inside the critical section.
2943  *
2944  * Most of the data we copy from shared memory is just going to be
2945  * overwritten, but the struct's not so large that it's worth the
2946  * maintenance hassle to copy only the needful fields.
2947  */
2948  memcpy(&lbeentry,
2949  unvolatize(PgBackendStatus *, vbeentry),
2950  sizeof(PgBackendStatus));
2951 
2952  /* These structs can just start from zeroes each time, though */
2953 #ifdef USE_SSL
2954  memset(&lsslstatus, 0, sizeof(lsslstatus));
2955 #endif
2956 #ifdef ENABLE_GSS
2957  memset(&lgssstatus, 0, sizeof(lgssstatus));
2958 #endif
2959 
2960  /*
2961  * Now fill in all the fields of lbeentry, except for strings that are
2962  * out-of-line data. Those have to be handled separately, below.
2963  */
2964  lbeentry.st_procpid = MyProcPid;
2965  lbeentry.st_backendType = MyBackendType;
2967  lbeentry.st_activity_start_timestamp = 0;
2968  lbeentry.st_state_start_timestamp = 0;
2969  lbeentry.st_xact_start_timestamp = 0;
2970  lbeentry.st_databaseid = MyDatabaseId;
2971 
2972  /* We have userid for client-backends, wal-sender and bgworker processes */
2973  if (lbeentry.st_backendType == B_BACKEND
2974  || lbeentry.st_backendType == B_WAL_SENDER
2975  || lbeentry.st_backendType == B_BG_WORKER)
2976  lbeentry.st_userid = GetSessionUserId();
2977  else
2978  lbeentry.st_userid = InvalidOid;
2979 
2980  /*
2981  * We may not have a MyProcPort (eg, if this is the autovacuum process).
2982  * If so, use all-zeroes client address, which is dealt with specially in
2983  * pg_stat_get_backend_client_addr and pg_stat_get_backend_client_port.
2984  */
2985  if (MyProcPort)
2986  memcpy(&lbeentry.st_clientaddr, &MyProcPort->raddr,
2987  sizeof(lbeentry.st_clientaddr));
2988  else
2989  MemSet(&lbeentry.st_clientaddr, 0, sizeof(lbeentry.st_clientaddr));
2990 
2991 #ifdef USE_SSL
2993  {
2994  lbeentry.st_ssl = true;
3002  }
3003  else
3004  {
3005  lbeentry.st_ssl = false;
3006  }
3007 #else
3008  lbeentry.st_ssl = false;
3009 #endif
3010 
3011 #ifdef ENABLE_GSS
3012  if (MyProcPort && MyProcPort->gss != NULL)
3013  {
3014  lbeentry.st_gss = true;
3015  lgssstatus.gss_auth = be_gssapi_get_auth(MyProcPort);
3016  lgssstatus.gss_enc = be_gssapi_get_enc(MyProcPort);
3017 
3018  if (lgssstatus.gss_auth)
3020  }
3021  else
3022  {
3023  lbeentry.st_gss = false;
3024  }
3025 #else
3026  lbeentry.st_gss = false;
3027 #endif
3028 
3029  lbeentry.st_state = STATE_UNDEFINED;
3032 
3033  /*
3034  * we don't zero st_progress_param here to save cycles; nobody should
3035  * examine it until st_progress_command has been set to something other
3036  * than PROGRESS_COMMAND_INVALID
3037  */
3038 
3039  /*
3040  * We're ready to enter the critical section that fills the shared-memory
3041  * status entry. We follow the protocol of bumping st_changecount before
3042  * and after; and make sure it's even afterwards. We use a volatile
3043  * pointer here to ensure the compiler doesn't try to get cute.
3044  */
3045  PGSTAT_BEGIN_WRITE_ACTIVITY(vbeentry);
3046 
3047  /* make sure we'll memcpy the same st_changecount back */
3048  lbeentry.st_changecount = vbeentry->st_changecount;
3049 
3050  memcpy(unvolatize(PgBackendStatus *, vbeentry),
3051  &lbeentry,
3052  sizeof(PgBackendStatus));
3053 
3054  /*
3055  * We can write the out-of-line strings and structs using the pointers
3056  * that are in lbeentry; this saves some de-volatilizing messiness.
3057  */
3058  lbeentry.st_appname[0] = '\0';
3061  NAMEDATALEN);
3062  else
3063  lbeentry.st_clienthostname[0] = '\0';
3064  lbeentry.st_activity_raw[0] = '\0';
3065  /* Also make sure the last byte in each string area is always 0 */
3066  lbeentry.st_appname[NAMEDATALEN - 1] = '\0';
3067  lbeentry.st_clienthostname[NAMEDATALEN - 1] = '\0';
3069 
3070 #ifdef USE_SSL
3071  memcpy(lbeentry.st_sslstatus, &lsslstatus, sizeof(PgBackendSSLStatus));
3072 #endif
3073 #ifdef ENABLE_GSS
3074  memcpy(lbeentry.st_gssstatus, &lgssstatus, sizeof(PgBackendGSSStatus));
3075 #endif
3076 
3077  PGSTAT_END_WRITE_ACTIVITY(vbeentry);
3078 
3079  /* Update app name to current GUC setting */
3080  if (application_name)
3082 }
char ssl_issuer_dn[NAMEDATALEN]
Definition: pgstat.h:1032
char gss_princ[NAMEDATALEN]
Definition: pgstat.h:1046
bool ssl_compression
Definition: pgstat.h:1021
char ssl_cipher[NAMEDATALEN]
Definition: pgstat.h:1023
Oid st_progress_command_target
Definition: pgstat.h:1136
int MyProcPid
Definition: globals.c:40
struct Port * MyProcPort
Definition: globals.c:43
const char * be_gssapi_get_princ(Port *port)
BackendType MyBackendType
Definition: miscinit.c:60
TimestampTz st_activity_start_timestamp
Definition: pgstat.h:1094
char ssl_client_dn[NAMEDATALEN]
Definition: pgstat.h:1024
char ssl_version[NAMEDATALEN]
Definition: pgstat.h:1022
SockAddr st_clientaddr
Definition: pgstat.h:1100
#define MemSet(start, val, len)
Definition: c.h:978
bool ssl_in_use
Definition: libpq-be.h:190
ProgressCommandType st_progress_command
Definition: pgstat.h:1135
char ssl_client_serial[NAMEDATALEN]
Definition: pgstat.h:1030
BackendState st_state
Definition: pgstat.h:1112
char * st_clienthostname
Definition: pgstat.h:1101
Oid GetSessionUserId(void)
Definition: miscinit.c:482
Oid st_databaseid
Definition: pgstat.h:1098
#define NAMEDATALEN
char * remote_hostname
Definition: libpq-be.h:128
SockAddr raddr
Definition: libpq-be.h:126
bool be_tls_get_compression(Port *port)
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1176
char * st_activity_raw
Definition: pgstat.h:1124
int pgstat_track_activity_query_size
Definition: pgstat.c:127
TimestampTz st_state_start_timestamp
Definition: pgstat.h:1095
char * st_appname
Definition: pgstat.h:1115
bool be_gssapi_get_enc(Port *port)
TimestampTz MyStartTimestamp
Definition: globals.c:42
int be_tls_get_cipher_bits(Port *port)
Oid MyDatabaseId
Definition: globals.c:85
BackendType st_backendType
Definition: pgstat.h:1089
void pgstat_report_appname(const char *appname)
Definition: pgstat.c:3305
#define InvalidOid
Definition: postgres_ext.h:36
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
#define Assert(condition)
Definition: c.h:745
const char * be_tls_get_version(Port *port)
void be_tls_get_peer_issuer_name(Port *port, char *ptr, size_t len)
char * application_name
Definition: guc.c:559
void be_tls_get_peer_subject_name(Port *port, char *ptr, size_t len)
void * gss
Definition: libpq-be.h:184
#define unvolatize(underlying_type, expr)
Definition: c.h:1214
void be_tls_get_peer_serial(Port *port, char *ptr, size_t len)
TimestampTz st_xact_start_timestamp
Definition: pgstat.h:1093
int st_changecount
Definition: pgstat.h:1083
const char * be_tls_get_cipher(Port *port)
TimestampTz st_proc_start_timestamp
Definition: pgstat.h:1092
PgBackendSSLStatus * st_sslstatus
Definition: pgstat.h:1105
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1169
PgBackendGSSStatus * st_gssstatus
Definition: pgstat.h:1109
bool be_gssapi_get_auth(Port *port)

◆ pgstat_clear_snapshot()

void pgstat_clear_snapshot ( void  )

Definition at line 5840 of file pgstat.c.

References localNumBackends, and MemoryContextDelete().

Referenced by AtEOXact_PgStat(), autovac_refresh_stats(), AutoVacLauncherMain(), pg_stat_clear_snapshot(), and PostPrepare_PgStat().

5841 {
5842  /* Release memory, if any was allocated */
5843  if (pgStatLocalContext)
5845 
5846  /* Reset variables */
5847  pgStatLocalContext = NULL;
5848  pgStatDBHash = NULL;
5849  localBackendStatusTable = NULL;
5850  localNumBackends = 0;
5851 }
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:211
static LocalPgBackendStatus * localBackendStatusTable
Definition: pgstat.c:272
static HTAB * pgStatDBHash
Definition: pgstat.c:269
static int localNumBackends
Definition: pgstat.c:275
static MemoryContext pgStatLocalContext
Definition: pgstat.c:268

◆ pgstat_clip_activity()

char* pgstat_clip_activity ( const char *  raw_activity)

Definition at line 6644 of file pgstat.c.

References cliplen(), pg_mbcliplen(), pgstat_track_activity_query_size, and pnstrdup().

Referenced by pg_stat_get_activity(), pg_stat_get_backend_activity(), and pgstat_get_backend_current_activity().

6645 {
6646  char *activity;
6647  int rawlen;
6648  int cliplen;
6649 
6650  /*
6651  * Some callers, like pgstat_get_backend_current_activity(), do not
6652  * guarantee that the buffer isn't concurrently modified. We try to take
6653  * care that the buffer is always terminated by a NUL byte regardless, but
6654  * let's still be paranoid about the string's length. In those cases the
6655  * underlying buffer is guaranteed to be pgstat_track_activity_query_size
6656  * large.
6657  */
6658  activity = pnstrdup(raw_activity, pgstat_track_activity_query_size - 1);
6659 
6660  /* now double-guaranteed to be NUL terminated */
6661  rawlen = strlen(activity);
6662 
6663  /*
6664  * All supported server-encodings make it possible to determine the length
6665  * of a multi-byte character from its first byte (this is not the case for
6666  * client encodings, see GB18030). As st_activity is always stored using
6667  * server encoding, this allows us to perform multi-byte aware truncation,
6668  * even if the string earlier was truncated in the middle of a multi-byte
6669  * character.
6670  */
6671  cliplen = pg_mbcliplen(activity, rawlen,
6673 
6674  activity[cliplen] = '\0';
6675 
6676  return activity;
6677 }
char * pnstrdup(const char *in, Size len)
Definition: mcxt.c:1197
int pg_mbcliplen(const char *mbstr, int len, int limit)
Definition: mbutils.c:967
int pgstat_track_activity_query_size
Definition: pgstat.c:127
static int cliplen(const char *str, int len, int limit)
Definition: mbutils.c:1034

◆ pgstat_count_heap_delete()

void pgstat_count_heap_delete ( Relation  rel)

Definition at line 2043 of file pgstat.c.

References add_tabstat_xact_level(), GetCurrentTransactionNestLevel(), PgStat_TableXactStatus::nest_level, RelationData::pgstat_info, PgStat_TableStatus::trans, and PgStat_TableXactStatus::tuples_deleted.

Referenced by heap_abort_speculative(), and heap_delete().

2044 {
2045  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
2046 
2047  if (pgstat_info != NULL)
2048  {
2049  /* We have to log the effect at the proper transactional level */
2050  int nest_level = GetCurrentTransactionNestLevel();
2051 
2052  if (pgstat_info->trans == NULL ||
2053  pgstat_info->trans->nest_level != nest_level)
2054  add_tabstat_xact_level(pgstat_info, nest_level);
2055 
2056  pgstat_info->trans->tuples_deleted++;
2057  }
2058 }
PgStat_Counter tuples_deleted
Definition: pgstat.h:172
int GetCurrentTransactionNestLevel(void)
Definition: xact.c:842
struct PgStat_TableStatus * pgstat_info
Definition: rel.h:236
static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level)
Definition: pgstat.c:1970
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160

◆ pgstat_count_heap_insert()

void pgstat_count_heap_insert ( Relation  rel,
PgStat_Counter  n 
)

Definition at line 1997 of file pgstat.c.

References add_tabstat_xact_level(), GetCurrentTransactionNestLevel(), PgStat_TableXactStatus::nest_level, RelationData::pgstat_info, PgStat_TableStatus::trans, and PgStat_TableXactStatus::tuples_inserted.

Referenced by ExecRefreshMatView(), heap_insert(), and heap_multi_insert().

1998 {
1999  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
2000 
2001  if (pgstat_info != NULL)
2002  {
2003  /* We have to log the effect at the proper transactional level */
2004  int nest_level = GetCurrentTransactionNestLevel();
2005 
2006  if (pgstat_info->trans == NULL ||
2007  pgstat_info->trans->nest_level != nest_level)
2008  add_tabstat_xact_level(pgstat_info, nest_level);
2009 
2010  pgstat_info->trans->tuples_inserted += n;
2011  }
2012 }
PgStat_Counter tuples_inserted
Definition: pgstat.h:170
int GetCurrentTransactionNestLevel(void)
Definition: xact.c:842
struct PgStat_TableStatus * pgstat_info
Definition: rel.h:236
static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level)
Definition: pgstat.c:1970
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160

◆ pgstat_count_heap_update()

void pgstat_count_heap_update ( Relation  rel,
bool  hot 
)

Definition at line 2018 of file pgstat.c.

References add_tabstat_xact_level(), GetCurrentTransactionNestLevel(), PgStat_TableXactStatus::nest_level, RelationData::pgstat_info, PgStat_TableStatus::t_counts, PgStat_TableCounts::t_tuples_hot_updated, PgStat_TableStatus::trans, and PgStat_TableXactStatus::tuples_updated.

Referenced by heap_update().

2019 {
2020  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
2021 
2022  if (pgstat_info != NULL)
2023  {
2024  /* We have to log the effect at the proper transactional level */
2025  int nest_level = GetCurrentTransactionNestLevel();
2026 
2027  if (pgstat_info->trans == NULL ||
2028  pgstat_info->trans->nest_level != nest_level)
2029  add_tabstat_xact_level(pgstat_info, nest_level);
2030 
2031  pgstat_info->trans->tuples_updated++;
2032 
2033  /* t_tuples_hot_updated is nontransactional, so just advance it */
2034  if (hot)
2035  pgstat_info->t_counts.t_tuples_hot_updated++;
2036  }
2037 }
PgStat_Counter tuples_updated
Definition: pgstat.h:171
PgStat_Counter t_tuples_hot_updated
Definition: pgstat.h:110
PgStat_TableCounts t_counts
Definition: pgstat.h:161
int GetCurrentTransactionNestLevel(void)
Definition: xact.c:842
struct PgStat_TableStatus * pgstat_info
Definition: rel.h:236
static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level)
Definition: pgstat.c:1970
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160

◆ pgstat_count_slru_flush()

void pgstat_count_slru_flush ( int  slru_idx)

Definition at line 6772 of file pgstat.c.

References PgStat_MsgSLRU::m_flush, and slru_entry().

Referenced by SimpleLruFlush().

6773 {
6774  slru_entry(slru_idx)->m_flush += 1;
6775 }
PgStat_Counter m_flush
Definition: pgstat.h:452
static PgStat_MsgSLRU * slru_entry(int slru_idx)
Definition: pgstat.c:6724

◆ pgstat_count_slru_page_exists()

void pgstat_count_slru_page_exists ( int  slru_idx)

Definition at line 6754 of file pgstat.c.

References PgStat_MsgSLRU::m_blocks_exists, and slru_entry().

Referenced by SimpleLruDoesPhysicalPageExist().

6755 {
6756  slru_entry(slru_idx)->m_blocks_exists += 1;
6757 }
static PgStat_MsgSLRU * slru_entry(int slru_idx)
Definition: pgstat.c:6724
PgStat_Counter m_blocks_exists
Definition: pgstat.h:451

◆ pgstat_count_slru_page_hit()

void pgstat_count_slru_page_hit ( int  slru_idx)

Definition at line 6748 of file pgstat.c.

References PgStat_MsgSLRU::m_blocks_hit, and slru_entry().

Referenced by SimpleLruReadPage(), and SimpleLruReadPage_ReadOnly().

6749 {
6750  slru_entry(slru_idx)->m_blocks_hit += 1;
6751 }
static PgStat_MsgSLRU * slru_entry(int slru_idx)
Definition: pgstat.c:6724
PgStat_Counter m_blocks_hit
Definition: pgstat.h:448

◆ pgstat_count_slru_page_read()

void pgstat_count_slru_page_read ( int  slru_idx)

Definition at line 6760 of file pgstat.c.

References PgStat_MsgSLRU::m_blocks_read, and slru_entry().

Referenced by SimpleLruReadPage().

6761 {
6762  slru_entry(slru_idx)->m_blocks_read += 1;
6763 }
static PgStat_MsgSLRU * slru_entry(int slru_idx)
Definition: pgstat.c:6724
PgStat_Counter m_blocks_read
Definition: pgstat.h:449

◆ pgstat_count_slru_page_written()

void pgstat_count_slru_page_written ( int  slru_idx)

Definition at line 6766 of file pgstat.c.

References PgStat_MsgSLRU::m_blocks_written, and slru_entry().

Referenced by SlruPhysicalWritePage().

6767 {
6768  slru_entry(slru_idx)->m_blocks_written += 1;
6769 }
static PgStat_MsgSLRU * slru_entry(int slru_idx)
Definition: pgstat.c:6724
PgStat_Counter m_blocks_written
Definition: pgstat.h:450

◆ pgstat_count_slru_page_zeroed()

void pgstat_count_slru_page_zeroed ( int  slru_idx)

Definition at line 6742 of file pgstat.c.

References PgStat_MsgSLRU::m_blocks_zeroed, and slru_entry().

Referenced by SimpleLruZeroPage().

6743 {
6744  slru_entry(slru_idx)->m_blocks_zeroed += 1;
6745 }
static PgStat_MsgSLRU * slru_entry(int slru_idx)
Definition: pgstat.c:6724
PgStat_Counter m_blocks_zeroed
Definition: pgstat.h:447

◆ pgstat_count_slru_truncate()

void pgstat_count_slru_truncate ( int  slru_idx)

Definition at line 6778 of file pgstat.c.

References PgStat_MsgSLRU::m_truncate, and slru_entry().

Referenced by SimpleLruTruncate().

6779 {
6780  slru_entry(slru_idx)->m_truncate += 1;
6781 }
static PgStat_MsgSLRU * slru_entry(int slru_idx)
Definition: pgstat.c:6724
PgStat_Counter m_truncate
Definition: pgstat.h:453

◆ pgstat_count_truncate()

void pgstat_count_truncate ( Relation  rel)

Definition at line 2098 of file pgstat.c.

References add_tabstat_xact_level(), GetCurrentTransactionNestLevel(), PgStat_TableXactStatus::nest_level, RelationData::pgstat_info, pgstat_truncate_save_counters(), PgStat_TableStatus::trans, PgStat_TableXactStatus::tuples_deleted, PgStat_TableXactStatus::tuples_inserted, and PgStat_TableXactStatus::tuples_updated.

Referenced by ExecRefreshMatView(), and ExecuteTruncateGuts().

2099 {
2100  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
2101 
2102  if (pgstat_info != NULL)
2103  {
2104  /* We have to log the effect at the proper transactional level */
2105  int nest_level = GetCurrentTransactionNestLevel();
2106 
2107  if (pgstat_info->trans == NULL ||
2108  pgstat_info->trans->nest_level != nest_level)
2109  add_tabstat_xact_level(pgstat_info, nest_level);
2110 
2111  pgstat_truncate_save_counters(pgstat_info->trans);
2112  pgstat_info->trans->tuples_inserted = 0;
2113  pgstat_info->trans->tuples_updated = 0;
2114  pgstat_info->trans->tuples_deleted = 0;
2115  }
2116 }
PgStat_Counter tuples_updated
Definition: pgstat.h:171
PgStat_Counter tuples_inserted
Definition: pgstat.h:170
PgStat_Counter tuples_deleted
Definition: pgstat.h:172
int GetCurrentTransactionNestLevel(void)
Definition: xact.c:842
struct PgStat_TableStatus * pgstat_info
Definition: rel.h:236
static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level)
Definition: pgstat.c:1970
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160
static void pgstat_truncate_save_counters(PgStat_TableXactStatus *trans)
Definition: pgstat.c:2069

◆ pgstat_drop_database()

void pgstat_drop_database ( Oid  databaseid)

Definition at line 1284 of file pgstat.c.

References PgStat_MsgTabpurge::m_databaseid, PgStat_MsgDropdb::m_databaseid, PgStat_MsgTabpurge::m_hdr, PgStat_MsgDropdb::m_hdr, PgStat_MsgTabpurge::m_nentries, PgStat_MsgTabpurge::m_tableid, MyDatabaseId, offsetof, PGINVALID_SOCKET, PGSTAT_MTYPE_DROPDB, PGSTAT_MTYPE_TABPURGE, pgstat_send(), pgstat_setheader(), and pgStatSock.

Referenced by dropdb(), and pgstat_vacuum_stat().

1285 {
1286  PgStat_MsgDropdb msg;
1287 
1289  return;
1290 
1292  msg.m_databaseid = databaseid;
1293  pgstat_send(&msg, sizeof(msg));
1294 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
Oid m_databaseid
Definition: pgstat.h:309
PgStat_MsgHdr m_hdr
Definition: pgstat.h:308
#define PGINVALID_SOCKET
Definition: port.h:33
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318

◆ pgstat_end_function_usage()

void pgstat_end_function_usage ( PgStat_FunctionCallUsage fcu,
bool  finalize 
)

Definition at line 1747 of file pgstat.c.

References PgStat_FunctionCounts::f_numcalls, PgStat_FunctionCounts::f_self_time, PgStat_FunctionCallUsage::f_start, PgStat_FunctionCounts::f_total_time, PgStat_FunctionCallUsage::fs, have_function_stats, INSTR_TIME_ADD, INSTR_TIME_SET_CURRENT, INSTR_TIME_SUBTRACT, PgStat_FunctionCallUsage::save_f_total_time, PgStat_FunctionCallUsage::save_total, and total_func_time.

Referenced by call_pltcl_start_proc(), EventTriggerInvoke(), ExecCallTriggerFunc(), ExecEvalFuncExprFusage(), ExecEvalFuncExprStrictFusage(), ExecMakeFunctionResultSet(), ExecMakeTableFunctionResult(), ExecuteCallStmt(), and fmgr_security_definer().

1748 {
1749  PgStat_FunctionCounts *fs = fcu->fs;
1750  instr_time f_total;
1751  instr_time f_others;
1752  instr_time f_self;
1753 
1754  /* stats not wanted? */
1755  if (fs == NULL)
1756  return;
1757 
1758  /* total elapsed time in this function call */
1759  INSTR_TIME_SET_CURRENT(f_total);
1760  INSTR_TIME_SUBTRACT(f_total, fcu->f_start);
1761 
1762  /* self usage: elapsed minus anything already charged to other calls */
1763  f_others = total_func_time;
1764  INSTR_TIME_SUBTRACT(f_others, fcu->save_total);
1765  f_self = f_total;
1766  INSTR_TIME_SUBTRACT(f_self, f_others);
1767 
1768  /* update backend-wide total time */
1770 
1771  /*
1772  * Compute the new f_total_time as the total elapsed time added to the
1773  * pre-call value of f_total_time. This is necessary to avoid
1774  * double-counting any time taken by recursive calls of myself. (We do
1775  * not need any similar kluge for self time, since that already excludes
1776  * any recursive calls.)
1777  */
1778  INSTR_TIME_ADD(f_total, fcu->save_f_total_time);
1779 
1780  /* update counters in function stats table */
1781  if (finalize)
1782  fs->f_numcalls++;
1783  fs->f_total_time = f_total;
1784  INSTR_TIME_ADD(fs->f_self_time, f_self);
1785 
1786  /* indicate that we have something to send */
1787  have_function_stats = true;
1788 }
instr_time f_self_time
Definition: pgstat.h:494
instr_time save_total
Definition: pgstat.h:1240
struct timeval instr_time
Definition: instr_time.h:150
instr_time f_total_time
Definition: pgstat.h:493
PgStat_FunctionCounts * fs
Definition: pgstat.h:1236
PgStat_Counter f_numcalls
Definition: pgstat.h:492
#define INSTR_TIME_SUBTRACT(x, y)
Definition: instr_time.h:170
#define INSTR_TIME_ADD(x, y)
Definition: instr_time.h:158
static instr_time total_func_time
Definition: pgstat.c:298
static bool have_function_stats
Definition: pgstat.c:228
#define INSTR_TIME_SET_CURRENT(t)
Definition: instr_time.h:156
instr_time save_f_total_time
Definition: pgstat.h:1238

◆ pgstat_fetch_global()

◆ pgstat_fetch_slru()

PgStat_SLRUStats* pgstat_fetch_slru ( void  )

Definition at line 2687 of file pgstat.c.

References backend_read_statsfile(), and slruStats.

Referenced by pg_stat_get_slru().

2688 {
2690 
2691  return slruStats;
2692 }
static void backend_read_statsfile(void)
Definition: pgstat.c:5686
static PgStat_SLRUStats slruStats[SLRU_NUM_ELEMENTS]
Definition: pgstat.c:284

◆ pgstat_fetch_stat_archiver()

PgStat_ArchiverStats* pgstat_fetch_stat_archiver ( void  )

Definition at line 2653 of file pgstat.c.

References archiverStats, and backend_read_statsfile().

Referenced by pg_stat_get_archiver().

2654 {
2656 
2657  return &archiverStats;
2658 }
static void backend_read_statsfile(void)
Definition: pgstat.c:5686
static PgStat_ArchiverStats archiverStats
Definition: pgstat.c:282

◆ pgstat_fetch_stat_beentry()

◆ pgstat_fetch_stat_dbentry()

PgStat_StatDBEntry* pgstat_fetch_stat_dbentry ( Oid  dbid)

Definition at line 2481 of file pgstat.c.

References backend_read_statsfile(), HASH_FIND, and hash_search().

Referenced by do_autovacuum(), do_start_worker(), pg_stat_get_db_blk_read_time(), pg_stat_get_db_blk_write_time(), pg_stat_get_db_blocks_fetched(), pg_stat_get_db_blocks_hit(), pg_stat_get_db_checksum_failures(), pg_stat_get_db_checksum_last_failure(), pg_stat_get_db_conflict_all(), pg_stat_get_db_conflict_bufferpin(), pg_stat_get_db_conflict_lock(), pg_stat_get_db_conflict_snapshot(), pg_stat_get_db_conflict_startup_deadlock(), pg_stat_get_db_conflict_tablespace(), pg_stat_get_db_deadlocks(), pg_stat_get_db_stat_reset_time(), pg_stat_get_db_temp_bytes(), pg_stat_get_db_temp_files(), pg_stat_get_db_tuples_deleted(), pg_stat_get_db_tuples_fetched(), pg_stat_get_db_tuples_inserted(), pg_stat_get_db_tuples_returned(), pg_stat_get_db_tuples_updated(), pg_stat_get_db_xact_commit(), pg_stat_get_db_xact_rollback(), pgstat_fetch_stat_funcentry(), rebuild_database_list(), and table_recheck_autovac().

2482 {
2483  /*
2484  * If not done for this transaction, read the statistics collector stats
2485  * file into some hash tables.
2486  */
2488 
2489  /*
2490  * Lookup the requested database; return NULL if not found
2491  */
2493  (void *) &dbid,
2494  HASH_FIND, NULL);
2495 }
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:917
static void backend_read_statsfile(void)
Definition: pgstat.c:5686
static HTAB * pgStatDBHash
Definition: pgstat.c:269

◆ pgstat_fetch_stat_funcentry()

PgStat_StatFuncEntry* pgstat_fetch_stat_funcentry ( Oid  funcid)

Definition at line 2564 of file pgstat.c.

References backend_read_statsfile(), PgStat_StatDBEntry::functions, HASH_FIND, hash_search(), MyDatabaseId, and pgstat_fetch_stat_dbentry().

Referenced by pg_stat_get_function_calls(), pg_stat_get_function_self_time(), and pg_stat_get_function_total_time().

2565 {
2566  PgStat_StatDBEntry *dbentry;
2567  PgStat_StatFuncEntry *funcentry = NULL;
2568 
2569  /* load the stats file if needed */
2571 
2572  /* Lookup our database, then find the requested function. */
2574  if (dbentry != NULL && dbentry->functions != NULL)
2575  {
2576  funcentry = (PgStat_StatFuncEntry *) hash_search(dbentry->functions,
2577  (void *) &func_id,
2578  HASH_FIND, NULL);
2579  }
2580 
2581  return funcentry;
2582 }
HTAB * functions
Definition: pgstat.h:657
PgStat_StatDBEntry * pgstat_fetch_stat_dbentry(Oid dbid)
Definition: pgstat.c:2481
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:917
static void backend_read_statsfile(void)
Definition: pgstat.c:5686
Oid MyDatabaseId
Definition: globals.c:85

◆ pgstat_fetch_stat_local_beentry()

LocalPgBackendStatus* pgstat_fetch_stat_local_beentry ( int  beid)

Definition at line 2618 of file pgstat.c.

References localNumBackends, and pgstat_read_current_status().

Referenced by pg_stat_get_activity(), and pg_stat_get_progress_info().

2619 {
2621 
2622  if (beid < 1 || beid > localNumBackends)
2623  return NULL;
2624 
2625  return &localBackendStatusTable[beid - 1];
2626 }
static void pgstat_read_current_status(void)
Definition: pgstat.c:3361
static LocalPgBackendStatus * localBackendStatusTable
Definition: pgstat.c:272
static int localNumBackends
Definition: pgstat.c:275

◆ pgstat_fetch_stat_numbackends()

int pgstat_fetch_stat_numbackends ( void  )

Definition at line 2637 of file pgstat.c.

References localNumBackends, and pgstat_read_current_status().

Referenced by pg_stat_get_activity(), pg_stat_get_backend_idset(), pg_stat_get_db_numbackends(), and pg_stat_get_progress_info().

2638 {
2640 
2641  return localNumBackends;
2642 }
static void pgstat_read_current_status(void)
Definition: pgstat.c:3361
static int localNumBackends
Definition: pgstat.c:275

◆ pgstat_fetch_stat_tabentry()

PgStat_StatTabEntry* pgstat_fetch_stat_tabentry ( Oid  relid)

Definition at line 2508 of file pgstat.c.

References backend_read_statsfile(), HASH_FIND, hash_search(), InvalidOid, MyDatabaseId, and PgStat_StatDBEntry::tables.

Referenced by index_concurrently_swap(), pg_stat_get_analyze_count(), pg_stat_get_autoanalyze_count(), pg_stat_get_autovacuum_count(), pg_stat_get_blocks_fetched(), pg_stat_get_blocks_hit(), pg_stat_get_dead_tuples(), pg_stat_get_ins_since_vacuum(), pg_stat_get_last_analyze_time(), pg_stat_get_last_autoanalyze_time(), pg_stat_get_last_autovacuum_time(), pg_stat_get_last_vacuum_time(), pg_stat_get_live_tuples(), pg_stat_get_mod_since_analyze(), pg_stat_get_numscans(), pg_stat_get_tuples_deleted(), pg_stat_get_tuples_fetched(), pg_stat_get_tuples_hot_updated(), pg_stat_get_tuples_inserted(), pg_stat_get_tuples_returned(), pg_stat_get_tuples_updated(), and pg_stat_get_vacuum_count().

2509 {
2510  Oid dbid;
2511  PgStat_StatDBEntry *dbentry;
2512  PgStat_StatTabEntry *tabentry;
2513 
2514  /*
2515  * If not done for this transaction, read the statistics collector stats
2516  * file into some hash tables.
2517  */
2519 
2520  /*
2521  * Lookup our database, then look in its table hash table.
2522  */
2523  dbid = MyDatabaseId;
2525  (void *) &dbid,
2526  HASH_FIND, NULL);
2527  if (dbentry != NULL && dbentry->tables != NULL)
2528  {
2529  tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables,
2530  (void *) &relid,
2531  HASH_FIND, NULL);
2532  if (tabentry)
2533  return tabentry;
2534  }
2535 
2536  /*
2537  * If we didn't find it, maybe it's a shared table.
2538  */
2539  dbid = InvalidOid;
2541  (void *) &dbid,
2542  HASH_FIND, NULL);
2543  if (dbentry != NULL && dbentry->tables != NULL)
2544  {
2545  tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables,
2546  (void *) &relid,
2547  HASH_FIND, NULL);
2548  if (tabentry)
2549  return tabentry;
2550  }
2551 
2552  return NULL;
2553 }
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:917
unsigned int Oid
Definition: postgres_ext.h:31
static void backend_read_statsfile(void)
Definition: pgstat.c:5686
Oid MyDatabaseId
Definition: globals.c:85
#define InvalidOid
Definition: postgres_ext.h:36
static HTAB * pgStatDBHash
Definition: pgstat.c:269

◆ pgstat_get_backend_current_activity()

const char* pgstat_get_backend_current_activity ( int  pid,
bool  checkUser 
)

Definition at line 4169 of file pgstat.c.

References BackendStatusArray, CHECK_FOR_INTERRUPTS, GetUserId(), i, MaxBackends, pgstat_begin_read_activity, pgstat_clip_activity(), pgstat_end_read_activity, pgstat_read_activity_complete, PgBackendStatus::st_activity_raw, PgBackendStatus::st_procpid, PgBackendStatus::st_userid, and superuser().

Referenced by DeadLockReport().

4170 {
4171  PgBackendStatus *beentry;
4172  int i;
4173 
4174  beentry = BackendStatusArray;
4175  for (i = 1; i <= MaxBackends; i++)
4176  {
4177  /*
4178  * Although we expect the target backend's entry to be stable, that
4179  * doesn't imply that anyone else's is. To avoid identifying the
4180  * wrong backend, while we check for a match to the desired PID we
4181  * must follow the protocol of retrying if st_changecount changes
4182  * while we examine the entry, or if it's odd. (This might be
4183  * unnecessary, since fetching or storing an int is almost certainly
4184  * atomic, but let's play it safe.) We use a volatile pointer here to
4185  * ensure the compiler doesn't try to get cute.
4186  */
4187  volatile PgBackendStatus *vbeentry = beentry;
4188  bool found;
4189 
4190  for (;;)
4191  {
4192  int before_changecount;
4193  int after_changecount;
4194 
4195  pgstat_begin_read_activity(vbeentry, before_changecount);
4196 
4197  found = (vbeentry->st_procpid == pid);
4198 
4199  pgstat_end_read_activity(vbeentry, after_changecount);
4200 
4201  if (pgstat_read_activity_complete(before_changecount,
4202  after_changecount))
4203  break;
4204 
4205  /* Make sure we can break out of loop if stuck... */
4207  }
4208 
4209  if (found)
4210  {
4211  /* Now it is safe to use the non-volatile pointer */
4212  if (checkUser && !superuser() && beentry->st_userid != GetUserId())
4213  return "<insufficient privilege>";
4214  else if (*(beentry->st_activity_raw) == '\0')
4215  return "<command string not enabled>";
4216  else
4217  {
4218  /* this'll leak a bit of memory, but that seems acceptable */
4219  return pgstat_clip_activity(beentry->st_activity_raw);
4220  }
4221  }
4222 
4223  beentry++;
4224  }
4225 
4226  /* If we get here, caller is in error ... */
4227  return "<backend information not available>";
4228 }
static PgBackendStatus * BackendStatusArray
Definition: pgstat.c:2700
Oid GetUserId(void)
Definition: miscinit.c:448
bool superuser(void)
Definition: superuser.c:46
int MaxBackends
Definition: globals.c:135
char * st_activity_raw
Definition: pgstat.h:1124
#define pgstat_end_read_activity(beentry, after_changecount)
Definition: pgstat.h:1190
#define pgstat_begin_read_activity(beentry, before_changecount)
Definition: pgstat.h:1184
char * pgstat_clip_activity(const char *raw_activity)
Definition: pgstat.c:6644
int i
#define CHECK_FOR_INTERRUPTS()
Definition: miscadmin.h:99
#define pgstat_read_activity_complete(before_changecount, after_changecount)
Definition: pgstat.h:1196

◆ pgstat_get_crashed_backend_activity()

const char* pgstat_get_crashed_backend_activity ( int  pid,
char *  buffer,
int  buflen 
)

Definition at line 4247 of file pgstat.c.

References ascii_safe_strlcpy(), BackendActivityBuffer, BackendActivityBufferSize, BackendStatusArray, i, MaxBackends, Min, pgstat_track_activity_query_size, PgBackendStatus::st_activity_raw, and PgBackendStatus::st_procpid.

Referenced by LogChildExit().

4248 {
4249  volatile PgBackendStatus *beentry;
4250  int i;
4251 
4252  beentry = BackendStatusArray;
4253 
4254  /*
4255  * We probably shouldn't get here before shared memory has been set up,
4256  * but be safe.
4257  */
4258  if (beentry == NULL || BackendActivityBuffer == NULL)
4259  return NULL;
4260 
4261  for (i = 1; i <= MaxBackends; i++)
4262  {
4263  if (beentry->st_procpid == pid)
4264  {
4265  /* Read pointer just once, so it can't change after validation */
4266  const char *activity = beentry->st_activity_raw;
4267  const char *activity_last;
4268 
4269  /*
4270  * We mustn't access activity string before we verify that it
4271  * falls within the BackendActivityBuffer. To make sure that the
4272  * entire string including its ending is contained within the
4273  * buffer, subtract one activity length from the buffer size.
4274  */
4277 
4278  if (activity < BackendActivityBuffer ||
4279  activity > activity_last)
4280  return NULL;
4281 
4282  /* If no string available, no point in a report */
4283  if (activity[0] == '\0')
4284  return NULL;
4285 
4286  /*
4287  * Copy only ASCII-safe characters so we don't run into encoding
4288  * problems when reporting the message; and be sure not to run off
4289  * the end of memory. As only ASCII characters are reported, it
4290  * doesn't seem necessary to perform multibyte aware clipping.
4291  */
4292  ascii_safe_strlcpy(buffer, activity,
4293  Min(buflen, pgstat_track_activity_query_size));
4294 
4295  return buffer;
4296  }
4297 
4298  beentry++;
4299  }
4300 
4301  /* PID not found */
4302  return NULL;
4303 }
static PgBackendStatus * BackendStatusArray
Definition: pgstat.c:2700
static char * BackendActivityBuffer
Definition: pgstat.c:2704
#define Min(x, y)
Definition: c.h:927
static Size BackendActivityBufferSize
Definition: pgstat.c:2705
void ascii_safe_strlcpy(char *dest, const char *src, size_t destsiz)
Definition: ascii.c:173
int MaxBackends
Definition: globals.c:135
char * st_activity_raw
Definition: pgstat.h:1124
int pgstat_track_activity_query_size
Definition: pgstat.c:127
int i

◆ pgstat_get_wait_event()

const char* pgstat_get_wait_event ( uint32  wait_event_info)

Definition at line 3568 of file pgstat.c.

References GetLockNameFromTagType(), GetLWLockIdentifier(), PG_WAIT_ACTIVITY, PG_WAIT_BUFFER_PIN, PG_WAIT_CLIENT, PG_WAIT_EXTENSION, PG_WAIT_IO, PG_WAIT_IPC, PG_WAIT_LOCK, PG_WAIT_LWLOCK, PG_WAIT_TIMEOUT, pgstat_get_wait_activity(), pgstat_get_wait_client(), pgstat_get_wait_io(), pgstat_get_wait_ipc(), and pgstat_get_wait_timeout().

Referenced by pg_stat_get_activity(), and pg_stat_get_backend_wait_event().

3569 {
3570  uint32 classId;
3571  uint16 eventId;
3572  const char *event_name;
3573 
3574  /* report process as not waiting. */
3575  if (wait_event_info == 0)
3576  return NULL;
3577 
3578  classId = wait_event_info & 0xFF000000;
3579  eventId = wait_event_info & 0x0000FFFF;
3580 
3581  switch (classId)
3582  {
3583  case PG_WAIT_LWLOCK:
3584  event_name = GetLWLockIdentifier(classId, eventId);
3585  break;
3586  case PG_WAIT_LOCK:
3587  event_name = GetLockNameFromTagType(eventId);
3588  break;
3589  case PG_WAIT_BUFFER_PIN:
3590  event_name = "BufferPin";
3591  break;
3592  case PG_WAIT_ACTIVITY:
3593  {
3594  WaitEventActivity w = (WaitEventActivity) wait_event_info;
3595 
3596  event_name = pgstat_get_wait_activity(w);
3597  break;
3598  }
3599  case PG_WAIT_CLIENT:
3600  {
3601  WaitEventClient w = (WaitEventClient) wait_event_info;
3602 
3603  event_name = pgstat_get_wait_client(w);
3604  break;
3605  }
3606  case PG_WAIT_EXTENSION:
3607  event_name = "Extension";
3608  break;
3609  case PG_WAIT_IPC:
3610  {
3611  WaitEventIPC w = (WaitEventIPC) wait_event_info;
3612 
3613  event_name = pgstat_get_wait_ipc(w);
3614  break;
3615  }
3616  case PG_WAIT_TIMEOUT:
3617  {
3618  WaitEventTimeout w = (WaitEventTimeout) wait_event_info;
3619 
3620  event_name = pgstat_get_wait_timeout(w);
3621  break;
3622  }
3623  case PG_WAIT_IO:
3624  {
3625  WaitEventIO w = (WaitEventIO) wait_event_info;
3626 
3627  event_name = pgstat_get_wait_io(w);
3628  break;
3629  }
3630  default:
3631  event_name = "unknown wait event";
3632  break;
3633  }
3634 
3635  return event_name;
3636 }
#define PG_WAIT_LOCK
Definition: pgstat.h:785
WaitEventIPC
Definition: pgstat.h:847
static const char * pgstat_get_wait_timeout(WaitEventTimeout w)
Definition: pgstat.c:3894
static const char * pgstat_get_wait_ipc(WaitEventIPC w)
Definition: pgstat.c:3749
#define PG_WAIT_ACTIVITY
Definition: pgstat.h:787
#define PG_WAIT_IO
Definition: pgstat.h:792
static const char * pgstat_get_wait_activity(WaitEventActivity w)
Definition: pgstat.c:3645
unsigned short uint16
Definition: c.h:373
#define PG_WAIT_CLIENT
Definition: pgstat.h:788
WaitEventClient
Definition: pgstat.h:827
static const char * pgstat_get_wait_client(WaitEventClient w)
Definition: pgstat.c:3703
unsigned int uint32
Definition: c.h:374
WaitEventTimeout
Definition: pgstat.h:899
#define PG_WAIT_EXTENSION
Definition: pgstat.h:789
#define PG_WAIT_BUFFER_PIN
Definition: pgstat.h:786
const char * GetLockNameFromTagType(uint16 locktag_type)
Definition: lmgr.c:1170
WaitEventIO
Definition: pgstat.h:914
#define PG_WAIT_TIMEOUT
Definition: pgstat.h:791
#define PG_WAIT_IPC
Definition: pgstat.h:790
const char * GetLWLockIdentifier(uint32 classId, uint16 eventId)
Definition: lwlock.c:809
static const char * pgstat_get_wait_io(WaitEventIO w)
Definition: pgstat.c:3928
#define PG_WAIT_LWLOCK
Definition: pgstat.h:784
WaitEventActivity
Definition: pgstat.h:802

◆ pgstat_get_wait_event_type()

const char* pgstat_get_wait_event_type ( uint32  wait_event_info)

Definition at line 3513 of file pgstat.c.

References PG_WAIT_ACTIVITY, PG_WAIT_BUFFER_PIN, PG_WAIT_CLIENT, PG_WAIT_EXTENSION, PG_WAIT_IO, PG_WAIT_IPC, PG_WAIT_LOCK, PG_WAIT_LWLOCK, and PG_WAIT_TIMEOUT.

Referenced by pg_stat_get_activity(), and pg_stat_get_backend_wait_event_type().

3514 {
3515  uint32 classId;
3516  const char *event_type;
3517 
3518  /* report process as not waiting. */
3519  if (wait_event_info == 0)
3520  return NULL;
3521 
3522  classId = wait_event_info & 0xFF000000;
3523 
3524  switch (classId)
3525  {
3526  case PG_WAIT_LWLOCK:
3527  event_type = "LWLock";
3528  break;
3529  case PG_WAIT_LOCK:
3530  event_type = "Lock";
3531  break;
3532  case PG_WAIT_BUFFER_PIN:
3533  event_type = "BufferPin";
3534  break;
3535  case PG_WAIT_ACTIVITY:
3536  event_type = "Activity";
3537  break;
3538  case PG_WAIT_CLIENT:
3539  event_type = "Client";
3540  break;
3541  case PG_WAIT_EXTENSION:
3542  event_type = "Extension";
3543  break;
3544  case PG_WAIT_IPC:
3545  event_type = "IPC";
3546  break;
3547  case PG_WAIT_TIMEOUT:
3548  event_type = "Timeout";
3549  break;
3550  case PG_WAIT_IO:
3551  event_type = "IO";
3552  break;
3553  default:
3554  event_type = "???";
3555  break;
3556  }
3557 
3558  return event_type;
3559 }
#define PG_WAIT_LOCK
Definition: pgstat.h:785
#define PG_WAIT_ACTIVITY
Definition: pgstat.h:787
#define PG_WAIT_IO
Definition: pgstat.h:792
#define PG_WAIT_CLIENT
Definition: pgstat.h:788
unsigned int uint32
Definition: c.h:374
#define PG_WAIT_EXTENSION
Definition: pgstat.h:789
#define PG_WAIT_BUFFER_PIN
Definition: pgstat.h:786
#define PG_WAIT_TIMEOUT
Definition: pgstat.h:791
#define PG_WAIT_IPC
Definition: pgstat.h:790
#define PG_WAIT_LWLOCK
Definition: pgstat.h:784

◆ pgstat_init()

void pgstat_init ( void  )

Definition at line 379 of file pgstat.c.

References addrinfo::ai_next, AI_PASSIVE, bind, closesocket, connect, EINTR, elog, ereport, errcode(), errcode_for_socket_access(), errmsg(), gai_strerror, LOG, pg_freeaddrinfo_all(), pg_getaddrinfo_all(), pg_set_noblock(), PGC_INTERNAL, PGC_S_OVERRIDE, PGINVALID_SOCKET, PGSTAT_MAX_MSG_SIZE, PGSTAT_MIN_RCVBUF, pgStatAddr, pgStatSock, recv, ReserveExternalFD(), select, send, SetConfigOption(), socket, StaticAssertStmt, and TESTBYTEVAL.

Referenced by PostmasterMain().

380 {
381  ACCEPT_TYPE_ARG3 alen;
382  struct addrinfo *addrs = NULL,
383  *addr,
384  hints;
385  int ret;
386  fd_set rset;
387  struct timeval tv;
388  char test_byte;
389  int sel_res;
390  int tries = 0;
391 
392 #define TESTBYTEVAL ((char) 199)
393 
394  /*
395  * This static assertion verifies that we didn't mess up the calculations
396  * involved in selecting maximum payload sizes for our UDP messages.
397  * Because the only consequence of overrunning PGSTAT_MAX_MSG_SIZE would
398  * be silent performance loss from fragmentation, it seems worth having a
399  * compile-time cross-check that we didn't.
400  */
402  "maximum stats message size exceeds PGSTAT_MAX_MSG_SIZE");
403 
404  /*
405  * Create the UDP socket for sending and receiving statistic messages
406  */
407  hints.ai_flags = AI_PASSIVE;
408  hints.ai_family = AF_UNSPEC;
409  hints.ai_socktype = SOCK_DGRAM;
410  hints.ai_protocol = 0;
411  hints.ai_addrlen = 0;
412  hints.ai_addr = NULL;
413  hints.ai_canonname = NULL;
414  hints.ai_next = NULL;
415  ret = pg_getaddrinfo_all("localhost", NULL, &hints, &addrs);
416  if (ret || !addrs)
417  {
418  ereport(LOG,
419  (errmsg("could not resolve \"localhost\": %s",
420  gai_strerror(ret))));
421  goto startup_failed;
422  }
423 
424  /*
425  * On some platforms, pg_getaddrinfo_all() may return multiple addresses
426  * only one of which will actually work (eg, both IPv6 and IPv4 addresses
427  * when kernel will reject IPv6). Worse, the failure may occur at the
428  * bind() or perhaps even connect() stage. So we must loop through the
429  * results till we find a working combination. We will generate LOG
430  * messages, but no error, for bogus combinations.
431  */
432  for (addr = addrs; addr; addr = addr->ai_next)
433  {
434 #ifdef HAVE_UNIX_SOCKETS
435  /* Ignore AF_UNIX sockets, if any are returned. */
436  if (addr->ai_family == AF_UNIX)
437  continue;
438 #endif
439 
440  if (++tries > 1)
441  ereport(LOG,
442  (errmsg("trying another address for the statistics collector")));
443 
444  /*
445  * Create the socket.
446  */
447  if ((pgStatSock = socket(addr->ai_family, SOCK_DGRAM, 0)) == PGINVALID_SOCKET)
448  {
449  ereport(LOG,
451  errmsg("could not create socket for statistics collector: %m")));
452  continue;
453  }
454 
455  /*
456  * Bind it to a kernel assigned port on localhost and get the assigned
457  * port via getsockname().
458  */
459  if (bind(pgStatSock, addr->ai_addr, addr->ai_addrlen) < 0)
460  {
461  ereport(LOG,
463  errmsg("could not bind socket for statistics collector: %m")));
466  continue;
467  }
468 
469  alen = sizeof(pgStatAddr);
470  if (getsockname(pgStatSock, (struct sockaddr *) &pgStatAddr, &alen) < 0)
471  {
472  ereport(LOG,
474  errmsg("could not get address of socket for statistics collector: %m")));
477  continue;
478  }
479 
480  /*
481  * Connect the socket to its own address. This saves a few cycles by
482  * not having to respecify the target address on every send. This also
483  * provides a kernel-level check that only packets from this same
484  * address will be received.
485  */
486  if (connect(pgStatSock, (struct sockaddr *) &pgStatAddr, alen) < 0)
487  {
488  ereport(LOG,
490  errmsg("could not connect socket for statistics collector: %m")));
493  continue;
494  }
495 
496  /*
497  * Try to send and receive a one-byte test message on the socket. This
498  * is to catch situations where the socket can be created but will not
499  * actually pass data (for instance, because kernel packet filtering
500  * rules prevent it).
501  */
502  test_byte = TESTBYTEVAL;
503 
504 retry1:
505  if (send(pgStatSock, &test_byte, 1, 0) != 1)
506  {
507  if (errno == EINTR)
508  goto retry1; /* if interrupted, just retry */
509  ereport(LOG,
511  errmsg("could not send test message on socket for statistics collector: %m")));
514  continue;
515  }
516 
517  /*
518  * There could possibly be a little delay before the message can be
519  * received. We arbitrarily allow up to half a second before deciding
520  * it's broken.
521  */
522  for (;;) /* need a loop to handle EINTR */
523  {
524  FD_ZERO(&rset);
525  FD_SET(pgStatSock, &rset);
526 
527  tv.tv_sec = 0;
528  tv.tv_usec = 500000;
529  sel_res = select(pgStatSock + 1, &rset, NULL, NULL, &tv);
530  if (sel_res >= 0 || errno != EINTR)
531  break;
532  }
533  if (sel_res < 0)
534  {
535  ereport(LOG,
537  errmsg("select() failed in statistics collector: %m")));
540  continue;
541  }
542  if (sel_res == 0 || !FD_ISSET(pgStatSock, &rset))
543  {
544  /*
545  * This is the case we actually think is likely, so take pains to
546  * give a specific message for it.
547  *
548  * errno will not be set meaningfully here, so don't use it.
549  */
550  ereport(LOG,
551  (errcode(ERRCODE_CONNECTION_FAILURE),
552  errmsg("test message did not get through on socket for statistics collector")));
555  continue;
556  }
557 
558  test_byte++; /* just make sure variable is changed */
559 
560 retry2:
561  if (recv(pgStatSock, &test_byte, 1, 0) != 1)
562  {
563  if (errno == EINTR)
564  goto retry2; /* if interrupted, just retry */
565  ereport(LOG,
567  errmsg("could not receive test message on socket for statistics collector: %m")));
570  continue;
571  }
572 
573  if (test_byte != TESTBYTEVAL) /* strictly paranoia ... */
574  {
575  ereport(LOG,
576  (errcode(ERRCODE_INTERNAL_ERROR),
577  errmsg("incorrect test message transmission on socket for statistics collector")));
580  continue;
581  }
582 
583  /* If we get here, we have a working socket */
584  break;
585  }
586 
587  /* Did we find a working address? */
588  if (!addr || pgStatSock == PGINVALID_SOCKET)
589  goto startup_failed;
590 
591  /*
592  * Set the socket to non-blocking IO. This ensures that if the collector
593  * falls behind, statistics messages will be discarded; backends won't
594  * block waiting to send messages to the collector.
595  */
597  {
598  ereport(LOG,
600  errmsg("could not set statistics collector socket to nonblocking mode: %m")));
601  goto startup_failed;
602  }
603 
604  /*
605  * Try to ensure that the socket's receive buffer is at least
606  * PGSTAT_MIN_RCVBUF bytes, so that it won't easily overflow and lose
607  * data. Use of UDP protocol means that we are willing to lose data under
608  * heavy load, but we don't want it to happen just because of ridiculously
609  * small default buffer sizes (such as 8KB on older Windows versions).
610  */
611  {
612  int old_rcvbuf;
613  int new_rcvbuf;
614  ACCEPT_TYPE_ARG3 rcvbufsize = sizeof(old_rcvbuf);
615 
616  if (getsockopt(pgStatSock, SOL_SOCKET, SO_RCVBUF,
617  (char *) &old_rcvbuf, &rcvbufsize) < 0)
618  {
619  elog(LOG, "getsockopt(SO_RCVBUF) failed: %m");
620  /* if we can't get existing size, always try to set it */
621  old_rcvbuf = 0;
622  }
623 
624  new_rcvbuf = PGSTAT_MIN_RCVBUF;
625  if (old_rcvbuf < new_rcvbuf)
626  {
627  if (setsockopt(pgStatSock, SOL_SOCKET, SO_RCVBUF,
628  (char *) &new_rcvbuf, sizeof(new_rcvbuf)) < 0)
629  elog(LOG, "setsockopt(SO_RCVBUF) failed: %m");
630  }
631  }
632 
633  pg_freeaddrinfo_all(hints.ai_family, addrs);
634 
635  /* Now that we have a long-lived socket, tell fd.c about it. */
637 
638  return;
639 
640 startup_failed:
641  ereport(LOG,
642  (errmsg("disabling statistics collector for lack of working socket")));
643 
644  if (addrs)
645  pg_freeaddrinfo_all(hints.ai_family, addrs);
646 
650 
651  /*
652  * Adjust GUC variables to suppress useless activity, and for debugging
653  * purposes (seeing track_counts off is a clue that we failed here). We
654  * use PGC_S_OVERRIDE because there is no point in trying to turn it back
655  * on from postgresql.conf without a restart.
656  */
657  SetConfigOption("track_counts", "off", PGC_INTERNAL, PGC_S_OVERRIDE);
658 }
void pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo *ai)
Definition: ip.c:88
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
#define closesocket
Definition: port.h:313
int errcode(int sqlerrcode)
Definition: elog.c:610
#define connect(s, name, namelen)
Definition: win32_port.h:435
#define LOG
Definition: elog.h:26
#define bind(s, addr, addrlen)
Definition: win32_port.h:432
#define recv(s, buf, len, flags)
Definition: win32_port.h:437
#define gai_strerror
Definition: getaddrinfo.h:146
int pg_getaddrinfo_all(const char *hostname, const char *servname, const struct addrinfo *hintp, struct addrinfo **result)
Definition: ip.c:57
#define StaticAssertStmt(condition, errmessage)
Definition: c.h:859
#define PGSTAT_MIN_RCVBUF
Definition: pgstat.c:96
#define TESTBYTEVAL
void ReserveExternalFD(void)
Definition: fd.c:1082
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:7685
#define AI_PASSIVE
Definition: getaddrinfo.h:62
#define select(n, r, w, e, timeout)
Definition: win32_port.h:436
int errcode_for_socket_access(void)
Definition: elog.c:704
#define socket(af, type, protocol)
Definition: win32_port.h:431
#define PGSTAT_MAX_MSG_SIZE
Definition: pgstat.h:209
#define PGINVALID_SOCKET
Definition: port.h:33
#define ereport(elevel,...)
Definition: elog.h:144
static struct sockaddr_storage pgStatAddr
Definition: pgstat.c:176
bool pg_set_noblock(pgsocket sock)
Definition: noblock.c:25
struct addrinfo * ai_next
Definition: getaddrinfo.h:107
int errmsg(const char *fmt,...)
Definition: elog.c:824
#define elog(elevel,...)
Definition: elog.h:214
#define EINTR
Definition: win32_port.h:323
#define send(s, buf, len, flags)
Definition: win32_port.h:438

◆ pgstat_init_function_usage()

void pgstat_init_function_usage ( struct FunctionCallInfoBaseData fcinfo,
PgStat_FunctionCallUsage fcu 
)

◆ pgstat_initialize()

void pgstat_initialize ( void  )

Definition at line 2881 of file pgstat.c.

References Assert, InvalidBackendId, MaxBackends, MyAuxProcType, MyBackendId, NotAnAuxProcess, on_shmem_exit(), and pgstat_beshutdown_hook().

Referenced by AuxiliaryProcessMain(), and InitPostgres().

2882 {
2883  /* Initialize MyBEEntry */
2885  {
2888  }
2889  else
2890  {
2891  /* Must be an auxiliary process */
2893 
2894  /*
2895  * Assign the MyBEEntry for an auxiliary process. Since it doesn't
2896  * have a BackendId, the slot is statically allocated based on the
2897  * auxiliary process type (MyAuxProcType). Backends use slots indexed
2898  * in the range from 1 to MaxBackends (inclusive), so we use
2899  * MaxBackends + AuxBackendType + 1 as the index of the slot for an
2900  * auxiliary process.
2901  */
2903  }
2904 
2905  /* Set up a process-exit hook to clean up */
2907 }
static PgBackendStatus * BackendStatusArray
Definition: pgstat.c:2700
BackendId MyBackendId
Definition: globals.c:81
int MaxBackends
Definition: globals.c:135
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:361
static void pgstat_beshutdown_hook(int code, Datum arg)
Definition: pgstat.c:3094
#define InvalidBackendId
Definition: backendid.h:23
AuxProcType MyAuxProcType
Definition: bootstrap.c:72
#define Assert(condition)
Definition: c.h:745

◆ pgstat_initstats()

void pgstat_initstats ( Relation  rel)

Definition at line 1804 of file pgstat.c.

References get_tabstat_entry(), PGINVALID_SOCKET, RelationData::pgstat_info, pgstat_track_counts, pgStatSock, RelationData::rd_id, RelationData::rd_rel, and PgStat_TableStatus::t_id.

Referenced by relation_open(), and try_relation_open().

1805 {
1806  Oid rel_id = rel->rd_id;
1807  char relkind = rel->rd_rel->relkind;
1808 
1809  /* We only count stats for things that have storage */
1810  if (!RELKIND_HAS_STORAGE(relkind))
1811  {
1812  rel->pgstat_info = NULL;
1813  return;
1814  }
1815 
1817  {
1818  /* We're not counting at all */
1819  rel->pgstat_info = NULL;
1820  return;
1821  }
1822 
1823  /*
1824  * If we already set up this relation in the current transaction, nothing
1825  * to do.
1826  */
1827  if (rel->pgstat_info != NULL &&
1828  rel->pgstat_info->t_id == rel_id)
1829  return;
1830 
1831  /* Else find or make the PgStat_TableStatus entry, and update link */
1832  rel->pgstat_info = get_tabstat_entry(rel_id, rel->rd_rel->relisshared);
1833 }
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
Form_pg_class rd_rel
Definition: rel.h:109
unsigned int Oid
Definition: postgres_ext.h:31
bool pgstat_track_counts
Definition: pgstat.c:125
Oid rd_id
Definition: rel.h:111
static PgStat_TableStatus * get_tabstat_entry(Oid rel_id, bool isshared)
Definition: pgstat.c:1839
#define PGINVALID_SOCKET
Definition: port.h:33
struct PgStat_TableStatus * pgstat_info
Definition: rel.h:236

◆ pgstat_ping()

void pgstat_ping ( void  )

Definition at line 1640 of file pgstat.c.

References PgStat_MsgDummy::m_hdr, PGINVALID_SOCKET, PGSTAT_MTYPE_DUMMY, pgstat_send(), pgstat_setheader(), and pgStatSock.

1641 {
1642  PgStat_MsgDummy msg;
1643 
1645  return;
1646 
1648  pgstat_send(&msg, sizeof(msg));
1649 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
#define PGINVALID_SOCKET
Definition: port.h:33
PgStat_MsgHdr m_hdr
Definition: pgstat.h:219
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318

◆ pgstat_progress_end_command()

void pgstat_progress_end_command ( void  )

Definition at line 3282 of file pgstat.c.

References InvalidOid, MyBEEntry, PGSTAT_BEGIN_WRITE_ACTIVITY, PGSTAT_END_WRITE_ACTIVITY, pgstat_track_activities, PROGRESS_COMMAND_INVALID, PgBackendStatus::st_progress_command, and PgBackendStatus::st_progress_command_target.

Referenced by AbortSubTransaction(), AbortTransaction(), analyze_rel(), cluster_rel(), DefineIndex(), heap_vacuum_rel(), perform_base_backup(), reindex_index(), and ReindexRelationConcurrently().

3283 {
3284  volatile PgBackendStatus *beentry = MyBEEntry;
3285 
3286  if (!beentry || !pgstat_track_activities)
3287  return;
3288 
3290  return;
3291 
3292  PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
3295  PGSTAT_END_WRITE_ACTIVITY(beentry);
3296 }
Oid st_progress_command_target
Definition: pgstat.h:1136
ProgressCommandType st_progress_command
Definition: pgstat.h:1135
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1176
#define InvalidOid
Definition: postgres_ext.h:36
bool pgstat_track_activities
Definition: pgstat.c:124
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1169

◆ pgstat_progress_start_command()

void pgstat_progress_start_command ( ProgressCommandType  cmdtype,
Oid  relid 
)

Definition at line 3210 of file pgstat.c.

References MemSet, MyBEEntry, PGSTAT_BEGIN_WRITE_ACTIVITY, PGSTAT_END_WRITE_ACTIVITY, pgstat_track_activities, PgBackendStatus::st_progress_command, PgBackendStatus::st_progress_command_target, and PgBackendStatus::st_progress_param.

Referenced by analyze_rel(), cluster_rel(), DefineIndex(), heap_vacuum_rel(), perform_base_backup(), reindex_index(), and ReindexRelationConcurrently().

3211 {
3212  volatile PgBackendStatus *beentry = MyBEEntry;
3213 
3214  if (!beentry || !pgstat_track_activities)
3215  return;
3216 
3217  PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
3218  beentry->st_progress_command = cmdtype;
3219  beentry->st_progress_command_target = relid;
3220  MemSet(&beentry->st_progress_param, 0, sizeof(beentry->st_progress_param));
3221  PGSTAT_END_WRITE_ACTIVITY(beentry);
3222 }
Oid st_progress_command_target
Definition: pgstat.h:1136
#define MemSet(start, val, len)
Definition: c.h:978
ProgressCommandType st_progress_command
Definition: pgstat.h:1135
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1176
int64 st_progress_param[PGSTAT_NUM_PROGRESS_PARAM]
Definition: pgstat.h:1137
bool pgstat_track_activities
Definition: pgstat.c:124
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1169

◆ pgstat_progress_update_multi_param()

void pgstat_progress_update_multi_param ( int  nparam,
const int *  index,
const int64 *  val 
)

Definition at line 3253 of file pgstat.c.

References Assert, i, MyBEEntry, PGSTAT_BEGIN_WRITE_ACTIVITY, PGSTAT_END_WRITE_ACTIVITY, PGSTAT_NUM_PROGRESS_PARAM, pgstat_track_activities, and PgBackendStatus::st_progress_param.

Referenced by _bt_spools_heapscan(), BuildRelationExtStatistics(), heapam_relation_copy_for_cluster(), index_build(), lazy_scan_heap(), perform_base_backup(), update_basebackup_progress(), validate_index(), and WaitForLockersMultiple().

3255 {
3256  volatile PgBackendStatus *beentry = MyBEEntry;
3257  int i;
3258 
3259  if (!beentry || !pgstat_track_activities || nparam == 0)
3260  return;
3261 
3262  PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
3263 
3264  for (i = 0; i < nparam; ++i)
3265  {
3266  Assert(index[i] >= 0 && index[i] < PGSTAT_NUM_PROGRESS_PARAM);
3267 
3268  beentry->st_progress_param[index[i]] = val[i];
3269  }
3270 
3271  PGSTAT_END_WRITE_ACTIVITY(beentry);
3272 }
Definition: type.h:89
#define PGSTAT_NUM_PROGRESS_PARAM
Definition: pgstat.h:1001
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1176
#define Assert(condition)
Definition: c.h:745
int64 st_progress_param[PGSTAT_NUM_PROGRESS_PARAM]
Definition: pgstat.h:1137
bool pgstat_track_activities
Definition: pgstat.c:124
int i
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1169
long val
Definition: informix.c:664

◆ pgstat_progress_update_param()

void pgstat_progress_update_param ( int  index,
int64  val 
)

Definition at line 3231 of file pgstat.c.

References Assert, MyBEEntry, PGSTAT_BEGIN_WRITE_ACTIVITY, PGSTAT_END_WRITE_ACTIVITY, PGSTAT_NUM_PROGRESS_PARAM, pgstat_track_activities, PgBackendStatus::st_progress_param, and val.

Referenced by _bt_leafbuild(), _bt_load(), _bt_spools_heapscan(), _h_indexbuild(), acquire_inherited_sample_rows(), acquire_sample_rows(), btvacuumscan(), BuildRelationExtStatistics(), cluster_rel(), DefineIndex(), do_analyze_rel(), finish_heap_swap(), hashbuild(), heap_vacuum_rel(), heapam_index_build_range_scan(), heapam_index_validate_scan(), heapam_relation_copy_for_cluster(), lazy_cleanup_all_indexes(), lazy_record_dead_tuple(), lazy_scan_heap(), lazy_truncate_heap(), lazy_vacuum_all_indexes(), lazy_vacuum_heap(), lazy_vacuum_page(), perform_base_backup(), reindex_index(), reindex_relation(), ReindexRelationConcurrently(), validate_index(), WaitForLockersMultiple(), and WaitForOlderSnapshots().

3232 {
3233  volatile PgBackendStatus *beentry = MyBEEntry;
3234 
3236 
3237  if (!beentry || !pgstat_track_activities)
3238  return;
3239 
3240  PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
3241  beentry->st_progress_param[index] = val;
3242  PGSTAT_END_WRITE_ACTIVITY(beentry);
3243 }
Definition: type.h:89
#define PGSTAT_NUM_PROGRESS_PARAM
Definition: pgstat.h:1001
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1176
#define Assert(condition)
Definition: c.h:745
int64 st_progress_param[PGSTAT_NUM_PROGRESS_PARAM]
Definition: pgstat.h:1137
bool pgstat_track_activities
Definition: pgstat.c:124
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1169
long val
Definition: informix.c:664

◆ pgstat_report_activity()

void pgstat_report_activity ( BackendState  state,
const char *  cmd_str 
)

Definition at line 3132 of file pgstat.c.

References GetCurrentStatementStartTimestamp(), GetCurrentTimestamp(), Min, MyBEEntry, MyProc, PGSTAT_BEGIN_WRITE_ACTIVITY, PGSTAT_END_WRITE_ACTIVITY, pgstat_track_activities, pgstat_track_activity_query_size, PgBackendStatus::st_activity_raw, PgBackendStatus::st_activity_start_timestamp, PgBackendStatus::st_state, PgBackendStatus::st_state_start_timestamp, PgBackendStatus::st_xact_start_timestamp, STATE_DISABLED, and PGPROC::wait_event_info.

Referenced by _bt_parallel_build_main(), apply_handle_begin(), apply_handle_commit(), autovac_report_activity(), autovac_report_workitem(), exec_bind_message(), exec_execute_message(), exec_parse_message(), exec_replication_command(), exec_simple_query(), initialize_worker_spi(), LogicalRepApplyLoop(), parallel_vacuum_main(), ParallelQueryMain(), and PostgresMain().

3133 {
3134  volatile PgBackendStatus *beentry = MyBEEntry;
3135  TimestampTz start_timestamp;
3136  TimestampTz current_timestamp;
3137  int len = 0;
3138 
3139  TRACE_POSTGRESQL_STATEMENT_STATUS(cmd_str);
3140 
3141  if (!beentry)
3142  return;
3143 
3145  {
3146  if (beentry->st_state != STATE_DISABLED)
3147  {
3148  volatile PGPROC *proc = MyProc;
3149 
3150  /*
3151  * track_activities is disabled, but we last reported a
3152  * non-disabled state. As our final update, change the state and
3153  * clear fields we will not be updating anymore.
3154  */
3155  PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
3156  beentry->st_state = STATE_DISABLED;
3157  beentry->st_state_start_timestamp = 0;
3158  beentry->st_activity_raw[0] = '\0';
3159  beentry->st_activity_start_timestamp = 0;
3160  /* st_xact_start_timestamp and wait_event_info are also disabled */
3161  beentry->st_xact_start_timestamp = 0;
3162  proc->wait_event_info = 0;
3163  PGSTAT_END_WRITE_ACTIVITY(beentry);
3164  }
3165  return;
3166  }
3167 
3168  /*
3169  * To minimize the time spent modifying the entry, and avoid risk of
3170  * errors inside the critical section, fetch all the needed data first.
3171  */
3172  start_timestamp = GetCurrentStatementStartTimestamp();
3173  if (cmd_str != NULL)
3174  {
3175  /*
3176  * Compute length of to-be-stored string unaware of multi-byte
3177  * characters. For speed reasons that'll get corrected on read, rather
3178  * than computed every write.
3179  */
3180  len = Min(strlen(cmd_str), pgstat_track_activity_query_size - 1);
3181  }
3182  current_timestamp = GetCurrentTimestamp();
3183 
3184  /*
3185  * Now update the status entry
3186  */
3187  PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
3188 
3189  beentry->st_state = state;
3190  beentry->st_state_start_timestamp = current_timestamp;
3191 
3192  if (cmd_str != NULL)
3193  {
3194  memcpy((char *) beentry->st_activity_raw, cmd_str, len);
3195  beentry->st_activity_raw[len] = '\0';
3196  beentry->st_activity_start_timestamp = start_timestamp;
3197  }
3198 
3199  PGSTAT_END_WRITE_ACTIVITY(beentry);
3200 }
uint32 wait_event_info
Definition: proc.h:185
TimestampTz st_activity_start_timestamp
Definition: pgstat.h:1094
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1574
PGPROC * MyProc
Definition: proc.c:67
int64 TimestampTz
Definition: timestamp.h:39
#define Min(x, y)
Definition: c.h:927
BackendState st_state
Definition: pgstat.h:1112
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1176
char * st_activity_raw
Definition: pgstat.h:1124
int pgstat_track_activity_query_size
Definition: pgstat.c:127
TimestampTz st_state_start_timestamp
Definition: pgstat.h:1095
Definition: regguts.h:298
TimestampTz st_xact_start_timestamp
Definition: pgstat.h:1093
bool pgstat_track_activities
Definition: pgstat.c:124
Definition: proc.h:102
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1169
TimestampTz GetCurrentStatementStartTimestamp(void)
Definition: xact.c:792

◆ pgstat_report_analyze()

void pgstat_report_analyze ( Relation  rel,
PgStat_Counter  livetuples,
PgStat_Counter  deadtuples,
bool  resetcounter 
)

Definition at line 1491 of file pgstat.c.

References GetCurrentTimestamp(), InvalidOid, IsAutoVacuumWorkerProcess(), PgStat_MsgAnalyze::m_analyzetime, PgStat_MsgAnalyze::m_autovacuum, PgStat_MsgAnalyze::m_databaseid, PgStat_MsgAnalyze::m_dead_tuples, PgStat_MsgAnalyze::m_hdr, PgStat_MsgAnalyze::m_live_tuples, PgStat_MsgAnalyze::m_resetcounter, PgStat_MsgAnalyze::m_tableoid, Max, MyDatabaseId, PGINVALID_SOCKET, RelationData::pgstat_info, PGSTAT_MTYPE_ANALYZE, pgstat_send(), pgstat_setheader(), pgstat_track_counts, pgStatSock, RelationData::rd_rel, RelationGetRelid, PgStat_TableStatus::t_counts, PgStat_TableCounts::t_delta_dead_tuples, PgStat_TableStatus::trans, trans, PgStat_TableXactStatus::tuples_deleted, PgStat_TableXactStatus::tuples_inserted, PgStat_TableXactStatus::tuples_updated, and PgStat_TableXactStatus::upper.

Referenced by do_analyze_rel().

1494 {
1495  PgStat_MsgAnalyze msg;
1496 
1498  return;
1499 
1500  /*
1501  * Unlike VACUUM, ANALYZE might be running inside a transaction that has
1502  * already inserted and/or deleted rows in the target table. ANALYZE will
1503  * have counted such rows as live or dead respectively. Because we will
1504  * report our counts of such rows at transaction end, we should subtract
1505  * off these counts from what we send to the collector now, else they'll
1506  * be double-counted after commit. (This approach also ensures that the
1507  * collector ends up with the right numbers if we abort instead of
1508  * committing.)
1509  */
1510  if (rel->pgstat_info != NULL)
1511  {
1513 
1514  for (trans = rel->pgstat_info->trans; trans; trans = trans->upper)
1515  {
1516  livetuples -= trans->tuples_inserted - trans->tuples_deleted;
1517  deadtuples -= trans->tuples_updated + trans->tuples_deleted;
1518  }
1519  /* count stuff inserted by already-aborted subxacts, too */
1520  deadtuples -= rel->pgstat_info->t_counts.t_delta_dead_tuples;
1521  /* Since ANALYZE's counts are estimates, we could have underflowed */
1522  livetuples = Max(livetuples, 0);
1523  deadtuples = Max(deadtuples, 0);
1524  }
1525 
1527  msg.m_databaseid = rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId;
1528  msg.m_tableoid = RelationGetRelid(rel);
1530  msg.m_resetcounter = resetcounter;
1532  msg.m_live_tuples = livetuples;
1533  msg.m_dead_tuples = deadtuples;
1534  pgstat_send(&msg, sizeof(msg));
1535 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
PgStat_Counter tuples_updated
Definition: pgstat.h:171
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1574
TimestampTz m_analyzetime
Definition: pgstat.h:401
PgStat_TableCounts t_counts
Definition: pgstat.h:161
Form_pg_class rd_rel
Definition: rel.h:109
bool m_resetcounter
Definition: pgstat.h:400
bool pgstat_track_counts
Definition: pgstat.c:125
PgStat_Counter tuples_inserted
Definition: pgstat.h:170
PgStat_Counter t_delta_dead_tuples
Definition: pgstat.h:114
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3301
struct PgStat_TableXactStatus * upper
Definition: pgstat.h:179
PgStat_Counter m_live_tuples
Definition: pgstat.h:402
bool m_autovacuum
Definition: pgstat.h:399
PgStat_Counter tuples_deleted
Definition: pgstat.h:172
#define PGINVALID_SOCKET
Definition: port.h:33
Oid MyDatabaseId
Definition: globals.c:85
#define InvalidOid
Definition: postgres_ext.h:36
#define Max(x, y)
Definition: c.h:921
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318
struct PgStat_TableStatus * pgstat_info
Definition: rel.h:236
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160
PgStat_MsgHdr m_hdr
Definition: pgstat.h:396
static zic_t trans[TZ_MAX_LEAPS]
Definition: zic.c:402
PgStat_Counter m_dead_tuples
Definition: pgstat.h:403
#define RelationGetRelid(relation)
Definition: rel.h:456

◆ pgstat_report_appname()

void pgstat_report_appname ( const char *  appname)

Definition at line 3305 of file pgstat.c.

References MyBEEntry, NAMEDATALEN, pg_mbcliplen(), PGSTAT_BEGIN_WRITE_ACTIVITY, PGSTAT_END_WRITE_ACTIVITY, and PgBackendStatus::st_appname.

Referenced by assign_application_name(), and pgstat_bestart().

3306 {
3307  volatile PgBackendStatus *beentry = MyBEEntry;
3308  int len;
3309 
3310  if (!beentry)
3311  return;
3312 
3313  /* This should be unnecessary if GUC did its job, but be safe */
3314  len = pg_mbcliplen(appname, strlen(appname), NAMEDATALEN - 1);
3315 
3316  /*
3317  * Update my status entry, following the protocol of bumping
3318  * st_changecount before and after. We use a volatile pointer here to
3319  * ensure the compiler doesn't try to get cute.
3320  */
3321  PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
3322 
3323  memcpy((char *) beentry->st_appname, appname, len);
3324  beentry->st_appname[len] = '\0';
3325 
3326  PGSTAT_END_WRITE_ACTIVITY(beentry);
3327 }
#define NAMEDATALEN
int pg_mbcliplen(const char *mbstr, int len, int limit)
Definition: mbutils.c:967
static PgBackendStatus * MyBEEntry
Definition: pgstat.c:2701
#define PGSTAT_END_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1176
char * st_appname
Definition: pgstat.h:1115
#define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry)
Definition: pgstat.h:1169

◆ pgstat_report_autovac()

void pgstat_report_autovac ( Oid  dboid)

Definition at line 1441 of file pgstat.c.

References GetCurrentTimestamp(), PgStat_MsgAutovacStart::m_databaseid, PgStat_MsgAutovacStart::m_hdr, PgStat_MsgAutovacStart::m_start_time, PGINVALID_SOCKET, PGSTAT_MTYPE_AUTOVAC_START, pgstat_send(), pgstat_setheader(), and pgStatSock.

Referenced by AutoVacWorkerMain().

1442 {
1444 
1446  return;
1447 
1449  msg.m_databaseid = dboid;
1451 
1452  pgstat_send(&msg, sizeof(msg));
1453 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1574
PgStat_MsgHdr m_hdr
Definition: pgstat.h:366
#define PGINVALID_SOCKET
Definition: port.h:33
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318
TimestampTz m_start_time
Definition: pgstat.h:368

◆ pgstat_report_checksum_failure()

void pgstat_report_checksum_failure ( void  )

Definition at line 1607 of file pgstat.c.

References MyDatabaseId, and pgstat_report_checksum_failures_in_db().

Referenced by PageIsVerified().

1608 {
1610 }
void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount)
Definition: pgstat.c:1585
Oid MyDatabaseId
Definition: globals.c:85

◆ pgstat_report_checksum_failures_in_db()

void pgstat_report_checksum_failures_in_db ( Oid  dboid,
int  failurecount 
)

Definition at line 1585 of file pgstat.c.

References GetCurrentTimestamp(), PgStat_MsgChecksumFailure::m_databaseid, PgStat_MsgChecksumFailure::m_failure_time, PgStat_MsgChecksumFailure::m_failurecount, PgStat_MsgChecksumFailure::m_hdr, PGINVALID_SOCKET, PGSTAT_MTYPE_CHECKSUMFAILURE, pgstat_send(), pgstat_setheader(), pgstat_track_counts, and pgStatSock.

Referenced by pgstat_report_checksum_failure(), and sendFile().

1586 {
1588 
1590  return;
1591 
1593  msg.m_databaseid = dboid;
1594  msg.m_failurecount = failurecount;
1596 
1597  pgstat_send(&msg, sizeof(msg));
1598 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1574
PgStat_MsgHdr m_hdr
Definition: pgstat.h:571
bool pgstat_track_counts
Definition: pgstat.c:125
TimestampTz m_failure_time
Definition: pgstat.h:574
#define PGINVALID_SOCKET
Definition: port.h:33
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318

◆ pgstat_report_deadlock()

void pgstat_report_deadlock ( void  )

Definition at line 1564 of file pgstat.c.

References PgStat_MsgDeadlock::m_databaseid, PgStat_MsgDeadlock::m_hdr, MyDatabaseId, PGINVALID_SOCKET, PGSTAT_MTYPE_DEADLOCK, pgstat_send(), pgstat_setheader(), pgstat_track_counts, and pgStatSock.

Referenced by DeadLockReport().

1565 {
1566  PgStat_MsgDeadlock msg;
1567 
1569  return;
1570 
1572  msg.m_databaseid = MyDatabaseId;
1573  pgstat_send(&msg, sizeof(msg));
1574 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
bool pgstat_track_counts
Definition: pgstat.c:125
PgStat_MsgHdr m_hdr
Definition: pgstat.h:560
#define PGINVALID_SOCKET
Definition: port.h:33
Oid MyDatabaseId
Definition: globals.c:85
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318

◆ pgstat_report_recovery_conflict()

void pgstat_report_recovery_conflict ( int  reason)

Definition at line 1544 of file pgstat.c.

References PgStat_MsgRecoveryConflict::m_databaseid, PgStat_MsgRecoveryConflict::m_hdr, PgStat_MsgRecoveryConflict::m_reason, MyDatabaseId, PGINVALID_SOCKET, PGSTAT_MTYPE_RECOVERYCONFLICT, pgstat_send(), pgstat_setheader(), pgstat_track_counts, and pgStatSock.

Referenced by ProcessInterrupts().

1545 {
1547 
1549  return;
1550 
1552  msg.m_databaseid = MyDatabaseId;
1553  msg.m_reason = reason;
1554  pgstat_send(&msg, sizeof(msg));
1555 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
bool pgstat_track_counts
Definition: pgstat.c:125
PgStat_MsgHdr m_hdr
Definition: pgstat.h:462
#define PGINVALID_SOCKET
Definition: port.h:33
Oid MyDatabaseId
Definition: globals.c:85
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318

◆ pgstat_report_stat()

void pgstat_report_stat ( bool  force)

Definition at line 839 of file pgstat.c.

References Assert, GetCurrentTransactionStopTimestamp(), hash_destroy(), have_function_stats, i, InvalidOid, PgStat_MsgTabstat::m_databaseid, PgStat_MsgTabstat::m_entry, PgStat_MsgTabstat::m_nentries, MemSet, MyDatabaseId, now(), PGSTAT_NUM_TABENTRIES, pgstat_send_funcstats(), pgstat_send_slru(), pgstat_send_tabstat(), PGSTAT_STAT_INTERVAL, pgStatXactCommit, pgStatXactRollback, PgStat_TableStatus::t_counts, PgStat_TableEntry::t_counts, PgStat_TableStatus::t_id, PgStat_TableEntry::t_id, PgStat_TableStatus::t_shared, TimestampDifferenceExceeds(), PgStat_TableStatus::trans, TabStatusArray::tsa_entries, TabStatusArray::tsa_next, and TabStatusArray::tsa_used.

Referenced by apply_handle_commit(), initialize_worker_spi(), LogicalRepSyncTableStart(), pg_attribute_noreturn(), pgstat_beshutdown_hook(), PostgresMain(), and process_syncing_tables_for_apply().

840 {
841  /* we assume this inits to all zeroes: */
842  static const PgStat_TableCounts all_zeroes;
843  static TimestampTz last_report = 0;
844 
846  PgStat_MsgTabstat regular_msg;
847  PgStat_MsgTabstat shared_msg;
848  TabStatusArray *tsa;
849  int i;
850 
851  /* Don't expend a clock check if nothing to do */
852  if ((pgStatTabList == NULL || pgStatTabList->tsa_used == 0) &&
853  pgStatXactCommit == 0 && pgStatXactRollback == 0 &&
855  return;
856 
857  /*
858  * Don't send a message unless it's been at least PGSTAT_STAT_INTERVAL
859  * msec since we last sent one, or the caller wants to force stats out.
860  */
862  if (!force &&
864  return;
865  last_report = now;
866 
867  /*
868  * Destroy pgStatTabHash before we start invalidating PgStat_TableEntry
869  * entries it points to. (Should we fail partway through the loop below,
870  * it's okay to have removed the hashtable already --- the only
871  * consequence is we'd get multiple entries for the same table in the
872  * pgStatTabList, and that's safe.)
873  */
874  if (pgStatTabHash)
876  pgStatTabHash = NULL;
877 
878  /*
879  * Scan through the TabStatusArray struct(s) to find tables that actually
880  * have counts, and build messages to send. We have to separate shared
881  * relations from regular ones because the databaseid field in the message
882  * header has to depend on that.
883  */
884  regular_msg.m_databaseid = MyDatabaseId;
885  shared_msg.m_databaseid = InvalidOid;
886  regular_msg.m_nentries = 0;
887  shared_msg.m_nentries = 0;
888 
889  for (tsa = pgStatTabList; tsa != NULL; tsa = tsa->tsa_next)
890  {
891  for (i = 0; i < tsa->tsa_used; i++)
892  {
893  PgStat_TableStatus *entry = &tsa->tsa_entries[i];
894  PgStat_MsgTabstat *this_msg;
895  PgStat_TableEntry *this_ent;
896 
897  /* Shouldn't have any pending transaction-dependent counts */
898  Assert(entry->trans == NULL);
899 
900  /*
901  * Ignore entries that didn't accumulate any actual counts, such
902  * as indexes that were opened by the planner but not used.
903  */
904  if (memcmp(&entry->t_counts, &all_zeroes,
905  sizeof(PgStat_TableCounts)) == 0)
906  continue;
907 
908  /*
909  * OK, insert data into the appropriate message, and send if full.
910  */
911  this_msg = entry->t_shared ? &shared_msg : &regular_msg;
912  this_ent = &this_msg->m_entry[this_msg->m_nentries];
913  this_ent->t_id = entry->t_id;
914  memcpy(&this_ent->t_counts, &entry->t_counts,
915  sizeof(PgStat_TableCounts));
916  if (++this_msg->m_nentries >= PGSTAT_NUM_TABENTRIES)
917  {
918  pgstat_send_tabstat(this_msg);
919  this_msg->m_nentries = 0;
920  }
921  }
922  /* zero out PgStat_TableStatus structs after use */
923  MemSet(tsa->tsa_entries, 0,
924  tsa->tsa_used * sizeof(PgStat_TableStatus));
925  tsa->tsa_used = 0;
926  }
927 
928  /*
929  * Send partial messages. Make sure that any pending xact commit/abort
930  * gets counted, even if there are no table stats to send.
931  */
932  if (regular_msg.m_nentries > 0 ||
934  pgstat_send_tabstat(&regular_msg);
935  if (shared_msg.m_nentries > 0)
936  pgstat_send_tabstat(&shared_msg);
937 
938  /* Now, send function statistics */
940 
941  /* Finally send SLRU statistics */
943 }
void hash_destroy(HTAB *hashp)
Definition: dynahash.c:825
int tsa_used
Definition: pgstat.c:198
static int pgStatXactCommit
Definition: pgstat.c:246
static void pgstat_send_slru(void)
Definition: pgstat.c:4414
int64 TimestampTz
Definition: timestamp.h:39
#define MemSet(start, val, len)
Definition: c.h:978
struct TabStatusArray * tsa_next
Definition: pgstat.c:197
PgStat_TableCounts t_counts
Definition: pgstat.h:161
bool TimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time, int msec)
Definition: timestamp.c:1673
static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg)
Definition: pgstat.c:949
static HTAB * pgStatTabHash
Definition: pgstat.c:216
static int pgStatXactRollback
Definition: pgstat.c:247
#define PGSTAT_STAT_INTERVAL
Definition: pgstat.c:76
PgStat_TableStatus tsa_entries[TABSTAT_QUANTUM]
Definition: pgstat.c:199
#define PGSTAT_NUM_TABENTRIES
Definition: pgstat.h:266
Oid MyDatabaseId
Definition: globals.c:85
static TabStatusArray * pgStatTabList
Definition: pgstat.c:202
#define InvalidOid
Definition: postgres_ext.h:36
static bool have_function_stats
Definition: pgstat.c:228
TimestampTz GetCurrentTransactionStopTimestamp(void)
Definition: xact.c:804
#define Assert(condition)
Definition: c.h:745
PgStat_TableCounts t_counts
Definition: pgstat.h:258
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:160
PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES]
Definition: pgstat.h:279
int i
static void pgstat_send_funcstats(void)
Definition: pgstat.c:993
Datum now(PG_FUNCTION_ARGS)
Definition: timestamp.c:1538

◆ pgstat_report_tempfile()

void pgstat_report_tempfile ( size_t  filesize)

Definition at line 1619 of file pgstat.c.

References PgStat_MsgTempFile::m_databaseid, PgStat_MsgTempFile::m_filesize, PgStat_MsgTempFile::m_hdr, MyDatabaseId, PGINVALID_SOCKET, PGSTAT_MTYPE_TEMPFILE, pgstat_send(), pgstat_setheader(), pgstat_track_counts, and pgStatSock.

Referenced by ReportTemporaryFileUsage().

1620 {
1621  PgStat_MsgTempFile msg;
1622 
1624  return;
1625 
1627  msg.m_databaseid = MyDatabaseId;
1628  msg.m_filesize = filesize;
1629  pgstat_send(&msg, sizeof(msg));
1630 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
PgStat_MsgHdr m_hdr
Definition: pgstat.h:474
size_t m_filesize
Definition: pgstat.h:477
bool pgstat_track_counts
Definition: pgstat.c:125
#define PGINVALID_SOCKET
Definition: port.h:33
Oid MyDatabaseId
Definition: globals.c:85
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318

◆ pgstat_report_vacuum()

void pgstat_report_vacuum ( Oid  tableoid,
bool  shared,
PgStat_Counter  livetuples,
PgStat_Counter  deadtuples 
)

Definition at line 1463 of file pgstat.c.

References GetCurrentTimestamp(), InvalidOid, IsAutoVacuumWorkerProcess(), PgStat_MsgVacuum::m_autovacuum, PgStat_MsgVacuum::m_databaseid, PgStat_MsgVacuum::m_dead_tuples, PgStat_MsgVacuum::m_hdr, PgStat_MsgVacuum::m_live_tuples, PgStat_MsgVacuum::m_tableoid, PgStat_MsgVacuum::m_vacuumtime, MyDatabaseId, PGINVALID_SOCKET, PGSTAT_MTYPE_VACUUM, pgstat_send(), pgstat_setheader(), pgstat_track_counts, and pgStatSock.

Referenced by heap_vacuum_rel().

1465 {
1466  PgStat_MsgVacuum msg;
1467 
1469  return;
1470 
1472  msg.m_databaseid = shared ? InvalidOid : MyDatabaseId;
1473  msg.m_tableoid = tableoid;
1476  msg.m_live_tuples = livetuples;
1477  msg.m_dead_tuples = deadtuples;
1478  pgstat_send(&msg, sizeof(msg));
1479 }
static void pgstat_send(void *msg, int len)
Definition: pgstat.c:4331
PgStat_Counter m_dead_tuples
Definition: pgstat.h:385
TimestampTz m_vacuumtime
Definition: pgstat.h:383
NON_EXEC_STATIC pgsocket pgStatSock
Definition: pgstat.c:174
PgStat_Counter m_live_tuples
Definition: pgstat.h:384
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1574
Oid m_databaseid
Definition: pgstat.h:380
bool m_autovacuum
Definition: pgstat.h:382
bool pgstat_track_counts
Definition: pgstat.c:125
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3301
#define PGINVALID_SOCKET
Definition: port.h:33
Oid MyDatabaseId
Definition: globals.c:85
#define InvalidOid
Definition: postgres_ext.h:36
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype)
Definition: pgstat.c:4318
PgStat_MsgHdr m_hdr
Definition: pgstat.h:379

◆ pgstat_report_wait_end()

static void pgstat_report_wait_end ( void  )
inlinestatic

Definition at line 1381 of file pgstat.h.

References MyProc, pgstat_track_activities, and PGPROC::wait_event_info.

Referenced by AbortSubTransaction(), AbortTransaction(), AddToDataDirLockFile(), ApplyLogicalMappingFile(), assign_xlog_sync_method(), AutoVacLauncherMain(), BackgroundWriterMain(), basebackup_read_file(), BootStrapXLOG(), CheckpointerMain(), CheckPointLogicalRewriteHeap(), copy_file(), CreateLockFile(), do_pg_stop_backup(), dsm_impl_mmap(), dsm_impl_op(), FilePrefetch(), FileRead(), FileSync(), FileTruncate(), FileWrite(), FileWriteback(), heap_xlog_logical_rewrite(), issue_xlog_fsync(), load_relmap_file(), LWLockReportWaitEnd(), ProcArrayGroupClearXid(), ReadControlFile(), readTimeLineHistory(), ReadTwoPhaseFile(), RecheckDataDirLockFile(), recoveryPausesHere(), RecreateTwoPhaseFile(), ReorderBufferSerializeChange(), RestoreSlotFromDisk(), SaveSlotToPath(), SendTimeLineHistory(), ShutdownAuxiliaryProcess(), SimpleLruFlush(), SlruPhysicalReadPage(), SlruPhysicalWritePage(), SnapBuildRestore(), SnapBuildSerialize(), TransactionGroupUpdateXidStatus(), update_controlfile(), vacuum_delay_point(), WaitEventSetWait(), WaitExceedsMaxStandbyDelay(), WALRead(), WalSndErrorCleanup(), WalWriterMain(), write_relmap_file(), WriteControlFile(), writeTimeLineHistory(), writeTimeLineHistoryFile(), XLogFileCopy(), XLogFileInit(), XLogPageRead(), and XLogWrite().

1382 {
1383  volatile PGPROC *proc = MyProc;
1384 
1385  if (!pgstat_track_activities || !proc)
1386  return;
1387 
1388  /*
1389  * Since this is a four-byte field which is always read and written as
1390  * four-bytes, updates are atomic.
1391  */
1392  proc->wait_event_info = 0;
1393 }
uint32 wait_event_info
Definition: proc.h:185
PGPROC * MyProc
Definition: proc.c:67
PGDLLIMPORT bool pgstat_track_activities
Definition: pgstat.c:124
Definition: proc.h:102

◆ pgstat_report_wait_start()

static void pgstat_report_wait_start ( uint32  wait_event_info)
inlinestatic

Definition at line 1357 of file pgstat.h.

References MyProc, pgstat_track_activities, and PGPROC::wait_event_info.

Referenced by AddToDataDirLockFile(), ApplyLogicalMappingFile(), assign_xlog_sync_method(), basebackup_read_file(), BootStrapXLOG(), CheckPointLogicalRewriteHeap(), copy_file(), CreateLockFile(), do_pg_stop_backup(), dsm_impl_mmap(), dsm_impl_op(), FilePrefetch(), FileRead(), FileSync(), FileTruncate(), FileWrite(), FileWriteback(), heap_xlog_logical_rewrite(), issue_xlog_fsync(), load_relmap_file(), LWLockReportWaitStart(), ProcArrayGroupClearXid(), ReadControlFile(), readTimeLineHistory(), ReadTwoPhaseFile(), RecheckDataDirLockFile(), recoveryPausesHere(), RecreateTwoPhaseFile(), ReorderBufferSerializeChange(), RestoreSlotFromDisk(), SaveSlotToPath(), SendTimeLineHistory(), SimpleLruFlush(), SlruPhysicalReadPage(), SlruPhysicalWritePage(), SnapBuildRestore(), SnapBuildSerialize(), TransactionGroupUpdateXidStatus(), update_controlfile(), vacuum_delay_point(), WaitEventSetWait(), WaitExceedsMaxStandbyDelay(), WALRead(), write_relmap_file(), WriteControlFile(), writeTimeLineHistory(), writeTimeLineHistoryFile(), XLogFileCopy(), XLogFileInit(), XLogPageRead(), and XLogWrite().

1358 {
1359  volatile PGPROC *proc = MyProc;
1360 
1361  if (!pgstat_track_activities || !proc)
1362  return;
1363 
1364  /*
1365  * Since this is a four-byte field which is always read and written as
1366  * four-bytes, updates are atomic.
1367  */
1368  proc->wait_event_info = wait_event_info;
1369 }
uint32 wait_event_info
Definition: proc.h:185
PGPROC * MyProc
Definition: proc.c:67
PGDLLIMPORT bool pgstat_track_activities
Definition: pgstat.c:124
Definition: proc.h:102

◆ pgstat_report_xact_timestamp()

void pgstat_report_xact_timestamp ( TimestampTz  ts