PostgreSQL Source Code  git master
pgstat.h File Reference
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_FunctionCounts
 
struct  PgStat_FunctionCallUsage
 
struct  PgStat_BackendSubEntry
 
struct  PgStat_TableCounts
 
struct  PgStat_TableStatus
 
struct  PgStat_TableXactStatus
 
struct  PgStat_ArchiverStats
 
struct  PgStat_BgWriterStats
 
struct  PgStat_CheckpointerStats
 
struct  PgStat_BktypeIO
 
struct  PgStat_IO
 
struct  PgStat_StatDBEntry
 
struct  PgStat_StatFuncEntry
 
struct  PgStat_StatReplSlotEntry
 
struct  PgStat_SLRUStats
 
struct  PgStat_StatSubEntry
 
struct  PgStat_StatTabEntry
 
struct  PgStat_WalStats
 
struct  PgStat_PendingWalStats
 

Macros

#define PGSTAT_STAT_PERMANENT_DIRECTORY   "pg_stat"
 
#define PGSTAT_STAT_PERMANENT_FILENAME   "pg_stat/pgstat.stat"
 
#define PGSTAT_STAT_PERMANENT_TMPFILE   "pg_stat/pgstat.tmp"
 
#define PG_STAT_TMP_DIR   "pg_stat_tmp"
 
#define PgStat_Kind   uint32
 
#define PGSTAT_KIND_MIN   1 /* Minimum ID allowed */
 
#define PGSTAT_KIND_MAX   256 /* Maximum ID allowed */
 
#define PGSTAT_KIND_INVALID   0
 
#define PGSTAT_KIND_DATABASE   1 /* database-wide statistics */
 
#define PGSTAT_KIND_RELATION   2 /* per-table statistics */
 
#define PGSTAT_KIND_FUNCTION   3 /* per-function statistics */
 
#define PGSTAT_KIND_REPLSLOT   4 /* per-slot statistics */
 
#define PGSTAT_KIND_SUBSCRIPTION   5 /* per-subscription statistics */
 
#define PGSTAT_KIND_ARCHIVER   6
 
#define PGSTAT_KIND_BGWRITER   7
 
#define PGSTAT_KIND_CHECKPOINTER   8
 
#define PGSTAT_KIND_IO   9
 
#define PGSTAT_KIND_SLRU   10
 
#define PGSTAT_KIND_WAL   11
 
#define PGSTAT_KIND_BUILTIN_MIN   PGSTAT_KIND_DATABASE
 
#define PGSTAT_KIND_BUILTIN_MAX   PGSTAT_KIND_WAL
 
#define PGSTAT_KIND_BUILTIN_SIZE   (PGSTAT_KIND_BUILTIN_MAX + 1)
 
#define PGSTAT_KIND_CUSTOM_MIN   128
 
#define PGSTAT_KIND_CUSTOM_MAX   PGSTAT_KIND_MAX
 
#define PGSTAT_KIND_CUSTOM_SIZE   (PGSTAT_KIND_CUSTOM_MAX - PGSTAT_KIND_CUSTOM_MIN + 1)
 
#define PGSTAT_KIND_EXPERIMENTAL   128
 
#define PGSTAT_FILE_FORMAT_ID   0x01A5BCAF
 
#define IOOBJECT_NUM_TYPES   (IOOBJECT_TEMP_RELATION + 1)
 
#define IOCONTEXT_NUM_TYPES   (IOCONTEXT_VACUUM + 1)
 
#define IOOP_NUM_TYPES   (IOOP_WRITEBACK + 1)
 
#define pgstat_count_buffer_read_time(n)    (pgStatBlockReadTime += (n))
 
#define pgstat_count_buffer_write_time(n)    (pgStatBlockWriteTime += (n))
 
#define pgstat_count_conn_active_time(n)    (pgStatActiveTime += (n))
 
#define pgstat_count_conn_txn_idle_time(n)    (pgStatTransactionIdleTime += (n))
 
#define pgstat_should_count_relation(rel)
 
#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)
 

Typedefs

typedef enum TrackFunctionsLevel TrackFunctionsLevel
 
typedef enum PgStat_FetchConsistency PgStat_FetchConsistency
 
typedef enum SessionEndType SessionEndType
 
typedef int64 PgStat_Counter
 
typedef struct PgStat_FunctionCounts PgStat_FunctionCounts
 
typedef struct PgStat_FunctionCallUsage PgStat_FunctionCallUsage
 
typedef struct PgStat_BackendSubEntry PgStat_BackendSubEntry
 
typedef struct PgStat_TableCounts PgStat_TableCounts
 
typedef struct PgStat_TableStatus PgStat_TableStatus
 
typedef struct PgStat_TableXactStatus PgStat_TableXactStatus
 
typedef struct PgStat_ArchiverStats PgStat_ArchiverStats
 
typedef struct PgStat_BgWriterStats PgStat_BgWriterStats
 
typedef struct PgStat_CheckpointerStats PgStat_CheckpointerStats
 
typedef enum IOObject IOObject
 
typedef enum IOContext IOContext
 
typedef enum IOOp IOOp
 
typedef struct PgStat_BktypeIO PgStat_BktypeIO
 
typedef struct PgStat_IO PgStat_IO
 
typedef struct PgStat_StatDBEntry PgStat_StatDBEntry
 
typedef struct PgStat_StatFuncEntry PgStat_StatFuncEntry
 
typedef struct PgStat_StatReplSlotEntry PgStat_StatReplSlotEntry
 
typedef struct PgStat_SLRUStats PgStat_SLRUStats
 
typedef struct PgStat_StatSubEntry PgStat_StatSubEntry
 
typedef struct PgStat_StatTabEntry PgStat_StatTabEntry
 
typedef struct PgStat_WalStats PgStat_WalStats
 
typedef struct PgStat_PendingWalStats PgStat_PendingWalStats
 

Enumerations

enum  TrackFunctionsLevel { TRACK_FUNC_OFF , TRACK_FUNC_PL , TRACK_FUNC_ALL }
 
enum  PgStat_FetchConsistency { PGSTAT_FETCH_CONSISTENCY_NONE , PGSTAT_FETCH_CONSISTENCY_CACHE , PGSTAT_FETCH_CONSISTENCY_SNAPSHOT }
 
enum  SessionEndType {
  DISCONNECT_NOT_YET , DISCONNECT_NORMAL , DISCONNECT_CLIENT_EOF , DISCONNECT_FATAL ,
  DISCONNECT_KILLED
}
 
enum  IOObject { IOOBJECT_RELATION , IOOBJECT_TEMP_RELATION }
 
enum  IOContext { IOCONTEXT_BULKREAD , IOCONTEXT_BULKWRITE , IOCONTEXT_NORMAL , IOCONTEXT_VACUUM }
 
enum  IOOp {
  IOOP_EVICT , IOOP_EXTEND , IOOP_FSYNC , IOOP_HIT ,
  IOOP_READ , IOOP_REUSE , IOOP_WRITE , IOOP_WRITEBACK
}
 

Functions

static bool pgstat_is_kind_builtin (PgStat_Kind kind)
 
static bool pgstat_is_kind_custom (PgStat_Kind kind)
 
Size StatsShmemSize (void)
 
void StatsShmemInit (void)
 
void pgstat_restore_stats (XLogRecPtr redo)
 
void pgstat_discard_stats (void)
 
void pgstat_before_server_shutdown (int code, Datum arg)
 
void pgstat_initialize (void)
 
long pgstat_report_stat (bool force)
 
void pgstat_force_next_flush (void)
 
void pgstat_reset_counters (void)
 
void pgstat_reset (PgStat_Kind kind, Oid dboid, uint64 objid)
 
void pgstat_reset_of_kind (PgStat_Kind kind)
 
void pgstat_clear_snapshot (void)
 
TimestampTz pgstat_get_stat_snapshot_timestamp (bool *have_snapshot)
 
PgStat_Kind pgstat_get_kind_from_str (char *kind_str)
 
bool pgstat_have_entry (PgStat_Kind kind, Oid dboid, uint64 objid)
 
void pgstat_report_archiver (const char *xlog, bool failed)
 
PgStat_ArchiverStatspgstat_fetch_stat_archiver (void)
 
void pgstat_report_bgwriter (void)
 
PgStat_BgWriterStatspgstat_fetch_stat_bgwriter (void)
 
void pgstat_report_checkpointer (void)
 
PgStat_CheckpointerStatspgstat_fetch_stat_checkpointer (void)
 
bool pgstat_bktype_io_stats_valid (PgStat_BktypeIO *backend_io, BackendType bktype)
 
void pgstat_count_io_op (IOObject io_object, IOContext io_context, IOOp io_op)
 
void pgstat_count_io_op_n (IOObject io_object, IOContext io_context, IOOp io_op, uint32 cnt)
 
instr_time pgstat_prepare_io_time (bool track_io_guc)
 
void pgstat_count_io_op_time (IOObject io_object, IOContext io_context, IOOp io_op, instr_time start_time, uint32 cnt)
 
PgStat_IOpgstat_fetch_stat_io (void)
 
const char * pgstat_get_io_context_name (IOContext io_context)
 
const char * pgstat_get_io_object_name (IOObject io_object)
 
bool pgstat_tracks_io_bktype (BackendType bktype)
 
bool pgstat_tracks_io_object (BackendType bktype, IOObject io_object, IOContext io_context)
 
bool pgstat_tracks_io_op (BackendType bktype, IOObject io_object, IOContext io_context, IOOp io_op)
 
void pgstat_drop_database (Oid databaseid)
 
void pgstat_report_autovac (Oid dboid)
 
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_report_connect (Oid dboid)
 
PgStat_StatDBEntrypgstat_fetch_stat_dbentry (Oid dboid)
 
void pgstat_create_function (Oid proid)
 
void pgstat_drop_function (Oid proid)
 
void pgstat_init_function_usage (struct FunctionCallInfoBaseData *fcinfo, PgStat_FunctionCallUsage *fcu)
 
void pgstat_end_function_usage (PgStat_FunctionCallUsage *fcu, bool finalize)
 
PgStat_StatFuncEntrypgstat_fetch_stat_funcentry (Oid func_id)
 
PgStat_FunctionCountsfind_funcstat_entry (Oid func_id)
 
void pgstat_create_relation (Relation rel)
 
void pgstat_drop_relation (Relation rel)
 
void pgstat_copy_relation_stats (Relation dst, Relation src)
 
void pgstat_init_relation (Relation rel)
 
void pgstat_assoc_relation (Relation rel)
 
void pgstat_unlink_relation (Relation rel)
 
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_count_heap_insert (Relation rel, PgStat_Counter n)
 
void pgstat_count_heap_update (Relation rel, bool hot, bool newpage)
 
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_twophase_postcommit (TransactionId xid, uint16 info, void *recdata, uint32 len)
 
void pgstat_twophase_postabort (TransactionId xid, uint16 info, void *recdata, uint32 len)
 
PgStat_StatTabEntrypgstat_fetch_stat_tabentry (Oid relid)
 
PgStat_StatTabEntrypgstat_fetch_stat_tabentry_ext (bool shared, Oid reloid)
 
PgStat_TableStatusfind_tabstat_entry (Oid rel_id)
 
void pgstat_reset_replslot (const char *name)
 
void pgstat_report_replslot (struct ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat)
 
void pgstat_create_replslot (struct ReplicationSlot *slot)
 
void pgstat_acquire_replslot (struct ReplicationSlot *slot)
 
void pgstat_drop_replslot (struct ReplicationSlot *slot)
 
PgStat_StatReplSlotEntrypgstat_fetch_replslot (NameData slotname)
 
void pgstat_reset_slru (const char *)
 
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_get_slru_name (int slru_idx)
 
int pgstat_get_slru_index (const char *name)
 
PgStat_SLRUStatspgstat_fetch_slru (void)
 
void pgstat_report_subscription_error (Oid subid, bool is_apply_error)
 
void pgstat_report_subscription_conflict (Oid subid, ConflictType type)
 
void pgstat_create_subscription (Oid subid)
 
void pgstat_drop_subscription (Oid subid)
 
PgStat_StatSubEntrypgstat_fetch_stat_subscription (Oid subid)
 
void AtEOXact_PgStat (bool isCommit, bool parallel)
 
void AtEOSubXact_PgStat (bool isCommit, int nestDepth)
 
void AtPrepare_PgStat (void)
 
void PostPrepare_PgStat (void)
 
int pgstat_get_transactional_drops (bool isCommit, struct xl_xact_stats_item **items)
 
void pgstat_execute_transactional_drops (int ndrops, struct xl_xact_stats_item *items, bool is_redo)
 
void pgstat_report_wal (bool force)
 
PgStat_WalStatspgstat_fetch_stat_wal (void)
 

Variables

PGDLLIMPORT bool pgstat_track_counts
 
PGDLLIMPORT int pgstat_track_functions
 
PGDLLIMPORT int pgstat_fetch_consistency
 
PGDLLIMPORT PgStat_BgWriterStats PendingBgWriterStats
 
PGDLLIMPORT PgStat_CheckpointerStats PendingCheckpointerStats
 
PGDLLIMPORT PgStat_Counter pgStatBlockReadTime
 
PGDLLIMPORT PgStat_Counter pgStatBlockWriteTime
 
PGDLLIMPORT PgStat_Counter pgStatActiveTime
 
PGDLLIMPORT PgStat_Counter pgStatTransactionIdleTime
 
PGDLLIMPORT SessionEndType pgStatSessionEndCause
 
PGDLLIMPORT PgStat_PendingWalStats PendingWalStats
 

Macro Definition Documentation

◆ IOCONTEXT_NUM_TYPES

#define IOCONTEXT_NUM_TYPES   (IOCONTEXT_VACUUM + 1)

Definition at line 328 of file pgstat.h.

◆ IOOBJECT_NUM_TYPES

#define IOOBJECT_NUM_TYPES   (IOOBJECT_TEMP_RELATION + 1)

Definition at line 318 of file pgstat.h.

◆ IOOP_NUM_TYPES

#define IOOP_NUM_TYPES   (IOOP_WRITEBACK + 1)

Definition at line 342 of file pgstat.h.

◆ PG_STAT_TMP_DIR

#define PG_STAT_TMP_DIR   "pg_stat_tmp"

Definition at line 34 of file pgstat.h.

◆ pgstat_count_buffer_hit

#define pgstat_count_buffer_hit (   rel)
Value:
do { \
(rel)->pgstat_info->counts.blocks_hit++; \
} while (0)
#define pgstat_should_count_relation(rel)
Definition: pgstat.h:639

Definition at line 675 of file pgstat.h.

◆ pgstat_count_buffer_read

#define pgstat_count_buffer_read (   rel)
Value:
do { \
(rel)->pgstat_info->counts.blocks_fetched++; \
} while (0)

Definition at line 670 of file pgstat.h.

◆ pgstat_count_buffer_read_time

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

Definition at line 587 of file pgstat.h.

◆ pgstat_count_buffer_write_time

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

Definition at line 589 of file pgstat.h.

◆ pgstat_count_conn_active_time

#define pgstat_count_conn_active_time (   n)     (pgStatActiveTime += (n))

Definition at line 591 of file pgstat.h.

◆ pgstat_count_conn_txn_idle_time

#define pgstat_count_conn_txn_idle_time (   n)     (pgStatTransactionIdleTime += (n))

Definition at line 593 of file pgstat.h.

◆ pgstat_count_heap_fetch

#define pgstat_count_heap_fetch (   rel)
Value:
do { \
(rel)->pgstat_info->counts.tuples_fetched++; \
} while (0)

Definition at line 655 of file pgstat.h.

◆ pgstat_count_heap_getnext

#define pgstat_count_heap_getnext (   rel)
Value:
do { \
(rel)->pgstat_info->counts.tuples_returned++; \
} while (0)

Definition at line 650 of file pgstat.h.

◆ pgstat_count_heap_scan

#define pgstat_count_heap_scan (   rel)
Value:
do { \
(rel)->pgstat_info->counts.numscans++; \
} while (0)

Definition at line 645 of file pgstat.h.

◆ pgstat_count_index_scan

#define pgstat_count_index_scan (   rel)
Value:
do { \
(rel)->pgstat_info->counts.numscans++; \
} while (0)

Definition at line 660 of file pgstat.h.

◆ pgstat_count_index_tuples

#define pgstat_count_index_tuples (   rel,
 
)
Value:
do { \
(rel)->pgstat_info->counts.tuples_returned += (n); \
} while (0)

Definition at line 665 of file pgstat.h.

◆ PGSTAT_FILE_FORMAT_ID

#define PGSTAT_FILE_FORMAT_ID   0x01A5BCAF

Definition at line 270 of file pgstat.h.

◆ PgStat_Kind

#define PgStat_Kind   uint32

Definition at line 37 of file pgstat.h.

◆ PGSTAT_KIND_ARCHIVER

#define PGSTAT_KIND_ARCHIVER   6

Definition at line 54 of file pgstat.h.

◆ PGSTAT_KIND_BGWRITER

#define PGSTAT_KIND_BGWRITER   7

Definition at line 55 of file pgstat.h.

◆ PGSTAT_KIND_BUILTIN_MAX

#define PGSTAT_KIND_BUILTIN_MAX   PGSTAT_KIND_WAL

Definition at line 62 of file pgstat.h.

◆ PGSTAT_KIND_BUILTIN_MIN

#define PGSTAT_KIND_BUILTIN_MIN   PGSTAT_KIND_DATABASE

Definition at line 61 of file pgstat.h.

◆ PGSTAT_KIND_BUILTIN_SIZE

#define PGSTAT_KIND_BUILTIN_SIZE   (PGSTAT_KIND_BUILTIN_MAX + 1)

