PostgreSQL Source Code  git master
pgstat_database.c File Reference
#include "postgres.h"
#include "utils/pgstat_internal.h"
#include "utils/timestamp.h"
#include "storage/procsignal.h"
Include dependency graph for pgstat_database.c:

Go to the source code of this file.

Macros

#define PGSTAT_ACCUM_DBCOUNT(item)    (sharedent)->stats.item += (pendingent)->item
 

Functions

static bool pgstat_should_report_connstat (void)
 
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_tempfile (size_t filesize)
 
void pgstat_report_connect (Oid dboid)
 
void pgstat_report_disconnect (Oid dboid)
 
PgStat_StatDBEntrypgstat_fetch_stat_dbentry (Oid dboid)
 
void AtEOXact_PgStat_Database (bool isCommit, bool parallel)
 
void pgstat_update_dbstats (TimestampTz ts)
 
PgStat_StatDBEntrypgstat_prep_database_pending (Oid dboid)
 
void pgstat_reset_database_timestamp (Oid dboid, TimestampTz ts)
 
bool pgstat_database_flush_cb (PgStat_EntryRef *entry_ref, bool nowait)
 
void pgstat_database_reset_timestamp_cb (PgStatShared_Common *header, TimestampTz ts)
 

Variables

PgStat_Counter pgStatBlockReadTime = 0
 
PgStat_Counter pgStatBlockWriteTime = 0
 
PgStat_Counter pgStatActiveTime = 0
 
PgStat_Counter pgStatTransactionIdleTime = 0
 
SessionEndType pgStatSessionEndCause = DISCONNECT_NORMAL
 
static int pgStatXactCommit = 0
 
static int pgStatXactRollback = 0
 
static PgStat_Counter pgLastSessionReportTime = 0
 

Macro Definition Documentation

◆ PGSTAT_ACCUM_DBCOUNT

#define PGSTAT_ACCUM_DBCOUNT (   item)     (sharedent)->stats.item += (pendingent)->item

Function Documentation

◆ AtEOXact_PgStat_Database()

void AtEOXact_PgStat_Database ( bool  isCommit,
bool  parallel 
)

Definition at line 246 of file pgstat_database.c.

247 {
248  /* Don't count parallel worker transaction stats */
249  if (!parallel)
250  {
251  /*
252  * Count transaction commit or abort. (We use counters, not just
253  * bools, in case the reporting message isn't sent right away.)
254  */
255  if (isCommit)
257  else
259  }
260 }
static int pgStatXactCommit
static int pgStatXactRollback

References pgStatXactCommit, and pgStatXactRollback.

Referenced by AtEOXact_PgStat().

◆ pgstat_database_flush_cb()

bool pgstat_database_flush_cb ( PgStat_EntryRef entry_ref,
bool  nowait 
)

Definition at line 359 of file pgstat_database.c.

360 {
361  PgStatShared_Database *sharedent;
362  PgStat_StatDBEntry *pendingent;
363 
364  pendingent = (PgStat_StatDBEntry *) entry_ref->pending;
365  sharedent = (PgStatShared_Database *) entry_ref->shared_stats;
366 
367  if (!pgstat_lock_entry(entry_ref, nowait))
368  return false;
369 
370 #define PGSTAT_ACCUM_DBCOUNT(item) \
371  (sharedent)->stats.item += (pendingent)->item
372 
373  PGSTAT_ACCUM_DBCOUNT(xact_commit);
374  PGSTAT_ACCUM_DBCOUNT(xact_rollback);
375  PGSTAT_ACCUM_DBCOUNT(blocks_fetched);
376  PGSTAT_ACCUM_DBCOUNT(blocks_hit);
377 
378  PGSTAT_ACCUM_DBCOUNT(tuples_returned);
379  PGSTAT_ACCUM_DBCOUNT(tuples_fetched);
380  PGSTAT_ACCUM_DBCOUNT(tuples_inserted);
381  PGSTAT_ACCUM_DBCOUNT(tuples_updated);
382  PGSTAT_ACCUM_DBCOUNT(tuples_deleted);
383 
384  /* last_autovac_time is reported immediately */
385  Assert(pendingent->last_autovac_time == 0);
386 
387  PGSTAT_ACCUM_DBCOUNT(conflict_tablespace);
388  PGSTAT_ACCUM_DBCOUNT(conflict_lock);
389  PGSTAT_ACCUM_DBCOUNT(conflict_snapshot);
390  PGSTAT_ACCUM_DBCOUNT(conflict_bufferpin);
391  PGSTAT_ACCUM_DBCOUNT(conflict_startup_deadlock);
392 
393  PGSTAT_ACCUM_DBCOUNT(temp_bytes);
394  PGSTAT_ACCUM_DBCOUNT(temp_files);
395  PGSTAT_ACCUM_DBCOUNT(deadlocks);
396 
397  /* checksum failures are reported immediately */
398  Assert(pendingent->checksum_failures == 0);
399  Assert(pendingent->last_checksum_failure == 0);
400 
401  PGSTAT_ACCUM_DBCOUNT(blk_read_time);
402  PGSTAT_ACCUM_DBCOUNT(blk_write_time);
403 
404  PGSTAT_ACCUM_DBCOUNT(sessions);
405  PGSTAT_ACCUM_DBCOUNT(session_time);
406  PGSTAT_ACCUM_DBCOUNT(active_time);
407  PGSTAT_ACCUM_DBCOUNT(idle_in_transaction_time);
408  PGSTAT_ACCUM_DBCOUNT(sessions_abandoned);
409  PGSTAT_ACCUM_DBCOUNT(sessions_fatal);
410  PGSTAT_ACCUM_DBCOUNT(sessions_killed);
411 #undef PGSTAT_ACCUM_DBCOUNT
412 
413  pgstat_unlock_entry(entry_ref);
414 
415  memset(pendingent, 0, sizeof(*pendingent));
416 
417  return true;
418 }
Assert(fmt[strlen(fmt) - 1] !='\n')
#define PGSTAT_ACCUM_DBCOUNT(item)
void pgstat_unlock_entry(PgStat_EntryRef *entry_ref)
Definition: pgstat_shmem.c:599
bool pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait)
Definition: pgstat_shmem.c:571
PgStatShared_Common * shared_stats
TimestampTz last_checksum_failure
Definition: pgstat.h:300
TimestampTz last_autovac_time
Definition: pgstat.h:290
PgStat_Counter checksum_failures
Definition: pgstat.h:299

