mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Use HTAB for replication slot statistics.
Previously, we used to use the array of size max_replication_slots to store stats for replication slots. But that had two problems in the cases where a message for dropping a slot gets lost: 1) the stats for the new slot are not recorded if the array is full and 2) writing beyond the end of the array if the user reduces the max_replication_slots. This commit uses HTAB for replication slot statistics, resolving both problems. Now, pgstat_vacuum_stat() search for all the dead replication slots in stats hashtable and tell the collector to remove them. To avoid showing the stats for the already-dropped slots, pg_stat_replication_slots view searches slot stats by the slot name taken from pg_replication_slots. Also, we send a message for creating a slot at slot creation, initializing the stats. This reduces the possibility that the stats are accumulated into the old slot stats when a message for dropping a slot gets lost. Reported-by: Andres Freund Author: Sawada Masahiko, test case by Vignesh C Reviewed-by: Amit Kapila, Vignesh C, Dilip Kumar Discussion: https://postgr.es/m/20210319185247.ldebgpdaxsowiflw@alap3.anarazel.de
This commit is contained in:
@ -541,6 +541,7 @@ typedef struct PgStat_MsgReplSlot
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
NameData m_slotname;
|
||||
bool m_create;
|
||||
bool m_drop;
|
||||
PgStat_Counter m_spill_txns;
|
||||
PgStat_Counter m_spill_count;
|
||||
@ -917,7 +918,7 @@ typedef struct PgStat_SLRUStats
|
||||
/*
|
||||
* Replication slot statistics kept in the stats collector
|
||||
*/
|
||||
typedef struct PgStat_ReplSlotStats
|
||||
typedef struct PgStat_StatReplSlotEntry
|
||||
{
|
||||
NameData slotname;
|
||||
PgStat_Counter spill_txns;
|
||||
@ -929,7 +930,7 @@ typedef struct PgStat_ReplSlotStats
|
||||
PgStat_Counter total_txns;
|
||||
PgStat_Counter total_bytes;
|
||||
TimestampTz stat_reset_timestamp;
|
||||
} PgStat_ReplSlotStats;
|
||||
} PgStat_StatReplSlotEntry;
|
||||
|
||||
|
||||
/*
|
||||
@ -1031,7 +1032,8 @@ extern void pgstat_report_recovery_conflict(int reason);
|
||||
extern void pgstat_report_deadlock(void);
|
||||
extern void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount);
|
||||
extern void pgstat_report_checksum_failure(void);
|
||||
extern void pgstat_report_replslot(const PgStat_ReplSlotStats *repSlotStat);
|
||||
extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat);
|
||||
extern void pgstat_report_replslot_create(const char *slotname);
|
||||
extern void pgstat_report_replslot_drop(const char *slotname);
|
||||
|
||||
extern void pgstat_initialize(void);
|
||||
@ -1129,7 +1131,7 @@ extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void);
|
||||
extern PgStat_GlobalStats *pgstat_fetch_global(void);
|
||||
extern PgStat_WalStats *pgstat_fetch_stat_wal(void);
|
||||
extern PgStat_SLRUStats *pgstat_fetch_slru(void);
|
||||
extern PgStat_ReplSlotStats *pgstat_fetch_replslot(int *nslots_p);
|
||||
extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname);
|
||||
extern PgStat_RecoveryPrefetchStats *pgstat_fetch_recoveryprefetch(void);
|
||||
|
||||
extern void pgstat_count_slru_page_zeroed(int slru_idx);
|
||||
|
Reference in New Issue
Block a user