Definition at line 63 of file pgstat.h.

◆ PGSTAT_KIND_CHECKPOINTER

#define PGSTAT_KIND_CHECKPOINTER   8

Definition at line 56 of file pgstat.h.

◆ PGSTAT_KIND_CUSTOM_MAX

#define PGSTAT_KIND_CUSTOM_MAX   PGSTAT_KIND_MAX

Definition at line 69 of file pgstat.h.

◆ PGSTAT_KIND_CUSTOM_MIN

#define PGSTAT_KIND_CUSTOM_MIN   128

Definition at line 68 of file pgstat.h.

◆ PGSTAT_KIND_CUSTOM_SIZE

#define PGSTAT_KIND_CUSTOM_SIZE   (PGSTAT_KIND_CUSTOM_MAX - PGSTAT_KIND_CUSTOM_MIN + 1)

Definition at line 70 of file pgstat.h.

◆ PGSTAT_KIND_DATABASE

#define PGSTAT_KIND_DATABASE   1 /* database-wide statistics */

Definition at line 47 of file pgstat.h.

◆ PGSTAT_KIND_EXPERIMENTAL

#define PGSTAT_KIND_EXPERIMENTAL   128

Definition at line 77 of file pgstat.h.

◆ PGSTAT_KIND_FUNCTION

#define PGSTAT_KIND_FUNCTION   3 /* per-function statistics */

Definition at line 49 of file pgstat.h.

◆ PGSTAT_KIND_INVALID

#define PGSTAT_KIND_INVALID   0

Definition at line 44 of file pgstat.h.

◆ PGSTAT_KIND_IO

#define PGSTAT_KIND_IO   9

Definition at line 57 of file pgstat.h.

◆ PGSTAT_KIND_MAX

#define PGSTAT_KIND_MAX   256 /* Maximum ID allowed */

Definition at line 41 of file pgstat.h.

◆ PGSTAT_KIND_MIN

#define PGSTAT_KIND_MIN   1 /* Minimum ID allowed */

Definition at line 40 of file pgstat.h.

◆ PGSTAT_KIND_RELATION

#define PGSTAT_KIND_RELATION   2 /* per-table statistics */

Definition at line 48 of file pgstat.h.

◆ PGSTAT_KIND_REPLSLOT

#define PGSTAT_KIND_REPLSLOT   4 /* per-slot statistics */

Definition at line 50 of file pgstat.h.

◆ PGSTAT_KIND_SLRU

#define PGSTAT_KIND_SLRU   10

Definition at line 58 of file pgstat.h.

◆ PGSTAT_KIND_SUBSCRIPTION

#define PGSTAT_KIND_SUBSCRIPTION   5 /* per-subscription statistics */

Definition at line 51 of file pgstat.h.

◆ PGSTAT_KIND_WAL

#define PGSTAT_KIND_WAL   11

Definition at line 59 of file pgstat.h.

◆ pgstat_should_count_relation

#define pgstat_should_count_relation (   rel)
Value:
(likely((rel)->pgstat_info != NULL) ? true : \
((rel)->pgstat_enabled ? pgstat_assoc_relation(rel), true : false))
#define likely(x)
Definition: c.h:313
return true
Definition: isn.c:126
void pgstat_assoc_relation(Relation rel)

Definition at line 639 of file pgstat.h.

◆ PGSTAT_STAT_PERMANENT_DIRECTORY

#define PGSTAT_STAT_PERMANENT_DIRECTORY   "pg_stat"

Definition at line 29 of file pgstat.h.

◆ PGSTAT_STAT_PERMANENT_FILENAME

#define PGSTAT_STAT_PERMANENT_FILENAME   "pg_stat/pgstat.stat"

Definition at line 30 of file pgstat.h.

◆ PGSTAT_STAT_PERMANENT_TMPFILE

#define PGSTAT_STAT_PERMANENT_TMPFILE   "pg_stat/pgstat.tmp"

Definition at line 31 of file pgstat.h.

Typedef Documentation

◆ IOContext

typedef enum IOContext IOContext

◆ IOObject

typedef enum IOObject IOObject

◆ IOOp

typedef enum IOOp IOOp

◆ PgStat_ArchiverStats

◆ PgStat_BackendSubEntry

◆ PgStat_BgWriterStats

◆ PgStat_BktypeIO

◆ PgStat_CheckpointerStats

◆ PgStat_Counter

typedef int64 PgStat_Counter

Definition at line 120 of file pgstat.h.

◆ PgStat_FetchConsistency

◆ PgStat_FunctionCallUsage

◆ PgStat_FunctionCounts

◆ PgStat_IO

typedef struct PgStat_IO PgStat_IO

◆ PgStat_PendingWalStats

◆ PgStat_SLRUStats

◆ PgStat_StatDBEntry

◆ PgStat_StatFuncEntry

◆ PgStat_StatReplSlotEntry

◆ PgStat_StatSubEntry

◆ PgStat_StatTabEntry

◆ PgStat_TableCounts

◆ PgStat_TableStatus

◆ PgStat_TableXactStatus

◆ PgStat_WalStats

◆ SessionEndType

◆ TrackFunctionsLevel

Enumeration Type Documentation

◆ IOContext

enum IOContext
Enumerator
IOCONTEXT_BULKREAD 
IOCONTEXT_BULKWRITE 
IOCONTEXT_NORMAL 
IOCONTEXT_VACUUM 

Definition at line 320 of file pgstat.h.

321 {
326 } IOContext;
IOContext
Definition: pgstat.h:321
@ IOCONTEXT_NORMAL
Definition: pgstat.h:324
@ IOCONTEXT_VACUUM
Definition: pgstat.h:325
@ IOCONTEXT_BULKREAD
Definition: pgstat.h:322
@ IOCONTEXT_BULKWRITE
Definition: pgstat.h:323

◆ IOObject

enum IOObject
Enumerator
IOOBJECT_RELATION 
IOOBJECT_TEMP_RELATION 

Definition at line 312 of file pgstat.h.

313 {
316 } IOObject;
IOObject
Definition: pgstat.h:313
@ IOOBJECT_RELATION
Definition: pgstat.h:314
@ IOOBJECT_TEMP_RELATION
Definition: pgstat.h:315

◆ IOOp

enum IOOp
Enumerator
IOOP_EVICT 
IOOP_EXTEND 
IOOP_FSYNC 
IOOP_HIT 
IOOP_READ 
IOOP_REUSE 
IOOP_WRITE 
IOOP_WRITEBACK 

Definition at line 330 of file pgstat.h.

331 {
332  IOOP_EVICT,
333  IOOP_EXTEND,
334  IOOP_FSYNC,
335  IOOP_HIT,
336  IOOP_READ,
337  IOOP_REUSE,
338  IOOP_WRITE,
340 } IOOp;
IOOp
Definition: pgstat.h:331
@ IOOP_EXTEND
Definition: pgstat.h:333
@ IOOP_FSYNC
Definition: pgstat.h:334
@ IOOP_READ
Definition: pgstat.h:336
@ IOOP_WRITEBACK
Definition: pgstat.h:339
@ IOOP_HIT
Definition: pgstat.h:335
@ IOOP_EVICT
Definition: pgstat.h:332
@ IOOP_REUSE
Definition: pgstat.h:337
@ IOOP_WRITE
Definition: pgstat.h:338

◆ PgStat_FetchConsistency

Enumerator
PGSTAT_FETCH_CONSISTENCY_NONE 
PGSTAT_FETCH_CONSISTENCY_CACHE 
PGSTAT_FETCH_CONSISTENCY_SNAPSHOT 

Definition at line 99 of file pgstat.h.

100 {
PgStat_FetchConsistency
Definition: pgstat.h:100
@ PGSTAT_FETCH_CONSISTENCY_NONE
Definition: pgstat.h:101
@ PGSTAT_FETCH_CONSISTENCY_CACHE
Definition: pgstat.h:102
@ PGSTAT_FETCH_CONSISTENCY_SNAPSHOT
Definition: pgstat.h:103

◆ SessionEndType

Enumerator
DISCONNECT_NOT_YET 
DISCONNECT_NORMAL 
DISCONNECT_CLIENT_EOF 
DISCONNECT_FATAL 
DISCONNECT_KILLED 

Definition at line 107 of file pgstat.h.

108 {
109  DISCONNECT_NOT_YET, /* still active */
SessionEndType
Definition: pgstat.h:108
@ DISCONNECT_NOT_YET
Definition: pgstat.h:109
@ DISCONNECT_FATAL
Definition: pgstat.h:112
@ DISCONNECT_KILLED
Definition: pgstat.h:113
@ DISCONNECT_CLIENT_EOF
Definition: pgstat.h:111
@ DISCONNECT_NORMAL
Definition: pgstat.h:110

◆ TrackFunctionsLevel

Enumerator
TRACK_FUNC_OFF 
TRACK_FUNC_PL 
TRACK_FUNC_ALL 

Definition at line 92 of file pgstat.h.

93 {
TrackFunctionsLevel
Definition: pgstat.h:93
@ TRACK_FUNC_PL
Definition: pgstat.h:95
@ TRACK_FUNC_ALL
Definition: pgstat.h:96
@ TRACK_FUNC_OFF
Definition: pgstat.h:94

Function Documentation

◆ AtEOSubXact_PgStat()

void AtEOSubXact_PgStat ( bool  isCommit,
int  nestDepth 
)

Definition at line 113 of file pgstat_xact.c.

114 {
115  PgStat_SubXactStatus *xact_state;
116 
117  /* merge the sub-transaction's transactional stats into the parent */
118  xact_state = pgStatXactStack;
119  if (xact_state != NULL &&
120  xact_state->nest_level >= nestDepth)
121  {
122  /* delink xact_state from stack immediately to simplify reuse case */
123  pgStatXactStack = xact_state->prev;
124 
125  AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth);
126  AtEOSubXact_PgStat_DroppedStats(xact_state, isCommit, nestDepth);
127 
128  pfree(xact_state);
129  }
130 }
void pfree(void *pointer)
Definition: mcxt.c:1521
void AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, int nestDepth)
static PgStat_SubXactStatus * pgStatXactStack
Definition: pgstat_xact.c:33
static void AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit, int nestDepth)
Definition: pgstat_xact.c:136
struct PgStat_SubXactStatus * prev

References AtEOSubXact_PgStat_DroppedStats(), AtEOSubXact_PgStat_Relations(), PgStat_SubXactStatus::nest_level, pfree(), pgStatXactStack, and PgStat_SubXactStatus::prev.

Referenced by AbortSubTransaction(), and CommitSubTransaction().

◆ AtEOXact_PgStat()

void AtEOXact_PgStat ( bool  isCommit,
bool  parallel 
)

Definition at line 40 of file pgstat_xact.c.

41 {
42  PgStat_SubXactStatus *xact_state;
43 
44  AtEOXact_PgStat_Database(isCommit, parallel);
45 
46  /* handle transactional stats information */
47  xact_state = pgStatXactStack;
48  if (xact_state != NULL)
49  {
50  Assert(xact_state->nest_level == 1);
51  Assert(xact_state->prev == NULL);
52 
53  AtEOXact_PgStat_Relations(xact_state, isCommit);
54  AtEOXact_PgStat_DroppedStats(xact_state, isCommit);
55  }
56  pgStatXactStack = NULL;
57 
58  /* Make sure any stats snapshot is thrown away */
60 }
#define Assert(condition)
Definition: c.h:861
void pgstat_clear_snapshot(void)
Definition: pgstat.c:896
void AtEOXact_PgStat_Database(bool isCommit, bool parallel)
void AtEOXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit)
static void AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit)
Definition: pgstat_xact.c:67

References Assert, AtEOXact_PgStat_Database(), AtEOXact_PgStat_DroppedStats(), AtEOXact_PgStat_Relations(), PgStat_SubXactStatus::nest_level, pgstat_clear_snapshot(), pgStatXactStack, and PgStat_SubXactStatus::prev.

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

◆ AtPrepare_PgStat()

void AtPrepare_PgStat ( void  )

Definition at line 191 of file pgstat_xact.c.

192 {
193  PgStat_SubXactStatus *xact_state;
194 
195  xact_state = pgStatXactStack;
196  if (xact_state != NULL)
197  {
198  Assert(xact_state->nest_level == 1);
199  Assert(xact_state->prev == NULL);
200 
201  AtPrepare_PgStat_Relations(xact_state);
202  }
203 }
void AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state)

References Assert, AtPrepare_PgStat_Relations(), PgStat_SubXactStatus::nest_level, pgStatXactStack, and PgStat_SubXactStatus::prev.

Referenced by PrepareTransaction().

◆ find_funcstat_entry()

PgStat_FunctionCounts* find_funcstat_entry ( Oid  func_id)

Definition at line 223 of file pgstat_function.c.

224 {
225  PgStat_EntryRef *entry_ref;
226 
228 
229  if (entry_ref)
230  return entry_ref->pending;
231  return NULL;
232 }
Oid MyDatabaseId
Definition: globals.c:93
PgStat_EntryRef * pgstat_fetch_pending_entry(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat.c:1297
#define PGSTAT_KIND_FUNCTION
Definition: pgstat.h:49

References MyDatabaseId, PgStat_EntryRef::pending, pgstat_fetch_pending_entry(), and PGSTAT_KIND_FUNCTION.

Referenced by pg_stat_get_xact_function_calls().

◆ find_tabstat_entry()

PgStat_TableStatus* find_tabstat_entry ( Oid  rel_id)

Definition at line 487 of file pgstat_relation.c.

488 {
489  PgStat_EntryRef *entry_ref;
491  PgStat_TableStatus *tabentry = NULL;
492  PgStat_TableStatus *tablestatus = NULL;
493 
495  if (!entry_ref)
496  {
498  if (!entry_ref)
499  return tablestatus;
500  }
501 
502  tabentry = (PgStat_TableStatus *) entry_ref->pending;
503  tablestatus = palloc(sizeof(PgStat_TableStatus));
504  *tablestatus = *tabentry;
505 
506  /*
507  * Reset tablestatus->trans in the copy of PgStat_TableStatus as it may
508  * point to a shared memory area. Its data is saved below, so removing it
509  * does not matter.
510  */
511  tablestatus->trans = NULL;
512 
513  /*
514  * Live subtransaction counts are not included yet. This is not a hot
515  * code path so reconcile tuples_inserted, tuples_updated and
516  * tuples_deleted even if the caller may not be interested in this data.
517  */
518  for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
519  {
520  tablestatus->counts.tuples_inserted += trans->tuples_inserted;
521  tablestatus->counts.tuples_updated += trans->tuples_updated;
522  tablestatus->counts.tuples_deleted += trans->tuples_deleted;
523  }
524 
525  return tablestatus;
526 }
void * palloc(Size size)
Definition: mcxt.c:1317
#define PGSTAT_KIND_RELATION
Definition: pgstat.h:48
#define InvalidOid
Definition: postgres_ext.h:36
PgStat_Counter tuples_inserted
Definition: pgstat.h:199
PgStat_Counter tuples_updated
Definition: pgstat.h:200
PgStat_Counter tuples_deleted
Definition: pgstat.h:201
PgStat_TableCounts counts
Definition: pgstat.h:234
struct PgStat_TableXactStatus * trans
Definition: pgstat.h:233
static zic_t trans[TZ_MAX_LEAPS]
Definition: zic.c:402

References PgStat_TableStatus::counts, InvalidOid, MyDatabaseId, palloc(), PgStat_EntryRef::pending, pgstat_fetch_pending_entry(), PGSTAT_KIND_RELATION, PgStat_TableStatus::trans, trans, PgStat_TableCounts::tuples_deleted, PgStat_TableCounts::tuples_inserted, and PgStat_TableCounts::tuples_updated.

◆ pgstat_acquire_replslot()

void pgstat_acquire_replslot ( struct ReplicationSlot slot)

Definition at line 146 of file pgstat_replslot.c.

147 {
149  ReplicationSlotIndex(slot), true, NULL);
150 }
#define PGSTAT_KIND_REPLSLOT
Definition: pgstat.h:50
PgStat_EntryRef * pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, uint64 objid, bool create, bool *created_entry)
Definition: pgstat_shmem.c:432
int ReplicationSlotIndex(ReplicationSlot *slot)
Definition: slot.c:497

References InvalidOid, pgstat_get_entry_ref(), PGSTAT_KIND_REPLSLOT, and ReplicationSlotIndex().

Referenced by ReplicationSlotAcquire().

◆ pgstat_assoc_relation()

void pgstat_assoc_relation ( Relation  rel)

Definition at line 132 of file pgstat_relation.c.

133 {
134  Assert(rel->pgstat_enabled);
135  Assert(rel->pgstat_info == NULL);
136 
137  /* Else find or make the PgStat_TableStatus entry, and update link */
139  rel->rd_rel->relisshared);
140 
141  /* don't allow link a stats to multiple relcache entries */
142  Assert(rel->pgstat_info->relation == NULL);
143 
144  /* mark this relation as the owner */
145  rel->pgstat_info->relation = rel;
146 }
static PgStat_TableStatus * pgstat_prep_relation_pending(Oid rel_id, bool isshared)
#define RelationGetRelid(relation)
Definition: rel.h:505
Relation relation
Definition: pgstat.h:235
bool pgstat_enabled
Definition: rel.h:253
Form_pg_class rd_rel
Definition: rel.h:111
struct PgStat_TableStatus * pgstat_info
Definition: rel.h:255

References Assert, RelationData::pgstat_enabled, RelationData::pgstat_info, pgstat_prep_relation_pending(), RelationData::rd_rel, PgStat_TableStatus::relation, and RelationGetRelid.