References Assert(), PgStat_StatDBEntry::checksum_failures, PgStat_StatDBEntry::last_autovac_time, PgStat_StatDBEntry::last_checksum_failure, PgStat_EntryRef::pending, PGSTAT_ACCUM_DBCOUNT, pgstat_lock_entry(), pgstat_unlock_entry(), and PgStat_EntryRef::shared_stats.

◆ pgstat_database_reset_timestamp_cb()

void pgstat_database_reset_timestamp_cb ( PgStatShared_Common header,
TimestampTz  ts 
)

Definition at line 421 of file pgstat_database.c.

422 {
423  ((PgStatShared_Database *) header)->stats.stat_reset_timestamp = ts;
424 }
static void header(const char *fmt,...) pg_attribute_printf(1
Definition: pg_regress.c:208

References header().

◆ pgstat_drop_database()

void pgstat_drop_database ( Oid  databaseid)

Definition at line 44 of file pgstat_database.c.

45 {
47 }
@ PGSTAT_KIND_DATABASE
Definition: pgstat.h:41
void pgstat_drop_transactional(PgStat_Kind kind, Oid dboid, Oid objoid)
Definition: pgstat_xact.c:380
#define InvalidOid
Definition: postgres_ext.h:36

References InvalidOid, pgstat_drop_transactional(), and PGSTAT_KIND_DATABASE.

Referenced by dropdb().

◆ pgstat_fetch_stat_dbentry()

PgStat_StatDBEntry* pgstat_fetch_stat_dbentry ( Oid  dboid)

◆ pgstat_prep_database_pending()

PgStat_StatDBEntry* pgstat_prep_database_pending ( Oid  dboid)

Definition at line 323 of file pgstat_database.c.

324 {
325  PgStat_EntryRef *entry_ref;
326 
328  NULL);
329 
330  return entry_ref->pending;
331 }
PgStat_EntryRef * pgstat_prep_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid, bool *created_entry)
Definition: pgstat.c:1062

References InvalidOid, PgStat_EntryRef::pending, PGSTAT_KIND_DATABASE, and pgstat_prep_pending_entry().

Referenced by pgstat_relation_flush_cb(), pgstat_report_connect(), pgstat_report_deadlock(), pgstat_report_disconnect(), pgstat_report_recovery_conflict(), pgstat_report_tempfile(), and pgstat_update_dbstats().

◆ 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 }
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1573
bool IsUnderPostmaster
Definition: globals.c:113
PgStat_EntryRef * pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, Oid objoid, bool nowait)
Definition: pgstat_shmem.c:608
PgStat_StatDBEntry stats

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_checksum_failure()

void pgstat_report_checksum_failure ( void  )

Definition at line 163 of file pgstat_database.c.

164 {
166 }
Oid MyDatabaseId
Definition: globals.c:89
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 137 of file pgstat_database.c.

