mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
pgstat: prepare APIs used by pgstatfuncs for shared memory stats.
With the introduction of PgStat_Kind PgStat_Single_Reset_Type, PgStat_Shared_Reset_Target don't make sense anymore. Replace them with PgStat_Kind. Instead of having dedicated reset functions for different kinds of stats, use two generic helper routines (one to reset all stats of a kind, one to reset one stats entry). A number of reset functions were named pgstat_reset_*_counter(), despite affecting multiple counters. The generic helper routines get rid of pgstat_reset_single_counter(), pgstat_reset_subscription_counter(). Rename pgstat_reset_slru_counter(), pgstat_reset_replslot_counter() to pgstat_reset_slru(), pgstat_reset_replslot() respectively, and have them only deal with a single SLRU/slot. Resetting all SLRUs/slots goes through the generic pgstat_reset_of_kind(). Previously pg_stat_reset_replication_slot() used SearchNamedReplicationSlot() to check if a slot exists. API wise it seems better to move that to pgstat_replslot.c. This is done separately from the - quite large - shared memory statistics patch to make review easier. Reviewed-By: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Discussion: https://postgr.es/m/20220404041516.cctrvpadhuriawlq@alap3.anarazel.de
This commit is contained in:
@ -124,7 +124,7 @@ static bool pgstat_write_statsfile_needed(void);
|
|||||||
static bool pgstat_db_requested(Oid databaseid);
|
static bool pgstat_db_requested(Oid databaseid);
|
||||||
|
|
||||||
static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it);
|
static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it);
|
||||||
static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts);
|
static void pgstat_reset_replslot_entry(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts);
|
||||||
|
|
||||||
static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid);
|
static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid);
|
||||||
|
|
||||||
@ -1084,56 +1084,111 @@ pgstat_reset_counters(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset a single counter.
|
* Reset a single variable-numbered entry.
|
||||||
|
*
|
||||||
|
* If the stats kind is within a database, also reset the database's
|
||||||
|
* stat_reset_timestamp.
|
||||||
*
|
*
|
||||||
* Permission checking for this function is managed through the normal
|
* Permission checking for this function is managed through the normal
|
||||||
* GRANT system.
|
* GRANT system.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type)
|
pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objoid)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pgStatSock == PGINVALID_SOCKET)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (kind)
|
||||||
|
{
|
||||||
|
case PGSTAT_KIND_FUNCTION:
|
||||||
|
case PGSTAT_KIND_RELATION:
|
||||||
{
|
{
|
||||||
PgStat_MsgResetsinglecounter msg;
|
PgStat_MsgResetsinglecounter msg;
|
||||||
|
|
||||||
if (pgStatSock == PGINVALID_SOCKET)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSINGLECOUNTER);
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSINGLECOUNTER);
|
||||||
msg.m_databaseid = MyDatabaseId;
|
msg.m_databaseid = dboid;
|
||||||
msg.m_resettype = type;
|
msg.m_resettype = kind;
|
||||||
msg.m_objectid = objoid;
|
msg.m_objectid = objoid;
|
||||||
|
|
||||||
pgstat_send(&msg, sizeof(msg));
|
pgstat_send(&msg, sizeof(msg));
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PGSTAT_KIND_SUBSCRIPTION:
|
||||||
|
{
|
||||||
|
PgStat_MsgResetsubcounter msg;
|
||||||
|
|
||||||
|
Assert(dboid == InvalidOid);
|
||||||
|
msg.m_subid = objoid;
|
||||||
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
elog(ERROR, "unexpected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset cluster-wide shared counters.
|
* Reset stats for all entries of a kind.
|
||||||
*
|
*
|
||||||
* Permission checking for this function is managed through the normal
|
* Permission checking for this function is managed through the normal
|
||||||
* GRANT system.
|
* GRANT system.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
pgstat_reset_shared_counters(const char *target)
|
pgstat_reset_of_kind(PgStat_Kind kind)
|
||||||
{
|
{
|
||||||
PgStat_MsgResetsharedcounter msg;
|
|
||||||
|
|
||||||
if (pgStatSock == PGINVALID_SOCKET)
|
if (pgStatSock == PGINVALID_SOCKET)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (strcmp(target, "archiver") == 0)
|
switch (kind)
|
||||||
msg.m_resettarget = RESET_ARCHIVER;
|
{
|
||||||
else if (strcmp(target, "bgwriter") == 0)
|
case PGSTAT_KIND_ARCHIVER:
|
||||||
msg.m_resettarget = RESET_BGWRITER;
|
case PGSTAT_KIND_BGWRITER:
|
||||||
else if (strcmp(target, "wal") == 0)
|
case PGSTAT_KIND_CHECKPOINTER:
|
||||||
msg.m_resettarget = RESET_WAL;
|
case PGSTAT_KIND_WAL:
|
||||||
else
|
{
|
||||||
ereport(ERROR,
|
PgStat_MsgResetsharedcounter msg;
|
||||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
|
||||||
errmsg("unrecognized reset target: \"%s\"", target),
|
|
||||||
errhint("Target must be \"archiver\", \"bgwriter\", or \"wal\".")));
|
|
||||||
|
|
||||||
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER);
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER);
|
||||||
|
msg.m_resettarget = kind;
|
||||||
pgstat_send(&msg, sizeof(msg));
|
pgstat_send(&msg, sizeof(msg));
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case PGSTAT_KIND_SLRU:
|
||||||
|
{
|
||||||
|
PgStat_MsgResetslrucounter msg;
|
||||||
|
|
||||||
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER);
|
||||||
|
msg.m_index = -1;
|
||||||
|
pgstat_send(&msg, sizeof(msg));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PGSTAT_KIND_REPLSLOT:
|
||||||
|
{
|
||||||
|
PgStat_MsgResetreplslotcounter msg;
|
||||||
|
|
||||||
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER);
|
||||||
|
msg.clearall = true;
|
||||||
|
pgstat_send(&msg, sizeof(msg));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PGSTAT_KIND_SUBSCRIPTION:
|
||||||
|
{
|
||||||
|
PgStat_MsgResetsubcounter msg;
|
||||||
|
|
||||||
|
msg.m_subid = InvalidOid;
|
||||||
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER);
|
||||||
|
|
||||||
|
pgstat_send(&msg, sizeof(msg));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
elog(ERROR, "unexpected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send some junk data to the collector to increase traffic.
|
* Send some junk data to the collector to increase traffic.
|
||||||
@ -1954,7 +2009,7 @@ pgstat_get_replslot_entry(NameData name, bool create)
|
|||||||
if (create && !found)
|
if (create && !found)
|
||||||
{
|
{
|
||||||
namestrcpy(&(slotent->slotname), NameStr(name));
|
namestrcpy(&(slotent->slotname), NameStr(name));
|
||||||
pgstat_reset_replslot(slotent, 0);
|
pgstat_reset_replslot_entry(slotent, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return slotent;
|
return slotent;
|
||||||
@ -1964,7 +2019,7 @@ pgstat_get_replslot_entry(NameData name, bool create)
|
|||||||
* Reset the given replication slot stats.
|
* Reset the given replication slot stats.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotent, TimestampTz ts)
|
pgstat_reset_replslot_entry(PgStat_StatReplSlotEntry *slotent, TimestampTz ts)
|
||||||
{
|
{
|
||||||
/* reset only counters. Don't clear slot name */
|
/* reset only counters. Don't clear slot name */
|
||||||
slotent->spill_txns = 0;
|
slotent->spill_txns = 0;
|
||||||
@ -3528,7 +3583,8 @@ pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len)
|
|||||||
static void
|
static void
|
||||||
pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len)
|
pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len)
|
||||||
{
|
{
|
||||||
if (msg->m_resettarget == RESET_BGWRITER)
|
if (msg->m_resettarget == PGSTAT_KIND_BGWRITER ||
|
||||||
|
msg->m_resettarget == PGSTAT_KIND_CHECKPOINTER)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Reset the global, bgwriter and checkpointer statistics for the
|
* Reset the global, bgwriter and checkpointer statistics for the
|
||||||
@ -3537,13 +3593,13 @@ pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len)
|
|||||||
memset(&globalStats, 0, sizeof(globalStats));
|
memset(&globalStats, 0, sizeof(globalStats));
|
||||||
globalStats.bgwriter.stat_reset_timestamp = GetCurrentTimestamp();
|
globalStats.bgwriter.stat_reset_timestamp = GetCurrentTimestamp();
|
||||||
}
|
}
|
||||||
else if (msg->m_resettarget == RESET_ARCHIVER)
|
else if (msg->m_resettarget == PGSTAT_KIND_ARCHIVER)
|
||||||
{
|
{
|
||||||
/* Reset the archiver statistics for the cluster. */
|
/* Reset the archiver statistics for the cluster. */
|
||||||
memset(&archiverStats, 0, sizeof(archiverStats));
|
memset(&archiverStats, 0, sizeof(archiverStats));
|
||||||
archiverStats.stat_reset_timestamp = GetCurrentTimestamp();
|
archiverStats.stat_reset_timestamp = GetCurrentTimestamp();
|
||||||
}
|
}
|
||||||
else if (msg->m_resettarget == RESET_WAL)
|
else if (msg->m_resettarget == PGSTAT_KIND_WAL)
|
||||||
{
|
{
|
||||||
/* Reset the WAL statistics for the cluster. */
|
/* Reset the WAL statistics for the cluster. */
|
||||||
memset(&walStats, 0, sizeof(walStats));
|
memset(&walStats, 0, sizeof(walStats));
|
||||||
@ -3577,10 +3633,10 @@ pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len)
|
|||||||
dbentry->stat_reset_timestamp = GetCurrentTimestamp();
|
dbentry->stat_reset_timestamp = GetCurrentTimestamp();
|
||||||
|
|
||||||
/* Remove object if it exists, ignore it if not */
|
/* Remove object if it exists, ignore it if not */
|
||||||
if (msg->m_resettype == RESET_TABLE)
|
if (msg->m_resettype == PGSTAT_KIND_RELATION)
|
||||||
(void) hash_search(dbentry->tables, (void *) &(msg->m_objectid),
|
(void) hash_search(dbentry->tables, (void *) &(msg->m_objectid),
|
||||||
HASH_REMOVE, NULL);
|
HASH_REMOVE, NULL);
|
||||||
else if (msg->m_resettype == RESET_FUNCTION)
|
else if (msg->m_resettype == PGSTAT_KIND_FUNCTION)
|
||||||
(void) hash_search(dbentry->functions, (void *) &(msg->m_objectid),
|
(void) hash_search(dbentry->functions, (void *) &(msg->m_objectid),
|
||||||
HASH_REMOVE, NULL);
|
HASH_REMOVE, NULL);
|
||||||
}
|
}
|
||||||
@ -3626,7 +3682,7 @@ pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg,
|
|||||||
|
|
||||||
hash_seq_init(&sstat, replSlotStatHash);
|
hash_seq_init(&sstat, replSlotStatHash);
|
||||||
while ((slotent = (PgStat_StatReplSlotEntry *) hash_seq_search(&sstat)) != NULL)
|
while ((slotent = (PgStat_StatReplSlotEntry *) hash_seq_search(&sstat)) != NULL)
|
||||||
pgstat_reset_replslot(slotent, ts);
|
pgstat_reset_replslot_entry(slotent, ts);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -3643,7 +3699,7 @@ pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Reset the stats for the requested replication slot */
|
/* Reset the stats for the requested replication slot */
|
||||||
pgstat_reset_replslot(slotent, ts);
|
pgstat_reset_replslot_entry(slotent, ts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3963,7 +4019,7 @@ pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len)
|
|||||||
* lost, slotent has stats for the old slot. So we initialize all
|
* lost, slotent has stats for the old slot. So we initialize all
|
||||||
* counters at slot creation.
|
* counters at slot creation.
|
||||||
*/
|
*/
|
||||||
pgstat_reset_replslot(slotent, 0);
|
pgstat_reset_replslot_entry(slotent, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -23,30 +23,45 @@
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset counters for a single replication slot, or all replication slots
|
* Reset counters for a single replication slot.
|
||||||
* (when name is null).
|
|
||||||
*
|
*
|
||||||
* Permission checking for this function is managed through the normal
|
* Permission checking for this function is managed through the normal
|
||||||
* GRANT system.
|
* GRANT system.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
pgstat_reset_replslot_counter(const char *name)
|
pgstat_reset_replslot(const char *name)
|
||||||
{
|
{
|
||||||
|
ReplicationSlot *slot;
|
||||||
PgStat_MsgResetreplslotcounter msg;
|
PgStat_MsgResetreplslotcounter msg;
|
||||||
|
|
||||||
|
AssertArg(name != NULL);
|
||||||
|
|
||||||
if (pgStatSock == PGINVALID_SOCKET)
|
if (pgStatSock == PGINVALID_SOCKET)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (name)
|
/*
|
||||||
{
|
* Check if the slot exists with the given name. It is possible that by
|
||||||
namestrcpy(&msg.m_slotname, name);
|
* the time this message is executed the slot is dropped but at least this
|
||||||
msg.clearall = false;
|
* check will ensure that the given name is for a valid slot.
|
||||||
}
|
*/
|
||||||
else
|
slot = SearchNamedReplicationSlot(name, true);
|
||||||
msg.clearall = true;
|
|
||||||
|
if (!slot)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||||
|
errmsg("replication slot \"%s\" does not exist",
|
||||||
|
name)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Nothing to do for physical slots as we collect stats only for logical
|
||||||
|
* slots.
|
||||||
|
*/
|
||||||
|
if (SlotIsPhysical(slot))
|
||||||
|
return;
|
||||||
|
|
||||||
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER);
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER);
|
||||||
|
namestrcpy(&msg.m_slotname, name);
|
||||||
|
msg.clearall = false;
|
||||||
pgstat_send(&msg, sizeof(msg));
|
pgstat_send(&msg, sizeof(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,21 +33,23 @@ static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS];
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset counters for a single SLRU, or all SLRUs (when name is null).
|
* Reset counters for a single SLRU.
|
||||||
*
|
*
|
||||||
* Permission checking for this function is managed through the normal
|
* Permission checking for this function is managed through the normal
|
||||||
* GRANT system.
|
* GRANT system.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
pgstat_reset_slru_counter(const char *name)
|
pgstat_reset_slru(const char *name)
|
||||||
{
|
{
|
||||||
PgStat_MsgResetslrucounter msg;
|
PgStat_MsgResetslrucounter msg;
|
||||||
|
|
||||||
|
AssertArg(name != NULL);
|
||||||
|
|
||||||
if (pgStatSock == PGINVALID_SOCKET)
|
if (pgStatSock == PGINVALID_SOCKET)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER);
|
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER);
|
||||||
msg.m_index = (name) ? pgstat_slru_index(name) : -1;
|
msg.m_index = pgstat_slru_index(name);
|
||||||
|
|
||||||
pgstat_send(&msg, sizeof(msg));
|
pgstat_send(&msg, sizeof(msg));
|
||||||
}
|
}
|
||||||
|
@ -20,27 +20,6 @@
|
|||||||
#include "utils/pgstat_internal.h"
|
#include "utils/pgstat_internal.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reset counters for a single subscription, or all subscriptions (when subid
|
|
||||||
* is InvalidOid).
|
|
||||||
*
|
|
||||||
* Permission checking for this function is managed through the normal
|
|
||||||
* GRANT system.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
pgstat_reset_subscription_counter(Oid subid)
|
|
||||||
{
|
|
||||||
PgStat_MsgResetsubcounter msg;
|
|
||||||
|
|
||||||
if (pgStatSock == PGINVALID_SOCKET)
|
|
||||||
return;
|
|
||||||
|
|
||||||
msg.m_subid = subid;
|
|
||||||
pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER);
|
|
||||||
|
|
||||||
pgstat_send(&msg, sizeof(msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Report a subscription error.
|
* Report a subscription error.
|
||||||
*/
|
*/
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include "pgstat.h"
|
#include "pgstat.h"
|
||||||
#include "postmaster/bgworker_internals.h"
|
#include "postmaster/bgworker_internals.h"
|
||||||
#include "postmaster/postmaster.h"
|
#include "postmaster/postmaster.h"
|
||||||
#include "replication/slot.h"
|
|
||||||
#include "storage/proc.h"
|
#include "storage/proc.h"
|
||||||
#include "storage/procarray.h"
|
#include "storage/procarray.h"
|
||||||
#include "utils/acl.h"
|
#include "utils/acl.h"
|
||||||
@ -2075,7 +2074,24 @@ pg_stat_reset_shared(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
char *target = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
char *target = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
||||||
|
|
||||||
pgstat_reset_shared_counters(target);
|
if (strcmp(target, "archiver") == 0)
|
||||||
|
pgstat_reset_of_kind(PGSTAT_KIND_ARCHIVER);
|
||||||
|
else if (strcmp(target, "bgwriter") == 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Historically checkpointer was part of bgwriter, continue to reset
|
||||||
|
* both for now.
|
||||||
|
*/
|
||||||
|
pgstat_reset_of_kind(PGSTAT_KIND_BGWRITER);
|
||||||
|
pgstat_reset_of_kind(PGSTAT_KIND_CHECKPOINTER);
|
||||||
|
}
|
||||||
|
else if (strcmp(target, "wal") == 0)
|
||||||
|
pgstat_reset_of_kind(PGSTAT_KIND_WAL);
|
||||||
|
else
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||||
|
errmsg("unrecognized reset target: \"%s\"", target),
|
||||||
|
errhint("Target must be \"archiver\", \"bgwriter\", or \"wal\".")));
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
@ -2086,7 +2102,7 @@ pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
Oid taboid = PG_GETARG_OID(0);
|
Oid taboid = PG_GETARG_OID(0);
|
||||||
|
|
||||||
pgstat_reset_single_counter(taboid, RESET_TABLE);
|
pgstat_reset(PGSTAT_KIND_RELATION, MyDatabaseId, taboid);
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
@ -2096,7 +2112,7 @@ pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
Oid funcoid = PG_GETARG_OID(0);
|
Oid funcoid = PG_GETARG_OID(0);
|
||||||
|
|
||||||
pgstat_reset_single_counter(funcoid, RESET_FUNCTION);
|
pgstat_reset(PGSTAT_KIND_FUNCTION, MyDatabaseId, funcoid);
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
@ -2107,10 +2123,13 @@ pg_stat_reset_slru(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
char *target = NULL;
|
char *target = NULL;
|
||||||
|
|
||||||
if (!PG_ARGISNULL(0))
|
if (PG_ARGISNULL(0))
|
||||||
|
pgstat_reset_of_kind(PGSTAT_KIND_SLRU);
|
||||||
|
else
|
||||||
|
{
|
||||||
target = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
target = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
||||||
|
pgstat_reset_slru(target);
|
||||||
pgstat_reset_slru_counter(target);
|
}
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
@ -2121,36 +2140,14 @@ pg_stat_reset_replication_slot(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
char *target = NULL;
|
char *target = NULL;
|
||||||
|
|
||||||
if (!PG_ARGISNULL(0))
|
if (PG_ARGISNULL(0))
|
||||||
|
pgstat_reset_of_kind(PGSTAT_KIND_REPLSLOT);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
ReplicationSlot *slot;
|
|
||||||
|
|
||||||
target = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
target = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
||||||
|
pgstat_reset_replslot(target);
|
||||||
/*
|
|
||||||
* Check if the slot exists with the given name. It is possible that
|
|
||||||
* by the time this message is executed the slot is dropped but at
|
|
||||||
* least this check will ensure that the given name is for a valid
|
|
||||||
* slot.
|
|
||||||
*/
|
|
||||||
slot = SearchNamedReplicationSlot(target, true);
|
|
||||||
|
|
||||||
if (!slot)
|
|
||||||
ereport(ERROR,
|
|
||||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
|
||||||
errmsg("replication slot \"%s\" does not exist",
|
|
||||||
target)));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Nothing to do for physical slots as we collect stats only for
|
|
||||||
* logical slots.
|
|
||||||
*/
|
|
||||||
if (SlotIsPhysical(slot))
|
|
||||||
PG_RETURN_VOID();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pgstat_reset_replslot_counter(target);
|
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2163,7 +2160,7 @@ pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS)
|
|||||||
if (PG_ARGISNULL(0))
|
if (PG_ARGISNULL(0))
|
||||||
{
|
{
|
||||||
/* Clear all subscription stats */
|
/* Clear all subscription stats */
|
||||||
subid = InvalidOid;
|
pgstat_reset_of_kind(PGSTAT_KIND_SUBSCRIPTION);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2173,10 +2170,9 @@ pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS)
|
|||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||||
errmsg("invalid subscription OID %u", subid)));
|
errmsg("invalid subscription OID %u", subid)));
|
||||||
|
pgstat_reset(PGSTAT_KIND_SUBSCRIPTION, InvalidOid, subid);
|
||||||
}
|
}
|
||||||
|
|
||||||
pgstat_reset_subscription_counter(subid);
|
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,21 +82,6 @@ typedef enum SessionEndType
|
|||||||
*/
|
*/
|
||||||
typedef int64 PgStat_Counter;
|
typedef int64 PgStat_Counter;
|
||||||
|
|
||||||
/* Possible targets for resetting cluster-wide shared values */
|
|
||||||
typedef enum PgStat_Shared_Reset_Target
|
|
||||||
{
|
|
||||||
RESET_ARCHIVER,
|
|
||||||
RESET_BGWRITER,
|
|
||||||
RESET_WAL
|
|
||||||
} PgStat_Shared_Reset_Target;
|
|
||||||
|
|
||||||
/* Possible object types for resetting single counters */
|
|
||||||
typedef enum PgStat_Single_Reset_Type
|
|
||||||
{
|
|
||||||
RESET_TABLE,
|
|
||||||
RESET_FUNCTION
|
|
||||||
} PgStat_Single_Reset_Type;
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
/* ------------------------------------------------------------
|
||||||
* Structures kept in backend local memory while accumulating counts
|
* Structures kept in backend local memory while accumulating counts
|
||||||
@ -415,7 +400,7 @@ typedef struct PgStat_MsgResetcounter
|
|||||||
typedef struct PgStat_MsgResetsharedcounter
|
typedef struct PgStat_MsgResetsharedcounter
|
||||||
{
|
{
|
||||||
PgStat_MsgHdr m_hdr;
|
PgStat_MsgHdr m_hdr;
|
||||||
PgStat_Shared_Reset_Target m_resettarget;
|
PgStat_Kind m_resettarget;
|
||||||
} PgStat_MsgResetsharedcounter;
|
} PgStat_MsgResetsharedcounter;
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
@ -427,7 +412,7 @@ typedef struct PgStat_MsgResetsinglecounter
|
|||||||
{
|
{
|
||||||
PgStat_MsgHdr m_hdr;
|
PgStat_MsgHdr m_hdr;
|
||||||
Oid m_databaseid;
|
Oid m_databaseid;
|
||||||
PgStat_Single_Reset_Type m_resettype;
|
PgStat_Kind m_resettype;
|
||||||
Oid m_objectid;
|
Oid m_objectid;
|
||||||
} PgStat_MsgResetsinglecounter;
|
} PgStat_MsgResetsinglecounter;
|
||||||
|
|
||||||
@ -999,8 +984,8 @@ extern void pgstat_vacuum_stat(void);
|
|||||||
extern void pgstat_ping(void);
|
extern void pgstat_ping(void);
|
||||||
|
|
||||||
extern void pgstat_reset_counters(void);
|
extern void pgstat_reset_counters(void);
|
||||||
extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type type);
|
extern void pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objectid);
|
||||||
extern void pgstat_reset_shared_counters(const char *);
|
extern void pgstat_reset_of_kind(PgStat_Kind kind);
|
||||||
|
|
||||||
/* stats accessors */
|
/* stats accessors */
|
||||||
extern void pgstat_clear_snapshot(void);
|
extern void pgstat_clear_snapshot(void);
|
||||||
@ -1146,7 +1131,7 @@ extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id);
|
|||||||
* Functions in pgstat_replslot.c
|
* Functions in pgstat_replslot.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern void pgstat_reset_replslot_counter(const char *name);
|
extern void pgstat_reset_replslot(const char *name);
|
||||||
extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat);
|
extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat);
|
||||||
extern void pgstat_report_replslot_create(const char *slotname);
|
extern void pgstat_report_replslot_create(const char *slotname);
|
||||||
extern void pgstat_report_replslot_drop(const char *slotname);
|
extern void pgstat_report_replslot_drop(const char *slotname);
|
||||||
@ -1156,7 +1141,7 @@ extern void pgstat_report_replslot_drop(const char *slotname);
|
|||||||
* Functions in pgstat_slru.c
|
* Functions in pgstat_slru.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern void pgstat_reset_slru_counter(const char *);
|
extern void pgstat_reset_slru(const char *);
|
||||||
extern void pgstat_count_slru_page_zeroed(int slru_idx);
|
extern void pgstat_count_slru_page_zeroed(int slru_idx);
|
||||||
extern void pgstat_count_slru_page_hit(int slru_idx);
|
extern void pgstat_count_slru_page_hit(int slru_idx);
|
||||||
extern void pgstat_count_slru_page_read(int slru_idx);
|
extern void pgstat_count_slru_page_read(int slru_idx);
|
||||||
@ -1172,7 +1157,6 @@ extern int pgstat_slru_index(const char *name);
|
|||||||
* Functions in pgstat_subscription.c
|
* Functions in pgstat_subscription.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern void pgstat_reset_subscription_counter(Oid subid);
|
|
||||||
extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error);
|
extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error);
|
||||||
extern void pgstat_report_subscription_drop(Oid subid);
|
extern void pgstat_report_subscription_drop(Oid subid);
|
||||||
|
|
||||||
|
@ -1977,8 +1977,6 @@ PgStat_MsgTempFile
|
|||||||
PgStat_MsgVacuum
|
PgStat_MsgVacuum
|
||||||
PgStat_MsgWal
|
PgStat_MsgWal
|
||||||
PgStat_SLRUStats
|
PgStat_SLRUStats
|
||||||
PgStat_Shared_Reset_Target
|
|
||||||
PgStat_Single_Reset_Type
|
|
||||||
PgStat_StatDBEntry
|
PgStat_StatDBEntry
|
||||||
PgStat_StatFuncEntry
|
PgStat_StatFuncEntry
|
||||||
PgStat_StatReplSlotEntry
|
PgStat_StatReplSlotEntry
|
||||||
|
Reference in New Issue
Block a user