◆ pgstat_before_server_shutdown()

void pgstat_before_server_shutdown ( int  code,
Datum  arg 
)

Definition at line 532 of file pgstat.c.

534 {
535  Assert(pgStatLocal.shmem != NULL);
537 
538  /*
539  * Stats should only be reported after pgstat_initialize() and before
540  * pgstat_shutdown(). This is a convenient point to catch most violations
541  * of this rule.
542  */
543  Assert(pgstat_is_initialized && !pgstat_is_shutdown);
544 
545  /* flush out our own pending changes before writing out */
546  pgstat_report_stat(true);
547 
548  /*
549  * Only write out file during normal shutdown. Don't even signal that
550  * we've shutdown during irregular shutdowns, because the shutdown
551  * sequence isn't coordinated to ensure this backend shuts down last.
552  */
553  if (code == 0)
554  {
555  pgStatLocal.shmem->is_shutdown = true;
557  }
long pgstat_report_stat(bool force)
Definition: pgstat.c:660
static void pgstat_write_statsfile(XLogRecPtr redo)
Definition: pgstat.c:1563
PgStat_LocalState pgStatLocal
Definition: pgstat.c:212
PgStat_ShmemControl * shmem
XLogRecPtr GetRedoRecPtr(void)
Definition: xlog.c:6436

References Assert, GetRedoRecPtr(), PgStat_ShmemControl::is_shutdown, pgstat_report_stat(), pgstat_write_statsfile(), pgStatLocal, and PgStat_LocalState::shmem.

Referenced by CheckpointerMain(), and InitPostgres().

◆ pgstat_bktype_io_stats_valid()

bool pgstat_bktype_io_stats_valid ( PgStat_BktypeIO backend_io,
BackendType  bktype 
)

Definition at line 46 of file pgstat_io.c.

48 {
49  for (int io_object = 0; io_object < IOOBJECT_NUM_TYPES; io_object++)
50  {
51  for (int io_context = 0; io_context < IOCONTEXT_NUM_TYPES; io_context++)
52  {
53  for (int io_op = 0; io_op < IOOP_NUM_TYPES; io_op++)
54  {
55  /* we do track it */
56  if (pgstat_tracks_io_op(bktype, io_object, io_context, io_op))
57  {
58  /* ensure that if IO times are non-zero, counts are > 0 */
59  if (backend_io->times[io_object][io_context][io_op] != 0 &&
60  backend_io->counts[io_object][io_context][io_op] <= 0)
61  return false;
62 
63  continue;
64  }
65 
66  /* we don't track it, and it is not 0 */
67  if (backend_io->counts[io_object][io_context][io_op] != 0)
68  return false;
69  }
70  }
71  }
72 
73  return true;
74 }
#define IOOP_NUM_TYPES
Definition: pgstat.h:342
#define IOCONTEXT_NUM_TYPES
Definition: pgstat.h:328
#define IOOBJECT_NUM_TYPES
Definition: pgstat.h:318
bool pgstat_tracks_io_op(BackendType bktype, IOObject io_object, IOContext io_context, IOOp io_op)
Definition: pgstat_io.c:451
PgStat_Counter times[IOOBJECT_NUM_TYPES][IOCONTEXT_NUM_TYPES][IOOP_NUM_TYPES]
Definition: pgstat.h:347
PgStat_Counter counts[IOOBJECT_NUM_TYPES][IOCONTEXT_NUM_TYPES][IOOP_NUM_TYPES]
Definition: pgstat.h:346

References PgStat_BktypeIO::counts, IOCONTEXT_NUM_TYPES, IOOBJECT_NUM_TYPES, IOOP_NUM_TYPES, pgstat_tracks_io_op(), and PgStat_BktypeIO::times.

Referenced by pg_stat_get_io(), and pgstat_io_flush_cb().

◆ pgstat_clear_snapshot()

void pgstat_clear_snapshot ( void  )

Definition at line 896 of file pgstat.c.

898 {
900 
901  memset(&pgStatLocal.snapshot.fixed_valid, 0,
903  memset(&pgStatLocal.snapshot.custom_valid, 0,
905  pgStatLocal.snapshot.stats = NULL;
907 
908  /* Release memory, if any was allocated */
910  {
912 
913  /* Reset variables */
915  }
916 
917  /*
918  * Historically the backend_status.c facilities lived in this file, and
919  * were reset with the same function. For now keep it that way, and
920  * forward the reset request.
921  */
923 
924  /* Reset this flag, as it may be possible that a cleanup was forced. */
void pgstat_clear_backend_activity_snapshot(void)
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:454
static bool force_stats_snapshot_clear
Definition: pgstat.c:250
#define pgstat_assert_is_up()
PgStat_Snapshot snapshot
MemoryContext context
bool custom_valid[PGSTAT_KIND_CUSTOM_SIZE]
PgStat_FetchConsistency mode
struct pgstat_snapshot_hash * stats
bool fixed_valid[PGSTAT_KIND_BUILTIN_SIZE]

References PgStat_Snapshot::context, PgStat_Snapshot::custom_valid, PgStat_Snapshot::fixed_valid, force_stats_snapshot_clear, MemoryContextDelete(), PgStat_Snapshot::mode, pgstat_assert_is_up, pgstat_clear_backend_activity_snapshot(), PGSTAT_FETCH_CONSISTENCY_NONE, pgStatLocal, PgStat_LocalState::snapshot, and PgStat_Snapshot::stats.

Referenced by AtEOXact_PgStat(), pg_stat_clear_snapshot(), pgstat_get_stat_snapshot_timestamp(), pgstat_prep_snapshot(), pgstat_snapshot_fixed(), and PostPrepare_PgStat().

◆ pgstat_copy_relation_stats()

void pgstat_copy_relation_stats ( Relation  dst,
Relation  src 
)

Definition at line 58 of file pgstat_relation.c.

59 {
60  PgStat_StatTabEntry *srcstats;
61  PgStatShared_Relation *dstshstats;
62  PgStat_EntryRef *dst_ref;
63 
64  srcstats = pgstat_fetch_stat_tabentry_ext(src->rd_rel->relisshared,
65  RelationGetRelid(src));
66  if (!srcstats)
67  return;
68 
70  dst->rd_rel->relisshared ? InvalidOid : MyDatabaseId,
71  RelationGetRelid(dst),
72  false);
73 
74  dstshstats = (PgStatShared_Relation *) dst_ref->shared_stats;
75  dstshstats->stats = *srcstats;
76 
77  pgstat_unlock_entry(dst_ref);
78 }
PgStat_StatTabEntry * pgstat_fetch_stat_tabentry_ext(bool shared, Oid reloid)
void pgstat_unlock_entry(PgStat_EntryRef *entry_ref)
Definition: pgstat_shmem.c:638
PgStat_EntryRef * pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, uint64 objid, bool nowait)
Definition: pgstat_shmem.c:647
PgStat_StatTabEntry stats
PgStatShared_Common * shared_stats

References InvalidOid, MyDatabaseId, pgstat_fetch_stat_tabentry_ext(), pgstat_get_entry_ref_locked(), PGSTAT_KIND_RELATION, pgstat_unlock_entry(), RelationData::rd_rel, RelationGetRelid, PgStat_EntryRef::shared_stats, and PgStatShared_Relation::stats.

Referenced by index_concurrently_swap().

◆ pgstat_count_heap_delete()

void pgstat_count_heap_delete ( Relation  rel)

Definition at line 401 of file pgstat_relation.c.

402 {
404  {
405  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
406 
407  ensure_tabstat_xact_level(pgstat_info);
408  pgstat_info->trans->tuples_deleted++;
409  }
410 }
static void ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info)
PgStat_Counter tuples_deleted
Definition: pgstat.h:246

References ensure_tabstat_xact_level(), RelationData::pgstat_info, pgstat_should_count_relation, PgStat_TableStatus::trans, and PgStat_TableXactStatus::tuples_deleted.

Referenced by heap_abort_speculative(), and heap_delete().

◆ pgstat_count_heap_insert()

void pgstat_count_heap_insert ( Relation  rel,
PgStat_Counter  n 
)

Definition at line 360 of file pgstat_relation.c.

361 {
363  {
364  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
365 
366  ensure_tabstat_xact_level(pgstat_info);
367  pgstat_info->trans->tuples_inserted += n;
368  }
369 }
PgStat_Counter tuples_inserted
Definition: pgstat.h:244

References ensure_tabstat_xact_level(), RelationData::pgstat_info, pgstat_should_count_relation, PgStat_TableStatus::trans, and PgStat_TableXactStatus::tuples_inserted.

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

◆ pgstat_count_heap_update()

void pgstat_count_heap_update ( Relation  rel,
bool  hot,
bool  newpage 
)

Definition at line 375 of file pgstat_relation.c.

376 {
377  Assert(!(hot && newpage));
378 
380  {
381  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
382 
383  ensure_tabstat_xact_level(pgstat_info);
384  pgstat_info->trans->tuples_updated++;
385 
386  /*
387  * tuples_hot_updated and tuples_newpage_updated counters are
388  * nontransactional, so just advance them
389  */
390  if (hot)
391  pgstat_info->counts.tuples_hot_updated++;
392  else if (newpage)
393  pgstat_info->counts.tuples_newpage_updated++;
394  }
395 }
PgStat_Counter tuples_hot_updated
Definition: pgstat.h:202
PgStat_Counter tuples_newpage_updated
Definition: pgstat.h:203
PgStat_Counter tuples_updated
Definition: pgstat.h:245

References Assert, PgStat_TableStatus::counts, ensure_tabstat_xact_level(), RelationData::pgstat_info, pgstat_should_count_relation, PgStat_TableStatus::trans, PgStat_TableCounts::tuples_hot_updated, PgStat_TableCounts::tuples_newpage_updated, and PgStat_TableXactStatus::tuples_updated.

Referenced by heap_update().

◆ pgstat_count_io_op()

void pgstat_count_io_op ( IOObject  io_object,
IOContext  io_context,
IOOp  io_op 
)

Definition at line 77 of file pgstat_io.c.

78 {
79  pgstat_count_io_op_n(io_object, io_context, io_op, 1);
80 }
void pgstat_count_io_op_n(IOObject io_object, IOContext io_context, IOOp io_op, uint32 cnt)
Definition: pgstat_io.c:83

References pgstat_count_io_op_n().

Referenced by GetLocalVictimBuffer(), GetVictimBuffer(), and PinBufferForBlock().

◆ pgstat_count_io_op_n()

void pgstat_count_io_op_n ( IOObject  io_object,
IOContext  io_context,
IOOp  io_op,
uint32  cnt 
)

Definition at line 83 of file pgstat_io.c.

84 {
85  Assert((unsigned int) io_object < IOOBJECT_NUM_TYPES);
86  Assert((unsigned int) io_context < IOCONTEXT_NUM_TYPES);
87  Assert((unsigned int) io_op < IOOP_NUM_TYPES);
88  Assert(pgstat_tracks_io_op(MyBackendType, io_object, io_context, io_op));
89 
90  PendingIOStats.counts[io_object][io_context][io_op] += cnt;
91 
92  have_iostats = true;
93 }
BackendType MyBackendType
Definition: miscinit.c:63
static PgStat_PendingIO PendingIOStats
Definition: pgstat_io.c:31
static bool have_iostats
Definition: pgstat_io.c:32
PgStat_Counter counts[IOOBJECT_NUM_TYPES][IOCONTEXT_NUM_TYPES][IOOP_NUM_TYPES]
Definition: pgstat_io.c:26

References Assert, PgStat_PendingIO::counts, have_iostats, IOCONTEXT_NUM_TYPES, IOOBJECT_NUM_TYPES, IOOP_NUM_TYPES, MyBackendType, PendingIOStats, and pgstat_tracks_io_op().

Referenced by pgstat_count_io_op(), and pgstat_count_io_op_time().

◆ pgstat_count_io_op_time()

void pgstat_count_io_op_time ( IOObject  io_object,
IOContext  io_context,
IOOp  io_op,
instr_time  start_time,
uint32  cnt 
)

Definition at line 122 of file pgstat_io.c.

124 {
125  if (track_io_timing)
126  {
127  instr_time io_time;
128 
129  INSTR_TIME_SET_CURRENT(io_time);
131 
132  if (io_op == IOOP_WRITE || io_op == IOOP_EXTEND)
133  {
135  if (io_object == IOOBJECT_RELATION)
137  else if (io_object == IOOBJECT_TEMP_RELATION)
139  }
140  else if (io_op == IOOP_READ)
141  {
143  if (io_object == IOOBJECT_RELATION)
145  else if (io_object == IOOBJECT_TEMP_RELATION)
147  }
148 
149  INSTR_TIME_ADD(PendingIOStats.pending_times[io_object][io_context][io_op],
150  io_time);
151  }
152 
153  pgstat_count_io_op_n(io_object, io_context, io_op, cnt);
154 }
bool track_io_timing
Definition: bufmgr.c:143
#define INSTR_TIME_SET_CURRENT(t)
Definition: instr_time.h:122
#define INSTR_TIME_ADD(x, y)
Definition: instr_time.h:178
#define INSTR_TIME_SUBTRACT(x, y)
Definition: instr_time.h:181
#define INSTR_TIME_GET_MICROSEC(t)
Definition: instr_time.h:194
BufferUsage pgBufferUsage
Definition: instrument.c:20
static time_t start_time
Definition: pg_ctl.c:95
#define pgstat_count_buffer_read_time(n)
Definition: pgstat.h:587
#define pgstat_count_buffer_write_time(n)
Definition: pgstat.h:589
instr_time local_blk_read_time
Definition: instrument.h:38
instr_time shared_blk_read_time
Definition: instrument.h:36
instr_time shared_blk_write_time
Definition: instrument.h:37
instr_time local_blk_write_time
Definition: instrument.h:39
instr_time pending_times[IOOBJECT_NUM_TYPES][IOCONTEXT_NUM_TYPES][IOOP_NUM_TYPES]
Definition: pgstat_io.c:27

References INSTR_TIME_ADD, INSTR_TIME_GET_MICROSEC, INSTR_TIME_SET_CURRENT, INSTR_TIME_SUBTRACT, IOOBJECT_RELATION, IOOBJECT_TEMP_RELATION, IOOP_EXTEND, IOOP_READ, IOOP_WRITE, BufferUsage::local_blk_read_time, BufferUsage::local_blk_write_time, PgStat_PendingIO::pending_times, PendingIOStats, pgBufferUsage, pgstat_count_buffer_read_time, pgstat_count_buffer_write_time, pgstat_count_io_op_n(), BufferUsage::shared_blk_read_time, BufferUsage::shared_blk_write_time, start_time, and track_io_timing.

Referenced by ExtendBufferedRelLocal(), ExtendBufferedRelShared(), FlushBuffer(), FlushRelationBuffers(), GetLocalVictimBuffer(), IssuePendingWritebacks(), mdsyncfiletag(), register_dirty_segment(), and WaitReadBuffers().

◆ pgstat_count_slru_flush()

void pgstat_count_slru_flush ( int  slru_idx)

Definition at line 89 of file pgstat_slru.c.

90 {
91  get_slru_entry(slru_idx)->flush += 1;
92 }
static PgStat_SLRUStats * get_slru_entry(int slru_idx)
Definition: pgstat_slru.c:237
PgStat_Counter flush
Definition: pgstat.h:421

References PgStat_SLRUStats::flush, and get_slru_entry().

Referenced by SimpleLruWriteAll().

◆ pgstat_count_slru_page_exists()

void pgstat_count_slru_page_exists ( int  slru_idx)

Definition at line 71 of file pgstat_slru.c.

72 {
73  get_slru_entry(slru_idx)->blocks_exists += 1;
74 }
PgStat_Counter blocks_exists
Definition: pgstat.h:420

References PgStat_SLRUStats::blocks_exists, and get_slru_entry().

Referenced by SimpleLruDoesPhysicalPageExist().

◆ pgstat_count_slru_page_hit()

void pgstat_count_slru_page_hit ( int  slru_idx)

Definition at line 65 of file pgstat_slru.c.

66 {
67  get_slru_entry(slru_idx)->blocks_hit += 1;
68 }
PgStat_Counter blocks_hit
Definition: pgstat.h:417

References PgStat_SLRUStats::blocks_hit, and get_slru_entry().

Referenced by SimpleLruReadPage(), and SimpleLruReadPage_ReadOnly().

◆ pgstat_count_slru_page_read()

void pgstat_count_slru_page_read ( int  slru_idx)

Definition at line 77 of file pgstat_slru.c.

78 {
79  get_slru_entry(slru_idx)->blocks_read += 1;
80 }
PgStat_Counter blocks_read
Definition: pgstat.h:418

References PgStat_SLRUStats::blocks_read, and get_slru_entry().

Referenced by SimpleLruReadPage().

◆ pgstat_count_slru_page_written()

void pgstat_count_slru_page_written ( int  slru_idx)

Definition at line 83 of file pgstat_slru.c.

84 {
85  get_slru_entry(slru_idx)->blocks_written += 1;
86 }
PgStat_Counter blocks_written
Definition: pgstat.h:419

References PgStat_SLRUStats::blocks_written, and get_slru_entry().

Referenced by SlruPhysicalWritePage().

◆ pgstat_count_slru_page_zeroed()

void pgstat_count_slru_page_zeroed ( int  slru_idx)

Definition at line 59 of file pgstat_slru.c.

60 {
61  get_slru_entry(slru_idx)->blocks_zeroed += 1;
62 }
PgStat_Counter blocks_zeroed
Definition: pgstat.h:416

References PgStat_SLRUStats::blocks_zeroed, and get_slru_entry().

Referenced by SimpleLruZeroPage().

◆ pgstat_count_slru_truncate()

void pgstat_count_slru_truncate ( int  slru_idx)

Definition at line 95 of file pgstat_slru.c.

96 {
97  get_slru_entry(slru_idx)->truncate += 1;
98 }
PgStat_Counter truncate
Definition: pgstat.h:422

References get_slru_entry(), and PgStat_SLRUStats::truncate.

Referenced by SimpleLruTruncate().

◆ pgstat_count_truncate()

void pgstat_count_truncate ( Relation  rel)

Definition at line 416 of file pgstat_relation.c.

417 {
419  {
420  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
421 
422  ensure_tabstat_xact_level(pgstat_info);
423  save_truncdrop_counters(pgstat_info->trans, false);
424  pgstat_info->trans->tuples_inserted = 0;
425  pgstat_info->trans->tuples_updated = 0;
426  pgstat_info->trans->tuples_deleted = 0;
427  }
428 }
static void save_truncdrop_counters(PgStat_TableXactStatus *trans, bool is_drop)

References ensure_tabstat_xact_level(), RelationData::pgstat_info, pgstat_should_count_relation, save_truncdrop_counters(), PgStat_TableStatus::trans, PgStat_TableXactStatus::tuples_deleted, PgStat_TableXactStatus::tuples_inserted, and PgStat_TableXactStatus::tuples_updated.

Referenced by ExecuteTruncateGuts(), and RefreshMatViewByOid().

◆ pgstat_create_function()

void pgstat_create_function ( Oid  proid)

Definition at line 45 of file pgstat_function.c.

46 {
49  proid);
50 }
void pgstat_create_transactional(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat_xact.c:361

References MyDatabaseId, pgstat_create_transactional(), and PGSTAT_KIND_FUNCTION.

Referenced by ProcedureCreate().

◆ pgstat_create_relation()

void pgstat_create_relation ( Relation  rel)

◆ pgstat_create_replslot()

void pgstat_create_replslot ( struct ReplicationSlot slot)

Definition at line 111 of file pgstat_replslot.c.

112 {
113  PgStat_EntryRef *entry_ref;
114  PgStatShared_ReplSlot *shstatent;
115 
116  Assert(LWLockHeldByMeInMode(ReplicationSlotAllocationLock, LW_EXCLUSIVE));
117 
119  ReplicationSlotIndex(slot), false);
120  shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats;
121 
122  /*
123  * NB: need to accept that there might be stats from an older slot, e.g.
124  * if we previously crashed after dropping a slot.
125  */
126  memset(&shstatent->stats, 0, sizeof(shstatent->stats));
127 
128  pgstat_unlock_entry(entry_ref);
129 }
bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1937
@ LW_EXCLUSIVE
Definition: lwlock.h:114
PgStat_StatReplSlotEntry stats

