PostgreSQL Source Code  git master
pgstat_replslot.c File Reference
#include "postgres.h"
#include "replication/slot.h"
#include "utils/pgstat_internal.h"
Include dependency graph for pgstat_replslot.c:

Go to the source code of this file.

Macros

#define REPLSLOT_ACC(fld)   statent->fld += repSlotStat->fld
 

Functions

static int get_replslot_index (const char *name, bool need_lock)
 
void pgstat_reset_replslot (const char *name)
 
void pgstat_report_replslot (ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat)
 
void pgstat_create_replslot (ReplicationSlot *slot)
 
void pgstat_acquire_replslot (ReplicationSlot *slot)
 
void pgstat_drop_replslot (ReplicationSlot *slot)
 
PgStat_StatReplSlotEntrypgstat_fetch_replslot (NameData slotname)
 
void pgstat_replslot_to_serialized_name_cb (const PgStat_HashKey *key, const PgStatShared_Common *header, NameData *name)
 
bool pgstat_replslot_from_serialized_name_cb (const NameData *name, PgStat_HashKey *key)
 
void pgstat_replslot_reset_timestamp_cb (PgStatShared_Common *header, TimestampTz ts)
 

Macro Definition Documentation

◆ REPLSLOT_ACC

#define REPLSLOT_ACC (   fld)    statent->fld += repSlotStat->fld

Function Documentation

◆ get_replslot_index()

static int get_replslot_index ( const char *  name,
bool  need_lock 
)
static

Definition at line 223 of file pgstat_replslot.c.

224 {
225  ReplicationSlot *slot;
226 
227  Assert(name != NULL);
228 
229  slot = SearchNamedReplicationSlot(name, need_lock);
230 
231  if (!slot)
232  return -1;
233 
234  return ReplicationSlotIndex(slot);
235 }
#define Assert(condition)
Definition: c.h:858
ReplicationSlot * SearchNamedReplicationSlot(const char *name, bool need_lock)
Definition: slot.c:464
int ReplicationSlotIndex(ReplicationSlot *slot)
Definition: slot.c:497
const char * name

References Assert, name, ReplicationSlotIndex(), and SearchNamedReplicationSlot().

Referenced by pgstat_fetch_replslot(), and pgstat_replslot_from_serialized_name_cb().

◆ pgstat_acquire_replslot()

void pgstat_acquire_replslot ( ReplicationSlot slot)

Definition at line 146 of file pgstat_replslot.c.

147 {
149  ReplicationSlotIndex(slot), true, NULL);
150 }
@ PGSTAT_KIND_REPLSLOT
Definition: pgstat.h:44
PgStat_EntryRef * pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create, bool *created_entry)
Definition: pgstat_shmem.c:398
#define InvalidOid
Definition: postgres_ext.h:36

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

Referenced by ReplicationSlotAcquire().

◆ pgstat_create_replslot()

void pgstat_create_replslot ( 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:1939
@ LW_EXCLUSIVE
Definition: lwlock.h:114
void pgstat_unlock_entry(PgStat_EntryRef *entry_ref)
Definition: pgstat_shmem.c:604
PgStat_EntryRef * pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, Oid objoid, bool nowait)
Definition: pgstat_shmem.c:613
PgStat_StatReplSlotEntry stats
PgStatShared_Common * shared_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_drop_replslot()

void pgstat_drop_replslot ( ReplicationSlot slot)

Definition at line 156 of file pgstat_replslot.c.

157 {
158  Assert(LWLockHeldByMeInMode(ReplicationSlotAllocationLock, LW_EXCLUSIVE));
159 
161  ReplicationSlotIndex(slot));
162 }
bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, Oid objoid)
Definition: pgstat_shmem.c:859

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

Referenced by ReplicationSlotDropPtr().

◆ pgstat_fetch_replslot()

PgStat_StatReplSlotEntry* pgstat_fetch_replslot ( NameData  slotname)

Definition at line 169 of file pgstat_replslot.c.

170 {
171  int idx;
172  PgStat_StatReplSlotEntry *slotentry = NULL;
173 
174  LWLockAcquire(ReplicationSlotControlLock, LW_SHARED);
175 
176  idx = get_replslot_index(NameStr(slotname), false);
177 
178  if (idx != -1)
180  InvalidOid, idx);
181 
182  LWLockRelease(ReplicationSlotControlLock);
183 
184  return slotentry;
185 }
Datum idx(PG_FUNCTION_ARGS)
Definition: _int_op.c:259
#define NameStr(name)
Definition: c.h:746
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1170
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1783
@ LW_SHARED
Definition: lwlock.h:115
void * pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, Oid objoid)
Definition: pgstat.c:812
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_replslot_from_serialized_name_cb()

bool pgstat_replslot_from_serialized_name_cb ( const NameData name,
PgStat_HashKey key 
)

Definition at line 201 of file pgstat_replslot.c.

202 {
203  int idx = get_replslot_index(NameStr(*name), true);
204 
205  /* slot might have been deleted */
206  if (idx == -1)
207  return false;
208 
209  key->kind = PGSTAT_KIND_REPLSLOT;
210  key->dboid = InvalidOid;
211  key->objoid = idx;
212 
213  return true;
214 }

References get_replslot_index(), idx(), InvalidOid, sort-test::key, name, NameStr, and PGSTAT_KIND_REPLSLOT.

◆ pgstat_replslot_reset_timestamp_cb()

void pgstat_replslot_reset_timestamp_cb ( PgStatShared_Common header,
TimestampTz  ts 
)

Definition at line 217 of file pgstat_replslot.c.

218 {
219  ((PgStatShared_ReplSlot *) header)->stats.stat_reset_timestamp = ts;
220 }

◆ pgstat_replslot_to_serialized_name_cb()

void pgstat_replslot_to_serialized_name_cb ( const PgStat_HashKey key,
const PgStatShared_Common header,
NameData name 
)

Definition at line 188 of file pgstat_replslot.c.

189 {
190  /*
191  * This is only called late during shutdown. The set of existing slots
192  * isn't allowed to change at this point, we can assume that a slot exists
193  * at the offset.
194  */
195  if (!ReplicationSlotName(key->objoid, name))
196  elog(ERROR, "could not find name for replication slot index %u",
197  key->objoid);
198 }
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:224
bool ReplicationSlotName(int index, Name name)
Definition: slot.c:513

References elog, ERROR, sort-test::key, name, and ReplicationSlotName().

◆ pgstat_report_replslot()

void pgstat_report_replslot ( 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_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 }
int errcode(int sqlerrcode)
Definition: elog.c:859
int errmsg(const char *fmt,...)
Definition: elog.c:1072
#define ereport(elevel,...)
Definition: elog.h:149
void pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objoid)
Definition: pgstat.c:734
#define SlotIsLogical(slot)
Definition: slot.h:210

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