diff options
-rw-r--r-- | src/backend/postmaster/pgstat.c | 10 | ||||
-rw-r--r-- | src/backend/replication/logical/logical.c | 2 | ||||
-rw-r--r-- | src/backend/replication/slot.c | 20 | ||||
-rw-r--r-- | src/backend/utils/activity/pgstat_replslot.c | 13 | ||||
-rw-r--r-- | src/include/pgstat.h | 7 | ||||
-rw-r--r-- | src/include/replication/slot.h | 1 |
6 files changed, 41 insertions, 12 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 13dee840593..8655b56c5e2 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -862,7 +862,15 @@ pgstat_vacuum_stat(void) CHECK_FOR_INTERRUPTS(); if (SearchNamedReplicationSlot(NameStr(slotentry->slotname), true) == NULL) - pgstat_report_replslot_drop(NameStr(slotentry->slotname)); + { + PgStat_MsgReplSlot msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); + namestrcpy(&msg.m_slotname, NameStr(slotentry->slotname)); + msg.m_create = false; + msg.m_drop = true; + pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); + } } } diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index e1f14aeecb5..656ec8f5555 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -1921,7 +1921,7 @@ UpdateDecodingStats(LogicalDecodingContext *ctx) repSlotStat.total_txns = rb->totalTxns; repSlotStat.total_bytes = rb->totalBytes; - pgstat_report_replslot(&repSlotStat); + pgstat_report_replslot(ctx->slot, &repSlotStat); rb->spillTxns = 0; rb->spillCount = 0; diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index ed4c8b3ad55..2217af70d43 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -356,7 +356,7 @@ ReplicationSlotCreate(const char *name, bool db_specific, * ReplicationSlotAllocationLock. */ if (SlotIsLogical(slot)) - pgstat_report_replslot_create(NameStr(slot->data.name)); + pgstat_create_replslot(slot); /* * Now that the slot has been marked as in_use and active, it's safe to @@ -400,6 +400,22 @@ SearchNamedReplicationSlot(const char *name, bool need_lock) } /* + * Return the index of the replication slot in + * ReplicationSlotCtl->replication_slots. + * + * This is mainly useful to have an efficient key for storing replication slot + * stats. + */ +int +ReplicationSlotIndex(ReplicationSlot *slot) +{ + Assert(slot >= ReplicationSlotCtl->replication_slots && + slot < ReplicationSlotCtl->replication_slots + max_replication_slots); + + return slot - ReplicationSlotCtl->replication_slots; +} + +/* * Find a previously created slot and mark it as used by this process. * * An error is raised if nowait is true and the slot is currently in use. If @@ -746,7 +762,7 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) * doesn't seem worth doing as in practice this won't happen frequently. */ if (SlotIsLogical(slot)) - pgstat_report_replslot_drop(NameStr(slot->data.name)); + pgstat_drop_replslot(slot); /* * We release this at the very end, so that nobody starts trying to create diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index cfaf8d546c5..ceefc5d59b3 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -69,7 +69,7 @@ pgstat_reset_replslot(const char *name) * Report replication slot statistics. */ void -pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) +pgstat_report_replslot(ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat) { PgStat_MsgReplSlot msg; @@ -93,14 +93,17 @@ pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) /* * Report replication slot creation. + * + * NB: This gets called with ReplicationSlotAllocationLock already held, be + * careful about calling back into slot.c. */ void -pgstat_report_replslot_create(const char *slotname) +pgstat_create_replslot(ReplicationSlot *slot) { PgStat_MsgReplSlot msg; pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, slotname); + namestrcpy(&msg.m_slotname, NameStr(slot->data.name)); msg.m_create = true; msg.m_drop = false; pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); @@ -110,12 +113,12 @@ pgstat_report_replslot_create(const char *slotname) * Report replication slot drop. */ void -pgstat_report_replslot_drop(const char *slotname) +pgstat_drop_replslot(ReplicationSlot *slot) { PgStat_MsgReplSlot msg; pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, slotname); + namestrcpy(&msg.m_slotname, NameStr(slot->data.name)); msg.m_create = false; msg.m_drop = true; pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 7981a816565..0c618e77103 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1137,9 +1137,10 @@ extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id); */ extern void pgstat_reset_replslot(const char *name); -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); +struct ReplicationSlot; +extern void pgstat_report_replslot(struct ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat); +extern void pgstat_create_replslot(struct ReplicationSlot *slot); +extern void pgstat_drop_replslot(struct ReplicationSlot *slot); /* diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h index 24b30210c3e..1ee63c4cf44 100644 --- a/src/include/replication/slot.h +++ b/src/include/replication/slot.h @@ -216,6 +216,7 @@ extern bool ReplicationSlotsCountDBSlots(Oid dboid, int *nslots, int *nactive); extern void ReplicationSlotsDropDBSlots(Oid dboid); extern bool InvalidateObsoleteReplicationSlots(XLogSegNo oldestSegno); extern ReplicationSlot *SearchNamedReplicationSlot(const char *name, bool need_lock); +extern int ReplicationSlotIndex(ReplicationSlot *slot); extern void ReplicationSlotNameForTablesync(Oid suboid, Oid relid, char *syncslotname, int szslot); extern void ReplicationSlotDropAtPubNode(WalReceiverConn *wrconn, char *slotname, bool missing_ok); |