References Assert, InvalidOid, LW_EXCLUSIVE, LWLockHeldByMeInMode(), pgstat_get_entry_ref_locked(), PGSTAT_KIND_REPLSLOT, pgstat_unlock_entry(), ReplicationSlotIndex(), PgStat_EntryRef::shared_stats, and PgStatShared_ReplSlot::stats.

Referenced by ReplicationSlotCreate().

◆ pgstat_create_subscription()

void pgstat_create_subscription ( Oid  subid)

Definition at line 61 of file pgstat_subscription.c.

62 {
63  /* Ensures that stats are dropped if transaction rolls back */
65  InvalidOid, subid);
66 
67  /* Create and initialize the subscription stats entry */
69  true, NULL);
71 }
#define PGSTAT_KIND_SUBSCRIPTION
Definition: pgstat.h:51
void pgstat_reset_entry(PgStat_Kind kind, Oid dboid, uint64 objid, TimestampTz ts)
Definition: pgstat_shmem.c:984

References InvalidOid, pgstat_create_transactional(), pgstat_get_entry_ref(), PGSTAT_KIND_SUBSCRIPTION, and pgstat_reset_entry().

Referenced by CreateSubscription().

◆ pgstat_discard_stats()

void pgstat_discard_stats ( void  )

Definition at line 489 of file pgstat.c.