138 {
139  PgStat_EntryRef *entry_ref;
140  PgStatShared_Database *sharedent;
141 
142  if (!pgstat_track_counts)
143  return;
144 
145  /*
146  * Update the shared stats directly - checksum failures should never be
147  * common enough for that to be a problem.
148  */
149  entry_ref =
151 
152  sharedent = (PgStatShared_Database *) entry_ref->shared_stats;
153  sharedent->stats.checksum_failures += failurecount;
155 
156  pgstat_unlock_entry(entry_ref);
157 }
bool pgstat_track_counts
Definition: pgstat.c:186

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 188 of file pgstat_database.c.

189 {
190  PgStat_StatDBEntry *dbentry;
191 
193  return;
194 
196 
198  dbentry->sessions++;
199 }
TimestampTz MyStartTimestamp
Definition: globals.c:46
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:303

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 122 of file pgstat_database.c.

123 {
124  PgStat_StatDBEntry *dbent;
125 
126  if (!pgstat_track_counts)
127  return;
128 
130  dbent->deadlocks++;
131 }
PgStat_Counter deadlocks
Definition: pgstat.h:298

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

Referenced by DeadLockReport().

◆ pgstat_report_disconnect()

void pgstat_report_disconnect ( Oid  dboid)

Definition at line 205 of file pgstat_database.c.

206 {
207  PgStat_StatDBEntry *dbentry;
208 
210  return;
211 
213 
214  switch (pgStatSessionEndCause)
215  {
216  case DISCONNECT_NOT_YET:
217  case DISCONNECT_NORMAL:
218  /* we don't collect these */
219  break;
221  dbentry->sessions_abandoned++;
222  break;
223  case DISCONNECT_FATAL:
224  dbentry->sessions_fatal++;
225  break;
226  case DISCONNECT_KILLED:
227  dbentry->sessions_killed++;
228  break;
229  }
230 }
@ DISCONNECT_NOT_YET
Definition: pgstat.h:77
@ DISCONNECT_FATAL
Definition: pgstat.h:80
@ DISCONNECT_KILLED
Definition: pgstat.h:81
@ DISCONNECT_CLIENT_EOF
Definition: pgstat.h:79
@ DISCONNECT_NORMAL
Definition: pgstat.h:78
SessionEndType pgStatSessionEndCause
PgStat_Counter sessions_fatal
Definition: pgstat.h:308
PgStat_Counter sessions_abandoned
Definition: pgstat.h:307
PgStat_Counter sessions_killed
Definition: pgstat.h:309

References DISCONNECT_CLIENT_EOF, DISCONNECT_FATAL, DISCONNECT_KILLED, DISCONNECT_NORMAL, DISCONNECT_NOT_YET, MyDatabaseId, pgstat_prep_database_pending(), pgstat_should_report_connstat(), pgStatSessionEndCause, PgStat_StatDBEntry::sessions_abandoned, PgStat_StatDBEntry::sessions_fatal, and PgStat_StatDBEntry::sessions_killed.

Referenced by pgstat_shutdown_hook().

◆ 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_startup_deadlock++;
114  break;
115  }
116 }
@ PROCSIG_RECOVERY_CONFLICT_BUFFERPIN
Definition: procsignal.h:44
@ PROCSIG_RECOVERY_CONFLICT_LOCK
Definition: procsignal.h:42
@ PROCSIG_RECOVERY_CONFLICT_DATABASE
Definition: procsignal.h:40
@ PROCSIG_RECOVERY_CONFLICT_SNAPSHOT
Definition: procsignal.h:43
@ PROCSIG_RECOVERY_CONFLICT_TABLESPACE
Definition: procsignal.h:41
@ PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK
Definition: procsignal.h:45
PgStat_Counter conflict_startup_deadlock
Definition: pgstat.h:295
PgStat_Counter conflict_lock
Definition: pgstat.h:292
PgStat_Counter conflict_snapshot
Definition: pgstat.h:293
PgStat_Counter conflict_bufferpin
Definition: pgstat.h:294
PgStat_Counter conflict_tablespace
Definition: pgstat.h:291

References Assert(), PgStat_StatDBEntry::conflict_bufferpin, PgStat_StatDBEntry::conflict_lock, 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_SNAPSHOT, PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK, and PROCSIG_RECOVERY_CONFLICT_TABLESPACE.

Referenced by ProcessInterrupts().

◆ pgstat_report_tempfile()

void pgstat_report_tempfile ( size_t  filesize)

Definition at line 172 of file pgstat_database.c.

173 {
174  PgStat_StatDBEntry *dbent;
175 
176  if (!pgstat_track_counts)
177  return;
178 
180  dbent->temp_bytes += filesize;
181  dbent->temp_files++;
182 }
PgStat_Counter temp_bytes
Definition: pgstat.h:297
PgStat_Counter temp_files
Definition: pgstat.h:296

References MyDatabaseId, pgstat_prep_database_pending(), pgstat_track_counts, PgStat_StatDBEntry::temp_bytes, and PgStat_StatDBEntry::temp_files.

Referenced by ReportTemporaryFileUsage().

