PostgreSQL Source Code git master
pgstat_wal.c
Go to the documentation of this file.
1/* -------------------------------------------------------------------------
2 *
3 * pgstat_wal.c
4 * Implementation of WAL statistics.
5 *
6 * This file contains the implementation of WAL statistics. It is kept
7 * separate from pgstat.c to enforce the line between the statistics access /
8 * storage implementation and the details about individual types of
9 * statistics.
10 *
11 * Copyright (c) 2001-2025, PostgreSQL Global Development Group
12 *
13 * IDENTIFICATION
14 * src/backend/utils/activity/pgstat_wal.c
15 * -------------------------------------------------------------------------
16 */
17
18#include "postgres.h"
19
20#include "executor/instrument.h"
22
23
24/*
25 * WAL usage counters saved from pgWalUsage at the previous call to
26 * pgstat_report_wal(). This is used to calculate how much WAL usage
27 * happens between pgstat_report_wal() calls, by subtracting
28 * the previous counters from the current ones.
29 */
31
32
33/*
34 * Calculate how much WAL usage counters have increased and update
35 * shared WAL and IO statistics.
36 *
37 * Must be called by processes that generate WAL, that do not call
38 * pgstat_report_stat(), like walwriter.
39 *
40 * "force" set to true ensures that the statistics are flushed; note that
41 * this needs to acquire the pgstat shmem LWLock, waiting on it. When
42 * set to false, the statistics may not be flushed if the lock could not
43 * be acquired.
44 */
45void
47{
48 bool nowait;
49
50 /* like in pgstat.c, don't wait for lock acquisition when !force */
51 nowait = !force;
52
53 /* flush wal stats */
54 (void) pgstat_wal_flush_cb(nowait);
56
57 /* flush IO stats */
58 pgstat_flush_io(nowait);
60}
61
62/*
63 * Support function for the SQL-callable pgstat* functions. Returns
64 * a pointer to the WAL statistics struct.
65 */
68{
70
71 return &pgStatLocal.snapshot.wal;
72}
73
74/*
75 * Calculate how much WAL usage counters have increased by subtracting the
76 * previous counters from the current ones.
77 *
78 * If nowait is true, this function returns true if the lock could not be
79 * acquired. Otherwise return false.
80 */
81bool
83{
84 PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
85 WalUsage wal_usage_diff = {0};
86
88 Assert(pgStatLocal.shmem != NULL &&
90
91 /*
92 * This function can be called even if nothing at all has happened. Avoid
93 * taking lock for nothing in that case.
94 */
96 return false;
97
98 /*
99 * We don't update the WAL usage portion of the local WalStats elsewhere.
100 * Calculate how much WAL usage counters were increased by subtracting the
101 * previous counters from the current ones.
102 */
103 WalUsageAccumDiff(&wal_usage_diff, &pgWalUsage, &prevWalUsage);
104
105 if (!nowait)
106 LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
107 else if (!LWLockConditionalAcquire(&stats_shmem->lock, LW_EXCLUSIVE))
108 return true;
109
110#define WALSTAT_ACC(fld, var_to_add) \
111 (stats_shmem->stats.wal_counters.fld += var_to_add.fld)
112 WALSTAT_ACC(wal_records, wal_usage_diff);
113 WALSTAT_ACC(wal_fpi, wal_usage_diff);
114 WALSTAT_ACC(wal_bytes, wal_usage_diff);
115 WALSTAT_ACC(wal_buffers_full, wal_usage_diff);
116#undef WALSTAT_ACC
117
118 LWLockRelease(&stats_shmem->lock);
119
120 /*
121 * Save the current counters for the subsequent calculation of WAL usage.
122 */
124
125 return false;
126}
127
128void
130{
131 /*
132 * Initialize prevWalUsage with pgWalUsage so that pgstat_wal_flush_cb()
133 * can calculate how much pgWalUsage counters are increased by subtracting
134 * prevWalUsage from pgWalUsage.
135 */
137}
138
139/*
140 * To determine whether WAL usage happened.
141 */
142bool
144{
146}
147
148void
150{
151 PgStatShared_Wal *stats_shmem = (PgStatShared_Wal *) stats;
152
154}
155
156void
158{
159 PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
160
161 LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
162 memset(&stats_shmem->stats, 0, sizeof(stats_shmem->stats));
163 stats_shmem->stats.stat_reset_timestamp = ts;
164 LWLockRelease(&stats_shmem->lock);
165}
166
167void
169{
170 PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
171
172 LWLockAcquire(&stats_shmem->lock, LW_SHARED);
173 memcpy(&pgStatLocal.snapshot.wal, &stats_shmem->stats,
174 sizeof(pgStatLocal.snapshot.wal));
175 LWLockRelease(&stats_shmem->lock);
176}
int64 TimestampTz
Definition: timestamp.h:39
bool IsUnderPostmaster
Definition: globals.c:119
bool IsPostmasterEnvironment
Definition: globals.c:118
Assert(PointerIsAligned(start, uint64))
WalUsage pgWalUsage
Definition: instrument.c:22
void WalUsageAccumDiff(WalUsage *dst, const WalUsage *add, const WalUsage *sub)
Definition: instrument.c:287
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1179
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1899
void LWLockInitialize(LWLock *lock, int tranche_id)
Definition: lwlock.c:718
bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1350
@ LWTRANCHE_PGSTATS_DATA
Definition: lwlock.h:208
@ LW_SHARED
Definition: lwlock.h:115
@ LW_EXCLUSIVE
Definition: lwlock.h:114
void pgstat_snapshot_fixed(PgStat_Kind kind)
Definition: pgstat.c:1078
PgStat_LocalState pgStatLocal
Definition: pgstat.c:212
bool pgstat_flush_backend(bool nowait, bits32 flags)
#define PGSTAT_BACKEND_FLUSH_IO
#define PGSTAT_BACKEND_FLUSH_WAL
void pgstat_flush_io(bool nowait)
Definition: pgstat_io.c:183
#define PGSTAT_KIND_WAL
Definition: pgstat_kind.h:40
#define WALSTAT_ACC(fld, var_to_add)
void pgstat_wal_reset_all_cb(TimestampTz ts)
Definition: pgstat_wal.c:157
void pgstat_wal_init_shmem_cb(void *stats)
Definition: pgstat_wal.c:149
void pgstat_report_wal(bool force)
Definition: pgstat_wal.c:46
void pgstat_wal_init_backend_cb(void)
Definition: pgstat_wal.c:129
bool pgstat_wal_flush_cb(bool nowait)
Definition: pgstat_wal.c:82
static WalUsage prevWalUsage
Definition: pgstat_wal.c:30
bool pgstat_wal_have_pending_cb(void)
Definition: pgstat_wal.c:143
void pgstat_wal_snapshot_cb(void)
Definition: pgstat_wal.c:168
PgStat_WalStats * pgstat_fetch_stat_wal(void)
Definition: pgstat_wal.c:67
PgStat_WalStats stats
PgStat_Snapshot snapshot
PgStat_ShmemControl * shmem
PgStatShared_Wal wal
PgStat_WalStats wal
TimestampTz stat_reset_timestamp
Definition: pgstat.h:481
int64 wal_records
Definition: instrument.h:53