491 {
492  int ret;
493 
494  /* NB: this needs to be done even in single user mode */
495 
496  ret = unlink(PGSTAT_STAT_PERMANENT_FILENAME);
497  if (ret != 0)
498  {
499  if (errno == ENOENT)
500  elog(DEBUG2,
501  "didn't need to unlink permanent stats file \"%s\" - didn't exist",
503  else
504  ereport(LOG,
506  errmsg("could not unlink permanent statistics file \"%s\": %m",
508  }
509  else
510  {
511  ereport(DEBUG2,
513  errmsg_internal("unlinked permanent statistics file \"%s\"",
515  }
516 
517  /*
518  * Reset stats contents. This will set reset timestamps of fixed-numbered
519  * stats to the current time (no variable stats exist).
520  */
int errmsg_internal(const char *fmt,...)
Definition: elog.c:1157
int errcode_for_file_access(void)
Definition: elog.c:876
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define LOG
Definition: elog.h:31
#define DEBUG2
Definition: elog.h:29
#define elog(elevel,...)
Definition: elog.h:225
#define ereport(elevel,...)
Definition: elog.h:149
static void pgstat_reset_after_failure(void)
Definition: pgstat.c:2024
#define PGSTAT_STAT_PERMANENT_FILENAME
Definition: pgstat.h:30

References DEBUG2, elog, ereport, errcode_for_file_access(), errmsg(), errmsg_internal(), LOG, pgstat_reset_after_failure(), and PGSTAT_STAT_PERMANENT_FILENAME.

Referenced by StartupXLOG().

◆ pgstat_drop_database()

void pgstat_drop_database ( Oid  databaseid)

Definition at line 44 of file pgstat_database.c.

45 {
47 }
#define PGSTAT_KIND_DATABASE
Definition: pgstat.h:47
void pgstat_drop_transactional(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat_xact.c:384

References InvalidOid, pgstat_drop_transactional(), and PGSTAT_KIND_DATABASE.

Referenced by dropdb().

◆ pgstat_drop_function()

void pgstat_drop_function ( Oid  proid)

Definition at line 60 of file pgstat_function.c.

61 {
64  proid);
65 }

References MyDatabaseId, pgstat_drop_transactional(), and PGSTAT_KIND_FUNCTION.

Referenced by RemoveFunctionById().

◆ pgstat_drop_relation()

void pgstat_drop_relation ( Relation  rel)

Definition at line 180 of file pgstat_relation.c.

181 {
182  int nest_level = GetCurrentTransactionNestLevel();
183  PgStat_TableStatus *pgstat_info;
184 
186  rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId,
187  RelationGetRelid(rel));
188 
190  return;
191 
192  /*
193  * Transactionally set counters to 0. That ensures that accesses to
194  * pg_stat_xact_all_tables inside the transaction show 0.
195  */
196  pgstat_info = rel->pgstat_info;
197  if (pgstat_info->trans &&
198  pgstat_info->trans->nest_level == nest_level)
199  {
200  save_truncdrop_counters(pgstat_info->trans, true);
201  pgstat_info->trans->tuples_inserted = 0;
202  pgstat_info->trans->tuples_updated = 0;
203  pgstat_info->trans->tuples_deleted = 0;
204  }
205 }
int GetCurrentTransactionNestLevel(void)
Definition: xact.c:928

References GetCurrentTransactionNestLevel(), InvalidOid, MyDatabaseId, PgStat_TableXactStatus::nest_level, pgstat_drop_transactional(), RelationData::pgstat_info, PGSTAT_KIND_RELATION, pgstat_should_count_relation, RelationData::rd_rel, RelationGetRelid, save_truncdrop_counters(), PgStat_TableStatus::trans, PgStat_TableXactStatus::tuples_deleted, PgStat_TableXactStatus::tuples_inserted, and PgStat_TableXactStatus::tuples_updated.

Referenced by heap_drop_with_catalog(), and index_drop().

◆ pgstat_drop_replslot()

void pgstat_drop_replslot ( struct ReplicationSlot slot)

Definition at line 156 of file pgstat_replslot.c.

157 {
158  Assert(LWLockHeldByMeInMode(ReplicationSlotAllocationLock, LW_EXCLUSIVE));
159 
161  ReplicationSlotIndex(slot)))
163 }
void pgstat_request_entry_refs_gc(void)
Definition: pgstat_shmem.c:663
bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat_shmem.c:909

References Assert, InvalidOid, LW_EXCLUSIVE, LWLockHeldByMeInMode(), pgstat_drop_entry(), PGSTAT_KIND_REPLSLOT, pgstat_request_entry_refs_gc(), and ReplicationSlotIndex().

Referenced by ReplicationSlotDropPtr().

◆ pgstat_drop_subscription()

void pgstat_drop_subscription ( Oid  subid)

◆ pgstat_end_function_usage()

void pgstat_end_function_usage ( PgStat_FunctionCallUsage fcu,
bool  finalize 
)

Definition at line 146 of file pgstat_function.c.

147 {
148  PgStat_FunctionCounts *fs = fcu->fs;
149  instr_time total;
150  instr_time others;
151  instr_time self;
152 
153  /* stats not wanted? */
154  if (fs == NULL)
155  return;
156 
157  /* total elapsed time in this function call */
158  INSTR_TIME_SET_CURRENT(total);
159  INSTR_TIME_SUBTRACT(total, fcu->start);
160 
161  /* self usage: elapsed minus anything already charged to other calls */
162  others = total_func_time;
163  INSTR_TIME_SUBTRACT(others, fcu->save_total);
164  self = total;
165  INSTR_TIME_SUBTRACT(self, others);
166 
167  /* update backend-wide total time */
169 
170  /*
171  * Compute the new total_time as the total elapsed time added to the
172  * pre-call value of total_time. This is necessary to avoid
173  * double-counting any time taken by recursive calls of myself. (We do
174  * not need any similar kluge for self time, since that already excludes
175  * any recursive calls.)
176  */
177  INSTR_TIME_ADD(total, fcu->save_f_total_time);
178 
179  /* update counters in function stats table */
180  if (finalize)
181  fs->numcalls++;
182  fs->total_time = total;
183  INSTR_TIME_ADD(fs->self_time, self);
184 }
static instr_time total_func_time
instr_time save_total
Definition: pgstat.h:156
PgStat_FunctionCounts * fs
Definition: pgstat.h:152
instr_time save_f_total_time
Definition: pgstat.h:154
PgStat_Counter numcalls
Definition: pgstat.h:140
instr_time total_time
Definition: pgstat.h:141
instr_time self_time
Definition: pgstat.h:142

References PgStat_FunctionCallUsage::fs, INSTR_TIME_ADD, INSTR_TIME_SET_CURRENT, INSTR_TIME_SUBTRACT, PgStat_FunctionCounts::numcalls, PgStat_FunctionCallUsage::save_f_total_time, PgStat_FunctionCallUsage::save_total, PgStat_FunctionCounts::self_time, PgStat_FunctionCallUsage::start, total_func_time, and PgStat_FunctionCounts::total_time.

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

◆ pgstat_execute_transactional_drops()

void pgstat_execute_transactional_drops ( int  ndrops,
struct xl_xact_stats_item items,
bool  is_redo 
)

Definition at line 314 of file pgstat_xact.c.

315 {
316  int not_freed_count = 0;
317 
318  if (ndrops == 0)
319  return;
320 
321  for (int i = 0; i < ndrops; i++)
322  {
323  xl_xact_stats_item *it = &items[i];
324  uint64 objid = ((uint64) it->objid_hi) << 32 | it->objid_lo;
325 
326  if (!pgstat_drop_entry(it->kind, it->dboid, objid))
327  not_freed_count++;
328  }
329 
330  if (not_freed_count > 0)
332 }
int i
Definition: isn.c:73
uint32 objid_lo
Definition: xact.h:291
uint32 objid_hi
Definition: xact.h:292
static ItemArray items
Definition: test_tidstore.c:49

References xl_xact_stats_item::dboid, i, items, xl_xact_stats_item::kind, xl_xact_stats_item::objid_hi, xl_xact_stats_item::objid_lo, pgstat_drop_entry(), and pgstat_request_entry_refs_gc().

Referenced by FinishPreparedTransaction(), xact_redo_abort(), and xact_redo_commit().

◆ pgstat_fetch_replslot()

PgStat_StatReplSlotEntry* pgstat_fetch_replslot ( NameData  slotname)

Definition at line 170 of file pgstat_replslot.c.

171 {
172  int idx;
173  PgStat_StatReplSlotEntry *slotentry = NULL;
174 
175  LWLockAcquire(ReplicationSlotControlLock, LW_SHARED);
176 
177  idx = get_replslot_index(NameStr(slotname), false);
178 
179  if (idx != -1)
181  InvalidOid, idx);
182 
183  LWLockRelease(ReplicationSlotControlLock);
184 
185  return slotentry;
186 }
Datum idx(PG_FUNCTION_ARGS)
Definition: _int_op.c:259
#define NameStr(name)
Definition: c.h:749
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1168
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1781
@ LW_SHARED
Definition: lwlock.h:115
void * pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat.c:928
static int get_replslot_index(const char *name, bool need_lock)

References get_replslot_index(), idx(), InvalidOid, LW_SHARED, LWLockAcquire(), LWLockRelease(), NameStr, pgstat_fetch_entry(), and PGSTAT_KIND_REPLSLOT.

Referenced by pg_stat_get_replication_slot().

◆ pgstat_fetch_slru()

PgStat_SLRUStats* pgstat_fetch_slru ( void  )

Definition at line 105 of file pgstat_slru.c.

106 {
108 
109  return pgStatLocal.snapshot.slru;
110 }
void pgstat_snapshot_fixed(PgStat_Kind kind)
Definition: pgstat.c:1054
#define PGSTAT_KIND_SLRU
Definition: pgstat.h:58
PgStat_SLRUStats slru[SLRU_NUM_ELEMENTS]

References PGSTAT_KIND_SLRU, pgstat_snapshot_fixed(), pgStatLocal, PgStat_Snapshot::slru, and PgStat_LocalState::snapshot.

Referenced by pg_stat_get_slru().

◆ pgstat_fetch_stat_archiver()

PgStat_ArchiverStats* pgstat_fetch_stat_archiver ( void  )

Definition at line 58 of file pgstat_archiver.c.

59 {
61 
63 }
#define PGSTAT_KIND_ARCHIVER
Definition: pgstat.h:54
PgStat_ArchiverStats archiver

References PgStat_Snapshot::archiver, PGSTAT_KIND_ARCHIVER, pgstat_snapshot_fixed(), pgStatLocal, and PgStat_LocalState::snapshot.

Referenced by pg_stat_get_archiver().

◆ pgstat_fetch_stat_bgwriter()

◆ pgstat_fetch_stat_checkpointer()

◆ pgstat_fetch_stat_dbentry()

◆ pgstat_fetch_stat_funcentry()

PgStat_StatFuncEntry* pgstat_fetch_stat_funcentry ( Oid  func_id)

◆ pgstat_fetch_stat_io()

PgStat_IO* pgstat_fetch_stat_io ( void  )

Definition at line 157 of file pgstat_io.c.

158 {
160 
161  return &pgStatLocal.snapshot.io;
162 }
#define PGSTAT_KIND_IO
Definition: pgstat.h:57

References PgStat_Snapshot::io, PGSTAT_KIND_IO, pgstat_snapshot_fixed(), pgStatLocal, and PgStat_LocalState::snapshot.

Referenced by pg_stat_get_io().

◆ pgstat_fetch_stat_subscription()

PgStat_StatSubEntry* pgstat_fetch_stat_subscription ( Oid  subid)

◆ pgstat_fetch_stat_tabentry()

PgStat_StatTabEntry* pgstat_fetch_stat_tabentry ( Oid  relid)

Definition at line 456 of file pgstat_relation.c.

457 {
458  return pgstat_fetch_stat_tabentry_ext(IsSharedRelation(relid), relid);
459 }
bool IsSharedRelation(Oid relationId)
Definition: catalog.c:273

References IsSharedRelation(), and pgstat_fetch_stat_tabentry_ext().

◆ pgstat_fetch_stat_tabentry_ext()

PgStat_StatTabEntry* pgstat_fetch_stat_tabentry_ext ( bool  shared,
Oid  reloid 
)

Definition at line 466 of file pgstat_relation.c.

467 {
468  Oid dboid = (shared ? InvalidOid : MyDatabaseId);
469 
470  return (PgStat_StatTabEntry *)
472 }
unsigned int Oid
Definition: postgres_ext.h:31

References InvalidOid, MyDatabaseId, pgstat_fetch_entry(), and PGSTAT_KIND_RELATION.

Referenced by do_autovacuum(), pgstat_copy_relation_stats(), pgstat_fetch_stat_tabentry(), and recheck_relation_needs_vacanalyze().

◆ pgstat_fetch_stat_wal()

PgStat_WalStats* pgstat_fetch_stat_wal ( void  )

Definition at line 67 of file pgstat_wal.c.

68 {
70 
71  return &pgStatLocal.snapshot.wal;
72 }
#define PGSTAT_KIND_WAL
Definition: pgstat.h:59
PgStat_WalStats wal

References PGSTAT_KIND_WAL, pgstat_snapshot_fixed(), pgStatLocal, PgStat_LocalState::snapshot, and PgStat_Snapshot::wal.

Referenced by pg_stat_get_wal().

◆ pgstat_force_next_flush()

void pgstat_force_next_flush ( void  )

Definition at line 808 of file pgstat.c.

810 {
811  pgStatForceNextFlush = true;
static bool pgStatForceNextFlush
Definition: pgstat.c:244

References pgStatForceNextFlush.

Referenced by pg_stat_force_next_flush().

◆ pgstat_get_io_context_name()

const char* pgstat_get_io_context_name ( IOContext  io_context)

Definition at line 239 of file pgstat_io.c.

240 {
241  switch (io_context)
242  {
243  case IOCONTEXT_BULKREAD:
244  return "bulkread";
245  case IOCONTEXT_BULKWRITE:
246  return "bulkwrite";
247  case IOCONTEXT_NORMAL:
248  return "normal";
249  case IOCONTEXT_VACUUM:
250  return "vacuum";
251  }
252 
253  elog(ERROR, "unrecognized IOContext value: %d", io_context);
254  pg_unreachable();
255 }
#define pg_unreachable()
Definition: c.h:299
#define ERROR
Definition: elog.h:39

References elog, ERROR, IOCONTEXT_BULKREAD, IOCONTEXT_BULKWRITE, IOCONTEXT_NORMAL, IOCONTEXT_VACUUM, and pg_unreachable.

Referenced by pg_stat_get_io().

◆ pgstat_get_io_object_name()

const char* pgstat_get_io_object_name ( IOObject  io_object)

Definition at line 258 of file pgstat_io.c.

259 {
260  switch (io_object)
261  {
262  case IOOBJECT_RELATION:
263  return "relation";
265  return "temp relation";
266  }
267 
268  elog(ERROR, "unrecognized IOObject value: %d", io_object);
269  pg_unreachable();
270 }

References elog, ERROR, IOOBJECT_RELATION, IOOBJECT_TEMP_RELATION, and pg_unreachable.

Referenced by pg_stat_get_io().

◆ pgstat_get_kind_from_str()

PgStat_Kind pgstat_get_kind_from_str ( char *  kind_str)

Definition at line 1396 of file pgstat.c.

1398 {
1399  for (PgStat_Kind kind = PGSTAT_KIND_BUILTIN_MIN; kind <= PGSTAT_KIND_BUILTIN_MAX; kind++)
1400  {
1401  if (pg_strcasecmp(kind_str, pgstat_kind_builtin_infos[kind].name) == 0)
1402  return kind;
1403  }
1404 
1405  /* Check the custom set of cumulative stats */
1407  {
1408  for (PgStat_Kind kind = PGSTAT_KIND_CUSTOM_MIN; kind <= PGSTAT_KIND_CUSTOM_MAX; kind++)
1409  {
1411 
1413  pg_strcasecmp(kind_str, pgstat_kind_custom_infos[idx]->name) == 0)
1414  return kind;
1415  }
1416  }
1417 
1418  ereport(ERROR,
1419  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1420  errmsg("invalid statistics kind: \"%s\"", kind_str)));
1421  return PGSTAT_KIND_INVALID; /* avoid compiler warnings */
unsigned int uint32
Definition: c.h:509
int errcode(int sqlerrcode)
Definition: elog.c:853
static const PgStat_KindInfo ** pgstat_kind_custom_infos
Definition: pgstat.c:464
static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE]
Definition: pgstat.c:276
#define PGSTAT_KIND_CUSTOM_MAX
Definition: pgstat.h:69
#define PgStat_Kind
Definition: pgstat.h:37
#define PGSTAT_KIND_CUSTOM_MIN
Definition: pgstat.h:68
#define PGSTAT_KIND_BUILTIN_MAX
Definition: pgstat.h:62
#define PGSTAT_KIND_INVALID
Definition: pgstat.h:44
#define PGSTAT_KIND_BUILTIN_MIN
Definition: pgstat.h:61
int pg_strcasecmp(const char *s1, const char *s2)
Definition: pgstrcasecmp.c:36
const char * name

References ereport, errcode(), errmsg(), ERROR, idx(), name, pg_strcasecmp(), PgStat_Kind, pgstat_kind_builtin_infos, PGSTAT_KIND_BUILTIN_MAX, PGSTAT_KIND_BUILTIN_MIN, pgstat_kind_custom_infos, PGSTAT_KIND_CUSTOM_MAX, PGSTAT_KIND_CUSTOM_MIN, and PGSTAT_KIND_INVALID.

Referenced by pg_stat_have_stats().

◆ pgstat_get_slru_index()

int pgstat_get_slru_index ( const char *  name)

Definition at line 132 of file pgstat_slru.c.

133 {
134  int i;
135 
136  for (i = 0; i < SLRU_NUM_ELEMENTS; i++)
137  {
138  if (strcmp(slru_names[i], name) == 0)
139  return i;
140  }
141 
142  /* return index of the last entry (which is the "other" one) */
143  return (SLRU_NUM_ELEMENTS - 1);
144 }
static const char *const slru_names[]
#define SLRU_NUM_ELEMENTS

References i, name, slru_names, and SLRU_NUM_ELEMENTS.

Referenced by pgstat_reset_slru(), and SimpleLruInit().

◆ pgstat_get_slru_name()

const char* pgstat_get_slru_name ( int  slru_idx)

Definition at line 118 of file pgstat_slru.c.

119 {
120  if (slru_idx < 0 || slru_idx >= SLRU_NUM_ELEMENTS)
121  return NULL;
122 
123  return slru_names[slru_idx];
124 }

References slru_names, and SLRU_NUM_ELEMENTS.

Referenced by pg_stat_get_slru().

◆ pgstat_get_stat_snapshot_timestamp()

TimestampTz pgstat_get_stat_snapshot_timestamp ( bool have_snapshot)

Definition at line 1021 of file pgstat.c.

1023 {
1026 
1028  {
1029  *have_snapshot = true;
1031  }
1032 
1033  *have_snapshot = false;
1034 
1035  return 0;
TimestampTz snapshot_timestamp

References force_stats_snapshot_clear, PgStat_Snapshot::mode, pgstat_clear_snapshot(), PGSTAT_FETCH_CONSISTENCY_SNAPSHOT, pgStatLocal, PgStat_LocalState::snapshot, and PgStat_Snapshot::snapshot_timestamp.

Referenced by pg_stat_get_snapshot_timestamp().

◆ pgstat_get_transactional_drops()

int pgstat_get_transactional_drops ( bool  isCommit,
struct xl_xact_stats_item **  items 
)

Definition at line 272 of file pgstat_xact.c.

273 {
275  int nitems = 0;
276  dlist_iter iter;
277 
278  if (xact_state == NULL)
279  return 0;
280 
281  /*
282  * We expect to be called for subtransaction abort (which logs a WAL
283  * record), but not for subtransaction commit (which doesn't).
284  */
285  Assert(!isCommit || xact_state->nest_level == 1);
286  Assert(!isCommit || xact_state->prev == NULL);
287 
288  *items = palloc(dclist_count(&xact_state->pending_drops)
289  * sizeof(xl_xact_stats_item));
290 
291  dclist_foreach(iter, &xact_state->pending_drops)
292  {
295 
296  if (isCommit && pending->is_create)
297  continue;
298  if (!isCommit && !pending->is_create)
299  continue;
300 
301  Assert(nitems < dclist_count(&xact_state->pending_drops));
302  (*items)[nitems++] = pending->item;
303  }
304 
305  return nitems;
306 }
#define dclist_container(type, membername, ptr)
Definition: ilist.h:947
static uint32 dclist_count(const dclist_head *head)
Definition: ilist.h:932
#define dclist_foreach(iter, lhead)
Definition: ilist.h:970
#define nitems(x)
Definition: indent.h:31
xl_xact_stats_item item
Definition: pgstat_xact.c:23
dlist_node * cur
Definition: ilist.h:179

References Assert, dlist_iter::cur, dclist_container, dclist_count(), dclist_foreach, PgStat_PendingDroppedStatsItem::is_create, PgStat_PendingDroppedStatsItem::item, items, PgStat_SubXactStatus::nest_level, nitems, palloc(), PgStat_SubXactStatus::pending_drops, pgStatXactStack, and PgStat_SubXactStatus::prev.

Referenced by RecordTransactionAbort(), RecordTransactionCommit(), and StartPrepare().

◆ pgstat_have_entry()

bool pgstat_have_entry ( PgStat_Kind  kind,
Oid  dboid,
uint64  objid 
)

Definition at line 1038 of file pgstat.c.

1040 {
1041  /* fixed-numbered stats always exist */
1042  if (pgstat_get_kind_info(kind)->fixed_amount)
1043  return true;
1044 
1045  return pgstat_get_entry_ref(kind, dboid, objid, false, NULL) != NULL;
const PgStat_KindInfo * pgstat_get_kind_info(PgStat_Kind kind)
Definition: pgstat.c:1430

References pgstat_get_entry_ref(), and pgstat_get_kind_info().

Referenced by pg_stat_have_stats().

◆ pgstat_init_function_usage()

void pgstat_init_function_usage ( struct FunctionCallInfoBaseData fcinfo,
PgStat_FunctionCallUsage fcu 
)

◆ pgstat_init_relation()

void pgstat_init_relation ( Relation  rel)

Definition at line 92 of file pgstat_relation.c.

93 {
94  char relkind = rel->rd_rel->relkind;
95 
96  /*
97  * We only count stats for relations with storage and partitioned tables
98  */
99  if (!RELKIND_HAS_STORAGE(relkind) && relkind != RELKIND_PARTITIONED_TABLE)
100  {
101  rel->pgstat_enabled = false;
102  rel->pgstat_info = NULL;
103  return;
104  }
105 
106  if (!pgstat_track_counts)
107  {
108  if (rel->pgstat_info)
110 
111  /* We're not counting at all */
112  rel->pgstat_enabled = false;
113  rel->pgstat_info = NULL;
114  return;
115  }
116 
117  rel->pgstat_enabled = true;
118 }
bool pgstat_track_counts
Definition: pgstat.c:203
void pgstat_unlink_relation(Relation rel)

References RelationData::pgstat_enabled, RelationData::pgstat_info, pgstat_track_counts, pgstat_unlink_relation(), and RelationData::rd_rel.

Referenced by relation_open(), and try_relation_open().

◆ pgstat_initialize()

void pgstat_initialize ( void  )

Definition at line 607 of file pgstat.c.

609 {
610  Assert(!pgstat_is_initialized);
611 
613 
615 
616  /* Backend initialization callbacks */
617  for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++)
618  {
619  const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
620 
621  if (kind_info == NULL || kind_info->init_backend_cb == NULL)
622  continue;
623 
624  kind_info->init_backend_cb();
625  }
626 
627  /* Set up a process-exit hook to clean up */
629 
630 #ifdef USE_ASSERT_CHECKING
631  pgstat_is_initialized = true;
632 #endif
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:337
static void pgstat_init_snapshot_fixed(void)
Definition: pgstat.c:1074
static void pgstat_shutdown_hook(int code, Datum arg)
Definition: pgstat.c:573
#define PGSTAT_KIND_MAX
Definition: pgstat.h:41
#define PGSTAT_KIND_MIN
Definition: pgstat.h:40
void pgstat_attach_shmem(void)
Definition: pgstat_shmem.c:244
void(* init_backend_cb)(void)

References Assert, before_shmem_exit(), PgStat_KindInfo::init_backend_cb, pgstat_attach_shmem(), pgstat_get_kind_info(), pgstat_init_snapshot_fixed(), PgStat_Kind, PGSTAT_KIND_MAX, PGSTAT_KIND_MIN, and pgstat_shutdown_hook().

Referenced by BaseInit().

◆ pgstat_is_kind_builtin()

◆ pgstat_is_kind_custom()

static bool pgstat_is_kind_custom ( PgStat_Kind  kind)
inlinestatic

◆ pgstat_prepare_io_time()

instr_time pgstat_prepare_io_time ( bool  track_io_guc)

Definition at line 100 of file pgstat_io.c.

101 {
102  instr_time io_start;
103 
104  if (track_io_guc)
105  INSTR_TIME_SET_CURRENT(io_start);
106  else
107  {
108  /*
109  * There is no need to set io_start when an IO timing GUC is disabled,
110  * still initialize it to zero to avoid compiler warnings.
111  */
112  INSTR_TIME_SET_ZERO(io_start);
113  }
114 
115  return io_start;
116 }
#define INSTR_TIME_SET_ZERO(t)
Definition: instr_time.h:172

References INSTR_TIME_SET_CURRENT, and INSTR_TIME_SET_ZERO.

Referenced by ExtendBufferedRelLocal(), ExtendBufferedRelShared(), FlushBuffer(), FlushRelationBuffers(), GetLocalVictimBuffer(), IssuePendingWritebacks(), mdsyncfiletag(), register_dirty_segment(), and WaitReadBuffers().

◆ pgstat_report_analyze()

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

Definition at line 277 of file pgstat_relation.c.

280 {
281  PgStat_EntryRef *entry_ref;
282  PgStatShared_Relation *shtabentry;
283  PgStat_StatTabEntry *tabentry;
284  Oid dboid = (rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId);
285 
286  if (!pgstat_track_counts)
287  return;
288 
289  /*
290  * Unlike VACUUM, ANALYZE might be running inside a transaction that has
291  * already inserted and/or deleted rows in the target table. ANALYZE will
292  * have counted such rows as live or dead respectively. Because we will
293  * report our counts of such rows at transaction end, we should subtract
294  * off these counts from the update we're making now, else they'll be
295  * double-counted after commit. (This approach also ensures that the
296  * shared stats entry ends up with the right numbers if we abort instead
297  * of committing.)
298  *
299  * Waste no time on partitioned tables, though.
300  */
301  if (pgstat_should_count_relation(rel) &&
302  rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
303  {
305 
306  for (trans = rel->pgstat_info->trans; trans; trans = trans->upper)
307  {
308  livetuples -= trans->tuples_inserted - trans->tuples_deleted;
309  deadtuples -= trans->tuples_updated + trans->tuples_deleted;
310  }
311  /* count stuff inserted by already-aborted subxacts, too */
312  deadtuples -= rel->pgstat_info->counts.delta_dead_tuples;
313  /* Since ANALYZE's counts are estimates, we could have underflowed */
314  livetuples = Max(livetuples, 0);
315  deadtuples = Max(deadtuples, 0);
316  }
317 
318  /* block acquiring lock for the same reason as pgstat_report_autovac() */
320  RelationGetRelid(rel),
321  false);
322  /* can't get dropped while accessed */
323  Assert(entry_ref != NULL && entry_ref->shared_stats != NULL);
324 
325  shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats;
326  tabentry = &shtabentry->stats;
327 
328  tabentry->live_tuples = livetuples;
329  tabentry->dead_tuples = deadtuples;
330 
331  /*
332  * If commanded, reset mod_since_analyze to zero. This forgets any
333  * changes that were committed while the ANALYZE was in progress, but we
334  * have no good way to estimate how many of those there were.
335  */
336  if (resetcounter)
337  tabentry->mod_since_analyze = 0;
338 
340  {
342  tabentry->autoanalyze_count++;
343  }
344  else
345  {
347  tabentry->analyze_count++;
348  }
349 
350  pgstat_unlock_entry(entry_ref);
351 
352  /* see pgstat_report_vacuum() */
353  pgstat_flush_io(false);
354 }
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1644
#define Max(x, y)
Definition: c.h:1001
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:77
#define AmAutoVacuumWorkerProcess()
Definition: miscadmin.h:372
void pgstat_flush_io(bool nowait)
Definition: pgstat_io.c:177
PgStat_Counter mod_since_analyze
Definition: pgstat.h:450
PgStat_Counter analyze_count
Definition: pgstat.h:461
PgStat_Counter live_tuples
Definition: pgstat.h:448
TimestampTz last_analyze_time
Definition: pgstat.h:460
PgStat_Counter dead_tuples
Definition: pgstat.h:449
PgStat_Counter autoanalyze_count
Definition: pgstat.h:463
TimestampTz last_autoanalyze_time
Definition: pgstat.h:462
PgStat_Counter delta_dead_tuples
Definition: pgstat.h:207

References AmAutoVacuumWorkerProcess, PgStat_StatTabEntry::analyze_count, Assert, PgStat_StatTabEntry::autoanalyze_count, PgStat_TableStatus::counts, PgStat_StatTabEntry::dead_tuples, PgStat_TableCounts::delta_dead_tuples, GetCurrentTimestamp(), if(), InvalidOid, PgStat_StatTabEntry::last_analyze_time, PgStat_StatTabEntry::last_autoanalyze_time, PgStat_StatTabEntry::live_tuples, Max, PgStat_StatTabEntry::mod_since_analyze, MyDatabaseId, pgstat_flush_io(), pgstat_get_entry_ref_locked(), RelationData::pgstat_info, PGSTAT_KIND_RELATION, pgstat_should_count_relation, pgstat_track_counts, pgstat_unlock_entry(), RelationData::rd_rel, RelationGetRelid, PgStat_EntryRef::shared_stats, PgStatShared_Relation::stats, PgStat_TableStatus::trans, and trans.

Referenced by do_analyze_rel().

◆ pgstat_report_archiver()

void pgstat_report_archiver ( const char *  xlog,
bool  failed 
)

Definition at line 28 of file pgstat_archiver.c.

29 {
32 
34 
35  if (failed)
36  {
37  ++stats_shmem->stats.failed_count;
38  memcpy(&stats_shmem->stats.last_failed_wal, xlog,
39  sizeof(stats_shmem->stats.last_failed_wal));
40  stats_shmem->stats.last_failed_timestamp = now;
41  }
42  else
43  {
44  ++stats_shmem->stats.archived_count;
45  memcpy(&stats_shmem->stats.last_archived_wal, xlog,
46  sizeof(stats_shmem->stats.last_archived_wal));
47  stats_shmem->stats.last_archived_timestamp = now;
48  }
49 
51 }
Datum now(PG_FUNCTION_ARGS)
Definition: timestamp.c:1608
int64 TimestampTz
Definition: timestamp.h:39
static void pgstat_end_changecount_write(uint32 *cc)
static void pgstat_begin_changecount_write(uint32 *cc)
PgStat_ArchiverStats stats
TimestampTz last_failed_timestamp
Definition: pgstat.h:281
TimestampTz last_archived_timestamp
Definition: pgstat.h:277
char last_failed_wal[MAX_XFN_CHARS+1]
Definition: pgstat.h:279
PgStat_Counter failed_count
Definition: pgstat.h:278
PgStat_Counter archived_count
Definition: pgstat.h:274
char last_archived_wal[MAX_XFN_CHARS+1]
Definition: pgstat.h:275
PgStatShared_Archiver archiver

References PgStat_ArchiverStats::archived_count, PgStat_ShmemControl::archiver, PgStatShared_Archiver::changecount, PgStat_ArchiverStats::failed_count, GetCurrentTimestamp(), PgStat_ArchiverStats::last_archived_timestamp, PgStat_ArchiverStats::last_archived_wal, PgStat_ArchiverStats::last_failed_timestamp, PgStat_ArchiverStats::last_failed_wal, now(), pgstat_begin_changecount_write(), pgstat_end_changecount_write(), pgStatLocal, PgStat_LocalState::shmem, and PgStatShared_Archiver::stats.

Referenced by pgarch_ArchiverCopyLoop().

◆ pgstat_report_autovac()

void pgstat_report_autovac ( Oid  dboid)

Definition at line 55 of file pgstat_database.c.

56 {
57  PgStat_EntryRef *entry_ref;
58  PgStatShared_Database *dbentry;
59 
60  /* can't get here in single user mode */
62 
63  /*
64  * End-of-vacuum is reported instantly. Report the start the same way for
65  * consistency. Vacuum doesn't run frequently and is a long-lasting
66  * operation so it doesn't matter if we get blocked here a little.
67  */
69  dboid, InvalidOid, false);
70 
71  dbentry = (PgStatShared_Database *) entry_ref->shared_stats;
73 
74  pgstat_unlock_entry(entry_ref);
75 }
bool IsUnderPostmaster
Definition: globals.c:119
PgStat_StatDBEntry stats
TimestampTz last_autovac_time
Definition: pgstat.h:368

References Assert, GetCurrentTimestamp(), InvalidOid, IsUnderPostmaster, PgStat_StatDBEntry::last_autovac_time, pgstat_get_entry_ref_locked(), PGSTAT_KIND_DATABASE, pgstat_unlock_entry(), PgStat_EntryRef::shared_stats, and PgStatShared_Database::stats.

Referenced by AutoVacWorkerMain().

◆ pgstat_report_bgwriter()

void pgstat_report_bgwriter ( void  )

Definition at line 30 of file pgstat_bgwriter.c.

31 {
33  static const PgStat_BgWriterStats all_zeroes;
34 
37 
38  /*
39  * This function can be called even if nothing at all has happened. In
40  * this case, avoid unnecessarily modifying the stats entry.
41  */
42  if (memcmp(&PendingBgWriterStats, &all_zeroes, sizeof(all_zeroes)) == 0)
43  return;
44 
46 
47 #define BGWRITER_ACC(fld) stats_shmem->stats.fld += PendingBgWriterStats.fld
48  BGWRITER_ACC(buf_written_clean);
49  BGWRITER_ACC(maxwritten_clean);
50  BGWRITER_ACC(buf_alloc);
51 #undef BGWRITER_ACC
52 
54 
55  /*
56  * Clear out the statistics buffer, so it can be re-used.
57  */
59 
60  /*
61  * Report IO statistics
62  */
63  pgstat_flush_io(false);
64 }
#define MemSet(start, val, len)
Definition: c.h:1023
#define BGWRITER_ACC(fld)
PgStat_BgWriterStats PendingBgWriterStats
PgStatShared_BgWriter bgwriter

References Assert, PgStat_ShmemControl::bgwriter, BGWRITER_ACC, PgStatShared_BgWriter::changecount, PgStat_ShmemControl::is_shutdown, MemSet, PendingBgWriterStats, pgstat_assert_is_up, pgstat_begin_changecount_write(), pgstat_end_changecount_write(), pgstat_flush_io(), pgStatLocal, and PgStat_LocalState::shmem.

Referenced by BackgroundWriterMain().

◆ pgstat_report_checkpointer()

void pgstat_report_checkpointer ( void  )

Definition at line 30 of file pgstat_checkpointer.c.

31 {
32  /* We assume this initializes to zeroes */
33  static const PgStat_CheckpointerStats all_zeroes;
35 
38 
39  /*
40  * This function can be called even if nothing at all has happened. In
41  * this case, avoid unnecessarily modifying the stats entry.
42  */
43  if (memcmp(&PendingCheckpointerStats, &all_zeroes,
44  sizeof(all_zeroes)) == 0)
45  return;
46 
48 
49 #define CHECKPOINTER_ACC(fld) stats_shmem->stats.fld += PendingCheckpointerStats.fld
50  CHECKPOINTER_ACC(num_timed);
51  CHECKPOINTER_ACC(num_requested);
52  CHECKPOINTER_ACC(num_performed);
53  CHECKPOINTER_ACC(restartpoints_timed);
54  CHECKPOINTER_ACC(restartpoints_requested);
55  CHECKPOINTER_ACC(restartpoints_performed);
56  CHECKPOINTER_ACC(write_time);
57  CHECKPOINTER_ACC(sync_time);
58  CHECKPOINTER_ACC(buffers_written);
59  CHECKPOINTER_ACC(slru_written);
60 #undef CHECKPOINTER_ACC
61 
63 
64  /*
65  * Clear out the statistics buffer, so it can be re-used.
66  */
68 
69  /*
70  * Report IO statistics
71  */
72  pgstat_flush_io(false);
73 }
PgStat_CheckpointerStats PendingCheckpointerStats
#define CHECKPOINTER_ACC(fld)
PgStatShared_Checkpointer checkpointer

References Assert, PgStatShared_Checkpointer::changecount, PgStat_ShmemControl::checkpointer, CHECKPOINTER_ACC, PgStat_ShmemControl::is_shutdown, MemSet, PendingCheckpointerStats, pgstat_assert_is_up, pgstat_begin_changecount_write(), pgstat_end_changecount_write(), pgstat_flush_io(), pgStatLocal, and PgStat_LocalState::shmem.

Referenced by CheckpointerMain(), CheckpointWriteDelay(), and HandleCheckpointerInterrupts().

◆ pgstat_report_checksum_failure()

void pgstat_report_checksum_failure ( void  )

Definition at line 166 of file pgstat_database.c.

167 {
169 }
void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount)

References MyDatabaseId, and pgstat_report_checksum_failures_in_db().

Referenced by PageIsVerifiedExtended().

◆ pgstat_report_checksum_failures_in_db()

void pgstat_report_checksum_failures_in_db ( Oid  dboid,
int  failurecount 
)

Definition at line 140 of file pgstat_database.c.

141 {
142  PgStat_EntryRef *entry_ref;
143  PgStatShared_Database *sharedent;
144 
145  if (!pgstat_track_counts)
146  return;
147 
148  /*
149  * Update the shared stats directly - checksum failures should never be
150  * common enough for that to be a problem.
151  */
152  entry_ref =
154 
155  sharedent = (PgStatShared_Database *) entry_ref->shared_stats;
156  sharedent->stats.checksum_failures += failurecount;
158 
159  pgstat_unlock_entry(entry_ref);
160 }
TimestampTz last_checksum_failure
Definition: pgstat.h:379
PgStat_Counter checksum_failures
Definition: pgstat.h:378

References PgStat_StatDBEntry::checksum_failures, GetCurrentTimestamp(), InvalidOid, PgStat_StatDBEntry::last_checksum_failure, pgstat_get_entry_ref_locked(), PGSTAT_KIND_DATABASE, pgstat_track_counts, pgstat_unlock_entry(), PgStat_EntryRef::shared_stats, and PgStatShared_Database::stats.

Referenced by pgstat_report_checksum_failure(), and sendFile().

◆ pgstat_report_connect()

void pgstat_report_connect ( Oid  dboid)

Definition at line 191 of file pgstat_database.c.

192 {
193  PgStat_StatDBEntry *dbentry;
194 
196  return;
197 
199 
201  dbentry->sessions++;
202 }
TimestampTz MyStartTimestamp
Definition: globals.c:48
static bool pgstat_should_report_connstat(void)
static PgStat_Counter pgLastSessionReportTime
PgStat_StatDBEntry * pgstat_prep_database_pending(Oid dboid)
PgStat_Counter sessions
Definition: pgstat.h:382

References MyDatabaseId, MyStartTimestamp, pgLastSessionReportTime, pgstat_prep_database_pending(), pgstat_should_report_connstat(), and PgStat_StatDBEntry::sessions.

Referenced by PostgresMain().

◆ pgstat_report_deadlock()

void pgstat_report_deadlock ( void  )

Definition at line 125 of file pgstat_database.c.

126 {
127  PgStat_StatDBEntry *dbent;
128 
129  if (!pgstat_track_counts)
130  return;
131 
133  dbent->deadlocks++;
134 }
PgStat_Counter deadlocks
Definition: pgstat.h:377

References PgStat_StatDBEntry::deadlocks, MyDatabaseId, pgstat_prep_database_pending(), and pgstat_track_counts.

Referenced by DeadLockReport().

◆ pgstat_report_recovery_conflict()

void pgstat_report_recovery_conflict ( int  reason)

Definition at line 81 of file pgstat_database.c.

82 {
83  PgStat_StatDBEntry *dbentry;
84 
87  return;
88 
90 
91  switch (reason)
92  {
94 
95  /*
96  * Since we drop the information about the database as soon as it
97  * replicates, there is no point in counting these conflicts.
98  */
99  break;
101  dbentry->conflict_tablespace++;
102  break;
104  dbentry->conflict_lock++;
105  break;
107  dbentry->conflict_snapshot++;
108  break;
110  dbentry->conflict_bufferpin++;
111  break;
113  dbentry->conflict_logicalslot++;
114  break;
116  dbentry->conflict_startup_deadlock++;
117  break;
118  }
119 }
@ PROCSIG_RECOVERY_CONFLICT_BUFFERPIN
Definition: procsignal.h:47
@ PROCSIG_RECOVERY_CONFLICT_LOCK
Definition: procsignal.h:44
@ PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT
Definition: procsignal.h:46
@ PROCSIG_RECOVERY_CONFLICT_DATABASE
Definition: procsignal.h:42
@ PROCSIG_RECOVERY_CONFLICT_SNAPSHOT
Definition: procsignal.h:45
@ PROCSIG_RECOVERY_CONFLICT_TABLESPACE
Definition: procsignal.h:43
@ PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK
Definition: procsignal.h:48
PgStat_Counter conflict_startup_deadlock
Definition: pgstat.h:374
PgStat_Counter conflict_lock
Definition: pgstat.h:370
PgStat_Counter conflict_snapshot
Definition: pgstat.h:371
PgStat_Counter conflict_bufferpin
Definition: pgstat.h:373
PgStat_Counter conflict_logicalslot
Definition: pgstat.h:372
PgStat_Counter conflict_tablespace
Definition: pgstat.h:369

References Assert, PgStat_StatDBEntry::conflict_bufferpin, PgStat_StatDBEntry::conflict_lock, PgStat_StatDBEntry::conflict_logicalslot, PgStat_StatDBEntry::conflict_snapshot, PgStat_StatDBEntry::conflict_startup_deadlock, PgStat_StatDBEntry::conflict_tablespace, IsUnderPostmaster, MyDatabaseId, pgstat_prep_database_pending(), pgstat_track_counts, PROCSIG_RECOVERY_CONFLICT_BUFFERPIN, PROCSIG_RECOVERY_CONFLICT_DATABASE, PROCSIG_RECOVERY_CONFLICT_LOCK, PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT, PROCSIG_RECOVERY_CONFLICT_SNAPSHOT, PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK, and PROCSIG_RECOVERY_CONFLICT_TABLESPACE.

Referenced by ProcessRecoveryConflictInterrupt().

◆ pgstat_report_replslot()

void pgstat_report_replslot ( struct ReplicationSlot slot,
const PgStat_StatReplSlotEntry repSlotStat 
)

Definition at line 78 of file pgstat_replslot.c.

79 {
80  PgStat_EntryRef *entry_ref;
81  PgStatShared_ReplSlot *shstatent;
82  PgStat_StatReplSlotEntry *statent;
83 
85  ReplicationSlotIndex(slot), false);
86  shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats;
87  statent = &shstatent->stats;
88 
89  /* Update the replication slot statistics */
90 #define REPLSLOT_ACC(fld) statent->fld += repSlotStat->fld
91  REPLSLOT_ACC(spill_txns);
92  REPLSLOT_ACC(spill_count);
93  REPLSLOT_ACC(spill_bytes);
94  REPLSLOT_ACC(stream_txns);
95  REPLSLOT_ACC(stream_count);
96  REPLSLOT_ACC(stream_bytes);
97  REPLSLOT_ACC(total_txns);
98  REPLSLOT_ACC(total_bytes);
99 #undef REPLSLOT_ACC
100 
101  pgstat_unlock_entry(entry_ref);
102 }
#define REPLSLOT_ACC(fld)