◆ pgstat_reset_database_timestamp()

void pgstat_reset_database_timestamp ( Oid  dboid,
TimestampTz  ts 
)

◆ pgstat_should_report_connstat()

static bool pgstat_should_report_connstat ( void  )
static

Definition at line 314 of file pgstat_database.c.

315 {
316  return MyBackendType == B_BACKEND;
317 }
@ B_BACKEND
Definition: miscadmin.h:322
BackendType MyBackendType
Definition: miscinit.c:63

References B_BACKEND, and MyBackendType.

Referenced by pgstat_report_connect(), pgstat_report_disconnect(), and pgstat_update_dbstats().

◆ pgstat_update_dbstats()

void pgstat_update_dbstats ( TimestampTz  ts)

Definition at line 267 of file pgstat_database.c.

268 {
269  PgStat_StatDBEntry *dbentry;
270 
272 
273  /*
274  * Accumulate xact commit/rollback and I/O timings to stats entry of the
275  * current database.
276  */
277  dbentry->xact_commit += pgStatXactCommit;
278  dbentry->xact_rollback += pgStatXactRollback;
281 
283  {
284  long secs;
285  int usecs;
286 
287  /*
288  * pgLastSessionReportTime is initialized to MyStartTimestamp by
289  * pgstat_report_connect().
290  */
291  TimestampDifference(pgLastSessionReportTime, ts, &secs, &usecs);
293  dbentry->session_time += (PgStat_Counter) secs * 1000000 + usecs;
294  dbentry->active_time += pgStatActiveTime;
296  }
297 
298  pgStatXactCommit = 0;
299  pgStatXactRollback = 0;
302  pgStatActiveTime = 0;
304 }
void TimestampDifference(TimestampTz start_time, TimestampTz stop_time, long *secs, int *microsecs)
Definition: timestamp.c:1664
int64 PgStat_Counter
Definition: pgstat.h:88
PgStat_Counter pgStatActiveTime
PgStat_Counter pgStatBlockReadTime
PgStat_Counter pgStatBlockWriteTime
PgStat_Counter pgStatTransactionIdleTime
PgStat_Counter blk_write_time
Definition: pgstat.h:302
PgStat_Counter xact_rollback
Definition: pgstat.h:282
PgStat_Counter blk_read_time
Definition: pgstat.h:301
PgStat_Counter xact_commit
Definition: pgstat.h:281
PgStat_Counter session_time
Definition: pgstat.h:304
PgStat_Counter active_time
Definition: pgstat.h:305
PgStat_Counter idle_in_transaction_time
Definition: pgstat.h:306

References PgStat_StatDBEntry::active_time, PgStat_StatDBEntry::blk_read_time, PgStat_StatDBEntry::blk_write_time, PgStat_StatDBEntry::idle_in_transaction_time, MyDatabaseId, pgLastSessionReportTime, pgstat_prep_database_pending(), pgstat_should_report_connstat(), pgStatActiveTime, pgStatBlockReadTime, pgStatBlockWriteTime, pgStatTransactionIdleTime, pgStatXactCommit, pgStatXactRollback, PgStat_StatDBEntry::session_time, TimestampDifference(), PgStat_StatDBEntry::xact_commit, and PgStat_StatDBEntry::xact_rollback.

Referenced by pgstat_report_stat().

Variable Documentation

◆ pgLastSessionReportTime

PgStat_Counter pgLastSessionReportTime = 0
static

Definition at line 37 of file pgstat_database.c.

Referenced by pgstat_report_connect(), and pgstat_update_dbstats().

◆ pgStatActiveTime

PgStat_Counter pgStatActiveTime = 0

Definition at line 30 of file pgstat_database.c.

Referenced by pgstat_update_dbstats().

◆ pgStatBlockReadTime

PgStat_Counter pgStatBlockReadTime = 0

Definition at line 28 of file pgstat_database.c.

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

◆ pgStatBlockWriteTime

PgStat_Counter pgStatBlockWriteTime = 0

Definition at line 29 of file pgstat_database.c.

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

◆ pgStatSessionEndCause

SessionEndType pgStatSessionEndCause = DISCONNECT_NORMAL

Definition at line 32 of file pgstat_database.c.

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

◆ pgStatTransactionIdleTime

PgStat_Counter pgStatTransactionIdleTime = 0

Definition at line 31 of file pgstat_database.c.

Referenced by pgstat_update_dbstats().

◆ pgStatXactCommit

int pgStatXactCommit = 0
static

Definition at line 35 of file pgstat_database.c.

Referenced by AtEOXact_PgStat_Database(), and pgstat_update_dbstats().

◆ pgStatXactRollback

int pgStatXactRollback = 0
static

Definition at line 36 of file pgstat_database.c.

Referenced by AtEOXact_PgStat_Database(), and pgstat_update_dbstats().