References InvalidOid, pgstat_get_entry_ref_locked(), PGSTAT_KIND_REPLSLOT, pgstat_unlock_entry(), ReplicationSlotIndex(), REPLSLOT_ACC, PgStat_EntryRef::shared_stats, and PgStatShared_ReplSlot::stats.

Referenced by UpdateDecodingStats().

◆ pgstat_report_stat()

long pgstat_report_stat ( bool  force)

Definition at line 660 of file pgstat.c.

662 {
663  static TimestampTz pending_since = 0;
664  static TimestampTz last_flush = 0;
665  bool partial_flush;
667  bool nowait;
668 
671 
672  /* "absorb" the forced flush even if there's nothing to flush */
674  {
675  force = true;
676  pgStatForceNextFlush = false;
677  }
678 
679  /* Don't expend a clock check if nothing to do */
681  {
682  bool do_flush = false;
683 
684  /* Check for pending fixed-numbered stats */
685  for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++)
686  {
687  const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
688 
689  if (!kind_info)
690  continue;
691  if (!kind_info->fixed_amount)
692  {
693  Assert(kind_info->have_fixed_pending_cb == NULL);
694  continue;
695  }
696  if (!kind_info->have_fixed_pending_cb)
697  continue;
698 
699  if (kind_info->have_fixed_pending_cb())
700  {
701  do_flush = true;
702  break;
703  }
704  }
705 
706  if (!do_flush)
707  {
708  Assert(pending_since == 0);
709  return 0;
710  }
711  }
712 
713  /*
714  * There should never be stats to report once stats are shut down. Can't
715  * assert that before the checks above, as there is an unconditional
716  * pgstat_report_stat() call in pgstat_shutdown_hook() - which at least
717  * the process that ran pgstat_before_server_shutdown() will still call.
718  */
720 
721  if (force)
722  {
723  /*
724  * Stats reports are forced either when it's been too long since stats
725  * have been reported or in processes that force stats reporting to
726  * happen at specific points (including shutdown). In the former case
727  * the transaction stop time might be quite old, in the latter it
728  * would never get cleared.
729  */
731  }
732  else
733  {
735 
736  if (pending_since > 0 &&
738  {
739  /* don't keep pending updates longer than PGSTAT_MAX_INTERVAL */
740  force = true;
741  }
742  else if (last_flush > 0 &&
744  {
745  /* don't flush too frequently */
746  if (pending_since == 0)
747  pending_since = now;
748 
749  return PGSTAT_IDLE_INTERVAL;
750  }
751  }
752 
754 
755  /* don't wait for lock acquisition when !force */
756  nowait = !force;
757 
758  partial_flush = false;
759 
760  /* flush database / relation / function / ... stats */
761  partial_flush |= pgstat_flush_pending_entries(nowait);
762 
763  /* flush of fixed-numbered stats */
764  for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++)
765  {
766  const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
767 
768  if (!kind_info)
769  continue;
770  if (!kind_info->fixed_amount)
771  {
772  Assert(kind_info->flush_fixed_cb == NULL);
773  continue;
774  }
775  if (!kind_info->flush_fixed_cb)
776  continue;
777 
778  partial_flush |= kind_info->flush_fixed_cb(nowait);
779  }
780 
781  last_flush = now;
782 
783  /*
784  * If some of the pending stats could not be flushed due to lock
785  * contention, let the caller know when to retry.
786  */
787  if (partial_flush)
788  {
789  /* force should have prevented us from getting here */
790  Assert(!force);
791 
792  /* remember since when stats have been pending */
793  if (pending_since == 0)
794  pending_since = now;
795 
796  return PGSTAT_IDLE_INTERVAL;
797  }
798 
799  pending_since = 0;
800 
801  return 0;
bool TimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time, int msec)
Definition: timestamp.c:1780
static bool dlist_is_empty(const dlist_head *head)
Definition: ilist.h:336
#define PGSTAT_MIN_INTERVAL
Definition: pgstat.c:126
static bool pgstat_flush_pending_entries(bool nowait)
Definition: pgstat.c:1334
static dlist_head pgStatPending
Definition: pgstat.c:237
#define PGSTAT_MAX_INTERVAL
Definition: pgstat.c:128
#define PGSTAT_IDLE_INTERVAL
Definition: pgstat.c:130
void pgstat_update_dbstats(TimestampTz ts)
bool(* have_fixed_pending_cb)(void)
bool(* flush_fixed_cb)(bool nowait)
bool IsTransactionOrTransactionBlock(void)
Definition: xact.c:4982
TimestampTz GetCurrentTransactionStopTimestamp(void)
Definition: xact.c:890

References Assert, dlist_is_empty(), PgStat_KindInfo::fixed_amount, PgStat_KindInfo::flush_fixed_cb, GetCurrentTimestamp(), GetCurrentTransactionStopTimestamp(), PgStat_KindInfo::have_fixed_pending_cb, PgStat_ShmemControl::is_shutdown, IsTransactionOrTransactionBlock(), now(), pgstat_assert_is_up, pgstat_flush_pending_entries(), pgstat_get_kind_info(), PGSTAT_IDLE_INTERVAL, PgStat_Kind, PGSTAT_KIND_MAX, PGSTAT_KIND_MIN, PGSTAT_MAX_INTERVAL, PGSTAT_MIN_INTERVAL, pgstat_update_dbstats(), pgStatForceNextFlush, pgStatLocal, pgStatPending, PgStat_LocalState::shmem, and TimestampDifferenceExceeds().

Referenced by AllTablesyncsReady(), apply_handle_commit_internal(), apply_handle_commit_prepared(), apply_handle_prepare(), apply_handle_rollback_prepared(), apply_handle_stream_prepare(), LogicalRepApplyLoop(), LogicalRepSyncTableStart(), pg_attribute_noreturn(), pgstat_before_server_shutdown(), pgstat_shutdown_hook(), PostgresMain(), process_syncing_tables_for_apply(), process_syncing_tables_for_sync(), ProcessInterrupts(), standby_redo(), and worker_spi_main().

◆ pgstat_report_subscription_conflict()

void pgstat_report_subscription_conflict ( Oid  subid,
ConflictType  type 
)

Definition at line 46 of file pgstat_subscription.c.

47 {
48  PgStat_EntryRef *entry_ref;
49  PgStat_BackendSubEntry *pending;
50 
52  InvalidOid, subid, NULL);
53  pending = entry_ref->pending;
54  pending->conflict_count[type]++;
55 }
PgStat_EntryRef * pgstat_prep_pending_entry(PgStat_Kind kind, Oid dboid, uint64 objid, bool *created_entry)
Definition: pgstat.c:1259
PgStat_Counter conflict_count[CONFLICT_NUM_TYPES]
Definition: pgstat.h:169
const char * type

References PgStat_BackendSubEntry::conflict_count, InvalidOid, PgStat_EntryRef::pending, PGSTAT_KIND_SUBSCRIPTION, pgstat_prep_pending_entry(), and type.

Referenced by ReportApplyConflict().

◆ pgstat_report_subscription_error()

void pgstat_report_subscription_error ( Oid  subid,
bool  is_apply_error 
)

Definition at line 27 of file pgstat_subscription.c.

28 {
29  PgStat_EntryRef *entry_ref;
30  PgStat_BackendSubEntry *pending;
31 
33  InvalidOid, subid, NULL);
34  pending = entry_ref->pending;
35 
36  if (is_apply_error)
37  pending->apply_error_count++;
38  else
39  pending->sync_error_count++;
40 }
PgStat_Counter apply_error_count
Definition: pgstat.h:167
PgStat_Counter sync_error_count
Definition: pgstat.h:168

References PgStat_BackendSubEntry::apply_error_count, InvalidOid, PgStat_EntryRef::pending, PGSTAT_KIND_SUBSCRIPTION, pgstat_prep_pending_entry(), and PgStat_BackendSubEntry::sync_error_count.

Referenced by DisableSubscriptionAndExit(), start_apply(), and start_table_sync().

◆ pgstat_report_vacuum()

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

Definition at line 211 of file pgstat_relation.c.

213 {
214  PgStat_EntryRef *entry_ref;
215  PgStatShared_Relation *shtabentry;
216  PgStat_StatTabEntry *tabentry;
217  Oid dboid = (shared ? InvalidOid : MyDatabaseId);
218  TimestampTz ts;
219 
220  if (!pgstat_track_counts)
221  return;
222 
223  /* Store the data in the table's hash table entry. */
224  ts = GetCurrentTimestamp();
225 
226  /* block acquiring lock for the same reason as pgstat_report_autovac() */
228  dboid, tableoid, false);
229 
230  shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats;
231  tabentry = &shtabentry->stats;
232 
233  tabentry->live_tuples = livetuples;
234  tabentry->dead_tuples = deadtuples;
235 
236  /*
237  * It is quite possible that a non-aggressive VACUUM ended up skipping
238  * various pages, however, we'll zero the insert counter here regardless.
239  * It's currently used only to track when we need to perform an "insert"
240  * autovacuum, which are mainly intended to freeze newly inserted tuples.
241  * Zeroing this may just mean we'll not try to vacuum the table again
242  * until enough tuples have been inserted to trigger another insert
243  * autovacuum. An anti-wraparound autovacuum will catch any persistent
244  * stragglers.
245  */
246  tabentry->ins_since_vacuum = 0;
247 
249  {
250  tabentry->last_autovacuum_time = ts;
251  tabentry->autovacuum_count++;
252  }
253  else
254  {
255  tabentry->last_vacuum_time = ts;
256  tabentry->vacuum_count++;
257  }
258 
259  pgstat_unlock_entry(entry_ref);
260 
261  /*
262  * Flush IO statistics now. pgstat_report_stat() will flush IO stats,
263  * however this will not be called until after an entire autovacuum cycle
264  * is done -- which will likely vacuum many relations -- or until the
265  * VACUUM command has processed all tables and committed.
266  */
267  pgstat_flush_io(false);
268 }
PgStat_Counter vacuum_count
Definition: pgstat.h:457
PgStat_Counter ins_since_vacuum
Definition: pgstat.h:451
TimestampTz last_autovacuum_time
Definition: pgstat.h:458
PgStat_Counter autovacuum_count
Definition: pgstat.h:459
TimestampTz last_vacuum_time
Definition: pgstat.h:456

References AmAutoVacuumWorkerProcess, PgStat_StatTabEntry::autovacuum_count, PgStat_StatTabEntry::dead_tuples, GetCurrentTimestamp(), if(), PgStat_StatTabEntry::ins_since_vacuum, InvalidOid, PgStat_StatTabEntry::last_autovacuum_time, PgStat_StatTabEntry::last_vacuum_time, PgStat_StatTabEntry::live_tuples, MyDatabaseId, pgstat_flush_io(), pgstat_get_entry_ref_locked(), PGSTAT_KIND_RELATION, pgstat_track_counts, pgstat_unlock_entry(), PgStat_EntryRef::shared_stats, PgStatShared_Relation::stats, and PgStat_StatTabEntry::vacuum_count.

Referenced by heap_vacuum_rel().

◆ pgstat_report_wal()

void pgstat_report_wal ( bool  force)

Definition at line 48 of file pgstat_wal.c.

49 {
50  bool nowait;
51 
52  /* like in pgstat.c, don't wait for lock acquisition when !force */
53  nowait = !force;
54 
55  /* flush wal stats */
56  pgstat_flush_wal(nowait);
57 
58  /* flush IO stats */
59  pgstat_flush_io(nowait);
60 }
void pgstat_flush_wal(bool nowait)
Definition: pgstat_wal.c:78

References pgstat_flush_io(), and pgstat_flush_wal().

Referenced by BackgroundWriterMain(), CheckpointerMain(), HandleCheckpointerInterrupts(), and WalWriterMain().

◆ pgstat_reset()

void pgstat_reset ( PgStat_Kind  kind,
Oid  dboid,
uint64  objid 
)

Definition at line 848 of file pgstat.c.

850 {
851  const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
853 
854  /* not needed atm, and doesn't make sense with the current signature */
855  Assert(!pgstat_get_kind_info(kind)->fixed_amount);
856 
857  /* reset the "single counter" */
858  pgstat_reset_entry(kind, dboid, objid, ts);
859 
860  if (!kind_info->accessed_across_databases)
void pgstat_reset_database_timestamp(Oid dboid, TimestampTz ts)
bool accessed_across_databases

References PgStat_KindInfo::accessed_across_databases, Assert, GetCurrentTimestamp(), pgstat_get_kind_info(), pgstat_reset_database_timestamp(), and pgstat_reset_entry().

Referenced by pg_stat_reset_single_function_counters(), pg_stat_reset_single_table_counters(), pg_stat_reset_subscription_stats(), pgstat_create_transactional(), and pgstat_reset_replslot().

◆ pgstat_reset_counters()

void pgstat_reset_counters ( void  )

Definition at line 829 of file pgstat.c.

831 {
833 
836  ts);
static bool match_db_entries(PgStatShared_HashEntry *entry, Datum match_data)
Definition: pgstat.c:817
void pgstat_reset_matching_entries(bool(*do_reset)(PgStatShared_HashEntry *, Datum), Datum match_data, TimestampTz ts)
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:252

References GetCurrentTimestamp(), match_db_entries(), MyDatabaseId, ObjectIdGetDatum(), and pgstat_reset_matching_entries().

Referenced by pg_stat_reset().

◆ pgstat_reset_of_kind()

void pgstat_reset_of_kind ( PgStat_Kind  kind)

Definition at line 870 of file pgstat.c.

872 {
873  const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
875 
876  if (kind_info->fixed_amount)
877  kind_info->reset_all_cb(ts);
878  else
void pgstat_reset_entries_of_kind(PgStat_Kind kind, TimestampTz ts)
void(* reset_all_cb)(TimestampTz ts)

References PgStat_KindInfo::fixed_amount, GetCurrentTimestamp(), pgstat_get_kind_info(), pgstat_reset_entries_of_kind(), and PgStat_KindInfo::reset_all_cb.

Referenced by pg_stat_reset_replication_slot(), pg_stat_reset_shared(), pg_stat_reset_slru(), and pg_stat_reset_subscription_stats().

◆ pgstat_reset_replslot()

void pgstat_reset_replslot ( const char *  name)

Definition at line 42 of file pgstat_replslot.c.

43 {
44  ReplicationSlot *slot;
45 
46  Assert(name != NULL);
47 
48  LWLockAcquire(ReplicationSlotControlLock, LW_SHARED);
49 
50  /* Check if the slot exits with the given name. */
51  slot = SearchNamedReplicationSlot(name, false);
52 
53  if (!slot)
54  ereport(ERROR,
55  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
56  errmsg("replication slot \"%s\" does not exist",
57  name)));
58 
59  /*
60  * Reset stats if it is a logical slot. Nothing to do for physical slots
61  * as we collect stats only for logical slots.
62  */
63  if (SlotIsLogical(slot))
65  ReplicationSlotIndex(slot));
66 
67  LWLockRelease(ReplicationSlotControlLock);
68 }
void pgstat_reset(PgStat_Kind kind, Oid dboid, uint64 objid)
Definition: pgstat.c:848
ReplicationSlot * SearchNamedReplicationSlot(const char *name, bool need_lock)
Definition: slot.c:464
#define SlotIsLogical(slot)
Definition: slot.h:213

References Assert, ereport, errcode(), errmsg(), ERROR, InvalidOid, LW_SHARED, LWLockAcquire(), LWLockRelease(), name, PGSTAT_KIND_REPLSLOT, pgstat_reset(), ReplicationSlotIndex(), SearchNamedReplicationSlot(), and SlotIsLogical.

Referenced by pg_stat_reset_replication_slot().

◆ pgstat_reset_slru()

void pgstat_reset_slru ( const char *  name)

Definition at line 45 of file pgstat_slru.c.

46 {
48 
49  Assert(name != NULL);
50 
52 }
int pgstat_get_slru_index(const char *name)
Definition: pgstat_slru.c:132
static void pgstat_reset_slru_counter_internal(int index, TimestampTz ts)
Definition: pgstat_slru.c:255

References Assert, GetCurrentTimestamp(), name, pgstat_get_slru_index(), and pgstat_reset_slru_counter_internal().

Referenced by pg_stat_reset_slru().

◆ pgstat_restore_stats()

void pgstat_restore_stats ( XLogRecPtr  redo)

Definition at line 477 of file pgstat.c.

479 {
480  pgstat_read_statsfile(redo);
static void pgstat_read_statsfile(XLogRecPtr redo)
Definition: pgstat.c:1735

References pgstat_read_statsfile().

Referenced by StartupXLOG().

◆ pgstat_tracks_io_bktype()

bool pgstat_tracks_io_bktype ( BackendType  bktype)

Definition at line 346 of file pgstat_io.c.

347 {
348  /*
349  * List every type so that new backend types trigger a warning about
350  * needing to adjust this switch.
351  */
352  switch (bktype)
353  {
354  case B_INVALID:
355  case B_ARCHIVER:
356  case B_LOGGER:
357  case B_WAL_RECEIVER:
358  case B_WAL_WRITER:
359  case B_WAL_SUMMARIZER:
360  return false;
361 
362  case B_AUTOVAC_LAUNCHER:
363  case B_AUTOVAC_WORKER:
364  case B_BACKEND:
365  case B_BG_WORKER:
366  case B_BG_WRITER:
367  case B_CHECKPOINTER:
368  case B_SLOTSYNC_WORKER:
370  case B_STARTUP:
371  case B_WAL_SENDER:
372  return true;
373  }
374 
375  return false;
376 }
@ B_WAL_SUMMARIZER
Definition: miscadmin.h:357
@ B_WAL_WRITER
Definition: miscadmin.h:358
@ B_WAL_RECEIVER
Definition: miscadmin.h:356
@ B_CHECKPOINTER
Definition: miscadmin.h:354
@ B_WAL_SENDER
Definition: miscadmin.h:339
@ B_LOGGER
Definition: miscadmin.h:364
@ B_STARTUP
Definition: miscadmin.h:355
@ B_BG_WORKER
Definition: miscadmin.h:338
@ B_INVALID
Definition: miscadmin.h:332
@ B_STANDALONE_BACKEND
Definition: miscadmin.h:342
@ B_BG_WRITER
Definition: miscadmin.h:353
@ B_BACKEND
Definition: miscadmin.h:335
@ B_ARCHIVER
Definition: miscadmin.h:352
@ B_AUTOVAC_LAUNCHER
Definition: miscadmin.h:336
@ B_SLOTSYNC_WORKER
Definition: miscadmin.h:340
@ B_AUTOVAC_WORKER
Definition: miscadmin.h:337

References B_ARCHIVER, B_AUTOVAC_LAUNCHER, B_AUTOVAC_WORKER, B_BACKEND, B_BG_WORKER, B_BG_WRITER, B_CHECKPOINTER, B_INVALID, B_LOGGER, B_SLOTSYNC_WORKER, B_STANDALONE_BACKEND, B_STARTUP, B_WAL_RECEIVER, B_WAL_SENDER, B_WAL_SUMMARIZER, and B_WAL_WRITER.

Referenced by pg_stat_get_io(), and pgstat_tracks_io_object().

◆ pgstat_tracks_io_object()

bool pgstat_tracks_io_object ( BackendType  bktype,
IOObject  io_object,
IOContext  io_context 
)

Definition at line 386 of file pgstat_io.c.

388 {
389  bool no_temp_rel;
390 
391  /*
392  * Some BackendTypes should never track IO statistics.
393  */
394  if (!pgstat_tracks_io_bktype(bktype))
395  return false;
396 
397  /*
398  * Currently, IO on temporary relations can only occur in the
399  * IOCONTEXT_NORMAL IOContext.
400  */
401  if (io_context != IOCONTEXT_NORMAL &&
402  io_object == IOOBJECT_TEMP_RELATION)
403  return false;
404 
405  /*
406  * In core Postgres, only regular backends and WAL Sender processes
407  * executing queries will use local buffers and operate on temporary
408  * relations. Parallel workers will not use local buffers (see
409  * InitLocalBuffers()); however, extensions leveraging background workers
410  * have no such limitation, so track IO on IOOBJECT_TEMP_RELATION for
411  * BackendType B_BG_WORKER.
412  */
413  no_temp_rel = bktype == B_AUTOVAC_LAUNCHER || bktype == B_BG_WRITER ||
414  bktype == B_CHECKPOINTER || bktype == B_AUTOVAC_WORKER ||
415  bktype == B_STANDALONE_BACKEND || bktype == B_STARTUP;
416 
417  if (no_temp_rel && io_context == IOCONTEXT_NORMAL &&
418  io_object == IOOBJECT_TEMP_RELATION)
419  return false;
420 
421  /*
422  * Some BackendTypes do not currently perform any IO in certain
423  * IOContexts, and, while it may not be inherently incorrect for them to
424  * do so, excluding those rows from the view makes the view easier to use.
425  */
426  if ((bktype == B_CHECKPOINTER || bktype == B_BG_WRITER) &&
427  (io_context == IOCONTEXT_BULKREAD ||
428  io_context == IOCONTEXT_BULKWRITE ||
429  io_context == IOCONTEXT_VACUUM))
430  return false;
431 
432  if (bktype == B_AUTOVAC_LAUNCHER && io_context == IOCONTEXT_VACUUM)
433  return false;
434 
435  if ((bktype == B_AUTOVAC_WORKER || bktype == B_AUTOVAC_LAUNCHER) &&
436  io_context == IOCONTEXT_BULKWRITE)
437  return false;
438 
439  return true;
440 }
bool pgstat_tracks_io_bktype(BackendType bktype)
Definition: pgstat_io.c:346

References B_AUTOVAC_LAUNCHER, B_AUTOVAC_WORKER, B_BG_WRITER, B_CHECKPOINTER, B_STANDALONE_BACKEND, B_STARTUP, IOCONTEXT_BULKREAD, IOCONTEXT_BULKWRITE, IOCONTEXT_NORMAL, IOCONTEXT_VACUUM, IOOBJECT_TEMP_RELATION, and pgstat_tracks_io_bktype().

Referenced by pg_stat_get_io(), and pgstat_tracks_io_op().

◆ pgstat_tracks_io_op()

bool pgstat_tracks_io_op ( BackendType  bktype,
IOObject  io_object,
IOContext  io_context,
IOOp  io_op 
)

Definition at line 451 of file pgstat_io.c.

453 {
454  bool strategy_io_context;
455 
456  /* if (io_context, io_object) will never collect stats, we're done */
457  if (!pgstat_tracks_io_object(bktype, io_object, io_context))
458  return false;
459 
460  /*
461  * Some BackendTypes will not do certain IOOps.
462  */
463  if ((bktype == B_BG_WRITER || bktype == B_CHECKPOINTER) &&
464  (io_op == IOOP_READ || io_op == IOOP_EVICT || io_op == IOOP_HIT))
465  return false;
466 
467  if ((bktype == B_AUTOVAC_LAUNCHER || bktype == B_BG_WRITER ||
468  bktype == B_CHECKPOINTER) && io_op == IOOP_EXTEND)
469  return false;
470 
471  /*
472  * Temporary tables are not logged and thus do not require fsync'ing.
473  * Writeback is not requested for temporary tables.
474  */
475  if (io_object == IOOBJECT_TEMP_RELATION &&
476  (io_op == IOOP_FSYNC || io_op == IOOP_WRITEBACK))
477  return false;
478 
479  /*
480  * Some IOOps are not valid in certain IOContexts and some IOOps are only
481  * valid in certain contexts.
482  */
483  if (io_context == IOCONTEXT_BULKREAD && io_op == IOOP_EXTEND)
484  return false;
485 
486  strategy_io_context = io_context == IOCONTEXT_BULKREAD ||
487  io_context == IOCONTEXT_BULKWRITE || io_context == IOCONTEXT_VACUUM;
488 
489  /*
490  * IOOP_REUSE is only relevant when a BufferAccessStrategy is in use.
491  */
492  if (!strategy_io_context && io_op == IOOP_REUSE)
493  return false;
494 
495  /*
496  * IOOP_FSYNC IOOps done by a backend using a BufferAccessStrategy are
497  * counted in the IOCONTEXT_NORMAL IOContext. See comment in
498  * register_dirty_segment() for more details.
499  */
500  if (strategy_io_context && io_op == IOOP_FSYNC)
501  return false;
502 
503 
504  return true;
505 }
bool pgstat_tracks_io_object(BackendType bktype, IOObject io_object, IOContext io_context)
Definition: pgstat_io.c:386

References B_AUTOVAC_LAUNCHER, B_BG_WRITER, B_CHECKPOINTER, IOCONTEXT_BULKREAD, IOCONTEXT_BULKWRITE, IOCONTEXT_VACUUM, IOOBJECT_TEMP_RELATION, IOOP_EVICT, IOOP_EXTEND, IOOP_FSYNC, IOOP_HIT, IOOP_READ, IOOP_REUSE, IOOP_WRITEBACK, and pgstat_tracks_io_object().

Referenced by pg_stat_get_io(), pgstat_bktype_io_stats_valid(), and pgstat_count_io_op_n().

◆ pgstat_twophase_postabort()

void pgstat_twophase_postabort ( TransactionId  xid,
uint16  info,
void *  recdata,
uint32  len 
)

Definition at line 769 of file pgstat_relation.c.

771 {
772  TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata;
773  PgStat_TableStatus *pgstat_info;
774 
775  /* Find or create a tabstat entry for the rel */
776  pgstat_info = pgstat_prep_relation_pending(rec->id, rec->shared);
777 
778  /* Same math as in AtEOXact_PgStat, abort case */
779  if (rec->truncdropped)
780  {
784  }
785  pgstat_info->counts.tuples_inserted += rec->tuples_inserted;
786  pgstat_info->counts.tuples_updated += rec->tuples_updated;
787  pgstat_info->counts.tuples_deleted += rec->tuples_deleted;
788  pgstat_info->counts.delta_dead_tuples +=
789  rec->tuples_inserted + rec->tuples_updated;
790 }
PgStat_Counter deleted_pre_truncdrop
PgStat_Counter inserted_pre_truncdrop
PgStat_Counter updated_pre_truncdrop
PgStat_Counter tuples_deleted
PgStat_Counter tuples_inserted
PgStat_Counter tuples_updated

References PgStat_TableStatus::counts, TwoPhasePgStatRecord::deleted_pre_truncdrop, PgStat_TableCounts::delta_dead_tuples, TwoPhasePgStatRecord::id, TwoPhasePgStatRecord::inserted_pre_truncdrop, pgstat_prep_relation_pending(), TwoPhasePgStatRecord::shared, TwoPhasePgStatRecord::truncdropped, TwoPhasePgStatRecord::tuples_deleted, PgStat_TableCounts::tuples_deleted, TwoPhasePgStatRecord::tuples_inserted, PgStat_TableCounts::tuples_inserted, TwoPhasePgStatRecord::tuples_updated, PgStat_TableCounts::tuples_updated, and TwoPhasePgStatRecord::updated_pre_truncdrop.

◆ pgstat_twophase_postcommit()

void pgstat_twophase_postcommit ( TransactionId  xid,
uint16  info,
void *  recdata,
uint32  len 
)

Definition at line 733 of file pgstat_relation.c.

735 {
736  TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata;
737  PgStat_TableStatus *pgstat_info;
738 
739  /* Find or create a tabstat entry for the rel */
740  pgstat_info = pgstat_prep_relation_pending(rec->id, rec->shared);
741 
742  /* Same math as in AtEOXact_PgStat, commit case */
743  pgstat_info->counts.tuples_inserted += rec->tuples_inserted;
744  pgstat_info->counts.tuples_updated += rec->tuples_updated;
745  pgstat_info->counts.tuples_deleted += rec->tuples_deleted;
746  pgstat_info->counts.truncdropped = rec->truncdropped;
747  if (rec->truncdropped)
748  {
749  /* forget live/dead stats seen by backend thus far */
750  pgstat_info->counts.delta_live_tuples = 0;
751  pgstat_info->counts.delta_dead_tuples = 0;
752  }
753  pgstat_info->counts.delta_live_tuples +=
754  rec->tuples_inserted - rec->tuples_deleted;
755  pgstat_info->counts.delta_dead_tuples +=
756  rec->tuples_updated + rec->tuples_deleted;
757  pgstat_info->counts.changed_tuples +=
758  rec->tuples_inserted + rec->tuples_updated +
759  rec->tuples_deleted;
760 }
PgStat_Counter delta_live_tuples
Definition: pgstat.h:206
PgStat_Counter changed_tuples
Definition: pgstat.h:208

References PgStat_TableCounts::changed_tuples, PgStat_TableStatus::counts, PgStat_TableCounts::delta_dead_tuples, PgStat_TableCounts::delta_live_tuples, TwoPhasePgStatRecord::id, pgstat_prep_relation_pending(), TwoPhasePgStatRecord::shared, TwoPhasePgStatRecord::truncdropped, PgStat_TableCounts::truncdropped, TwoPhasePgStatRecord::tuples_deleted, PgStat_TableCounts::tuples_deleted, TwoPhasePgStatRecord::tuples_inserted, PgStat_TableCounts::tuples_inserted, TwoPhasePgStatRecord::tuples_updated, and PgStat_TableCounts::tuples_updated.

◆ pgstat_unlink_relation()

void pgstat_unlink_relation ( Relation  rel)

Definition at line 153 of file pgstat_relation.c.

154 {
155  /* remove the link to stats info if any */
156  if (rel->pgstat_info == NULL)
157  return;
158 
159  /* link sanity check */
160  Assert(rel->pgstat_info->relation == rel);
161  rel->pgstat_info->relation = NULL;
162  rel->pgstat_info = NULL;
163 }

References Assert, RelationData::pgstat_info, and PgStat_TableStatus::relation.

Referenced by pgstat_init_relation(), pgstat_relation_delete_pending_cb(), and RelationDestroyRelation().

◆ pgstat_update_heap_dead_tuples()

void pgstat_update_heap_dead_tuples ( Relation  rel,
int  delta 
)

Definition at line 439 of file pgstat_relation.c.

440 {
442  {
443  PgStat_TableStatus *pgstat_info = rel->pgstat_info;
444 
445  pgstat_info->counts.delta_dead_tuples -= delta;
446  }
447 }

References PgStat_TableStatus::counts, PgStat_TableCounts::delta_dead_tuples, RelationData::pgstat_info, and pgstat_should_count_relation.

Referenced by heap_page_prune_opt().

◆ PostPrepare_PgStat()

void PostPrepare_PgStat ( void  )

Definition at line 211 of file pgstat_xact.c.

212 {
213  PgStat_SubXactStatus *xact_state;
214 
215  /*
216  * We don't bother to free any of the transactional state, since it's all
217  * in TopTransactionContext and will go away anyway.
218  */
219  xact_state = pgStatXactStack;
220  if (xact_state != NULL)
221  {
222  Assert(xact_state->nest_level == 1);
223  Assert(xact_state->prev == NULL);
224 
225  PostPrepare_PgStat_Relations(xact_state);
226  }
227  pgStatXactStack = NULL;
228 
229  /* Make sure any stats snapshot is thrown away */
231 }
void PostPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state)

References Assert, PgStat_SubXactStatus::nest_level, pgstat_clear_snapshot(), pgStatXactStack, PostPrepare_PgStat_Relations(), and PgStat_SubXactStatus::prev.

Referenced by PrepareTransaction().

◆ StatsShmemInit()

void StatsShmemInit ( void  )

Definition at line 156 of file pgstat_shmem.c.

157 {
158  bool found;
159  Size sz;
160 
161  sz = StatsShmemSize();
163  ShmemInitStruct("Shared Memory Stats", sz, &found);
164 
165  if (!IsUnderPostmaster)
166  {
167  dsa_area *dsa;
168  dshash_table *dsh;
170  char *p = (char *) ctl;
171 
172  Assert(!found);
173 
174  /* the allocation of pgStatLocal.shmem itself */
175  p += MAXALIGN(sizeof(PgStat_ShmemControl));
176 
177  /*
178  * Create a small dsa allocation in plain shared memory. This is
179  * required because postmaster cannot use dsm segments. It also
180  * provides a small efficiency win.
181  */
182  ctl->raw_dsa_area = p;
184  dsa = dsa_create_in_place(ctl->raw_dsa_area,
187  dsa_pin(dsa);
188 
189  /*
190  * To ensure dshash is created in "plain" shared memory, temporarily
191  * limit size of dsa to the initial size of the dsa.
192  */
194 
195  /*
196  * With the limit in place, create the dshash table. XXX: It'd be nice
197  * if there were dshash_create_in_place().
198  */
199  dsh = dshash_create(dsa, &dsh_params, NULL);
200  ctl->hash_handle = dshash_get_hash_table_handle(dsh);
201 
202  /* lift limit set above */
203  dsa_set_size_limit(dsa, -1);
204 
205  /*
206  * Postmaster will never access these again, thus free the local
207  * dsa/dshash references.
208  */
209  dshash_detach(dsh);
210  dsa_detach(dsa);
211 
212  pg_atomic_init_u64(&ctl->gc_request_count, 1);
213 
214  /* initialize fixed-numbered stats */
215  for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++)
216  {
217  const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
218  char *ptr;
219 
220  if (!kind_info || !kind_info->fixed_amount)
221  continue;
222 
223  if (pgstat_is_kind_builtin(kind))
224  ptr = ((char *) ctl) + kind_info->shared_ctl_off;
225  else
226  {
227  int idx = kind - PGSTAT_KIND_CUSTOM_MIN;
228 
229  Assert(kind_info->shared_size != 0);
230  ctl->custom_data[idx] = ShmemAlloc(kind_info->shared_size);
231  ptr = ctl->custom_data[idx];
232  }
233 
234  kind_info->init_shmem_cb(ptr);
235  }
236  }
237  else
238  {
239  Assert(found);
240  }
241 }
static void pg_atomic_init_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
Definition: atomics.h:453
#define MAXALIGN(LEN)
Definition: c.h:814
size_t Size
Definition: c.h:608
void dsa_set_size_limit(dsa_area *area, size_t limit)
Definition: dsa.c:1018
void dsa_detach(dsa_area *area)
Definition: dsa.c:1952
void dsa_pin(dsa_area *area)
Definition: dsa.c:975
#define dsa_create_in_place(place, size, tranch_id, segment)
Definition: dsa.h:122
void dshash_detach(dshash_table *hash_table)
Definition: dshash.c:307
dshash_table_handle dshash_get_hash_table_handle(dshash_table *hash_table)
Definition: dshash.c:367
dshash_table * dshash_create(dsa_area *area, const dshash_parameters *params, void *arg)
Definition: dshash.c:206
@ LWTRANCHE_PGSTATS_DSA
Definition: lwlock.h:203
static bool pgstat_is_kind_builtin(PgStat_Kind kind)
Definition: pgstat.h:80
static Size pgstat_dsa_init_size(void)
Definition: pgstat_shmem.c:106
Size StatsShmemSize(void)
Definition: pgstat_shmem.c:127
static const dshash_parameters dsh_params
Definition: pgstat_shmem.c:62
tree ctl
Definition: radixtree.h:1853
void * ShmemAlloc(Size size)
Definition: shmem.c:152
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition: shmem.c:387
void(* init_shmem_cb)(void *stats)
Definition: dsa.c:348

References Assert, ctl, dsa_create_in_place, dsa_detach(), dsa_pin(), dsa_set_size_limit(), dsh_params, dshash_create(), dshash_detach(), dshash_get_hash_table_handle(), PgStat_KindInfo::fixed_amount, idx(), PgStat_KindInfo::init_shmem_cb, IsUnderPostmaster, LWTRANCHE_PGSTATS_DSA, MAXALIGN, pg_atomic_init_u64(), pgstat_dsa_init_size(), pgstat_get_kind_info(), pgstat_is_kind_builtin(), PgStat_Kind, PGSTAT_KIND_CUSTOM_MIN, PGSTAT_KIND_MAX, PGSTAT_KIND_MIN, pgStatLocal, PgStat_KindInfo::shared_ctl_off, PgStat_KindInfo::shared_size, PgStat_LocalState::shmem, ShmemAlloc(), ShmemInitStruct(), and StatsShmemSize().

Referenced by CreateOrAttachShmemStructs().

◆ StatsShmemSize()

Size StatsShmemSize ( void  )

Definition at line 127 of file pgstat_shmem.c.

128 {
129  Size sz;
130 
131  sz = MAXALIGN(sizeof(PgStat_ShmemControl));
132  sz = add_size(sz, pgstat_dsa_init_size());
133 
134  /* Add shared memory for all the custom fixed-numbered statistics */
135  for (PgStat_Kind kind = PGSTAT_KIND_CUSTOM_MIN; kind <= PGSTAT_KIND_CUSTOM_MAX; kind++)
136  {
137  const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
138 
139  if (!kind_info)
140  continue;
141  if (!kind_info->fixed_amount)
142  continue;
143 
144  Assert(kind_info->shared_size != 0);
145 
146  sz += MAXALIGN(kind_info->shared_size);
147  }
148 
149  return sz;
150 }
Size add_size(Size s1, Size s2)
Definition: shmem.c:493

References add_size(), Assert, PgStat_KindInfo::fixed_amount, MAXALIGN, pgstat_dsa_init_size(), pgstat_get_kind_info(), PgStat_Kind, PGSTAT_KIND_CUSTOM_MAX, PGSTAT_KIND_CUSTOM_MIN, and PgStat_KindInfo::shared_size.

Referenced by CalculateShmemSize(), and StatsShmemInit().

Variable Documentation

◆ PendingBgWriterStats

PGDLLIMPORT PgStat_BgWriterStats PendingBgWriterStats
extern

Definition at line 23 of file pgstat_bgwriter.c.

Referenced by BgBufferSync(), and pgstat_report_bgwriter().

◆ PendingCheckpointerStats

◆ PendingWalStats

◆ pgstat_fetch_consistency

◆ pgstat_track_counts

◆ pgstat_track_functions

PGDLLIMPORT int pgstat_track_functions
extern

Definition at line 30 of file pgstat_function.c.

◆ pgStatActiveTime

PGDLLIMPORT PgStat_Counter pgStatActiveTime
extern

Definition at line 30 of file pgstat_database.c.

Referenced by pgstat_update_dbstats().

◆ pgStatBlockReadTime

PGDLLIMPORT PgStat_Counter pgStatBlockReadTime
extern

Definition at line 28 of file pgstat_database.c.

Referenced by do_analyze_rel(), heap_vacuum_rel(), and pgstat_update_dbstats().

◆ pgStatBlockWriteTime

PGDLLIMPORT PgStat_Counter pgStatBlockWriteTime
extern

Definition at line 29 of file pgstat_database.c.

Referenced by do_analyze_rel(), heap_vacuum_rel(), and pgstat_update_dbstats().

◆ pgStatSessionEndCause

PGDLLIMPORT SessionEndType pgStatSessionEndCause
extern

Definition at line 32 of file pgstat_database.c.

Referenced by die(), errfinish(), pgstat_report_disconnect(), and PostgresMain().

◆ pgStatTransactionIdleTime

PGDLLIMPORT PgStat_Counter pgStatTransactionIdleTime
extern

Definition at line 31 of file pgstat_database.c.

Referenced by pgstat_update_dbstats().