mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +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:
@ -24,7 +24,6 @@
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/bgworker_internals.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "replication/slot.h"
|
||||
#include "storage/proc.h"
|
||||
#include "storage/procarray.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));
|
||||
|
||||
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();
|
||||
}
|
||||
@ -2086,7 +2102,7 @@ pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid taboid = PG_GETARG_OID(0);
|
||||
|
||||
pgstat_reset_single_counter(taboid, RESET_TABLE);
|
||||
pgstat_reset(PGSTAT_KIND_RELATION, MyDatabaseId, taboid);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
@ -2096,7 +2112,7 @@ pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid funcoid = PG_GETARG_OID(0);
|
||||
|
||||
pgstat_reset_single_counter(funcoid, RESET_FUNCTION);
|
||||
pgstat_reset(PGSTAT_KIND_FUNCTION, MyDatabaseId, funcoid);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
@ -2107,10 +2123,13 @@ pg_stat_reset_slru(PG_FUNCTION_ARGS)
|
||||
{
|
||||
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));
|
||||
|
||||
pgstat_reset_slru_counter(target);
|
||||
pgstat_reset_slru(target);
|
||||
}
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
@ -2121,36 +2140,14 @@ pg_stat_reset_replication_slot(PG_FUNCTION_ARGS)
|
||||
{
|
||||
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));
|
||||
|
||||
/*
|
||||
* 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(target);
|
||||
}
|
||||
|
||||
pgstat_reset_replslot_counter(target);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
@ -2163,7 +2160,7 @@ pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS)
|
||||
if (PG_ARGISNULL(0))
|
||||
{
|
||||
/* Clear all subscription stats */
|
||||
subid = InvalidOid;
|
||||
pgstat_reset_of_kind(PGSTAT_KIND_SUBSCRIPTION);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2173,10 +2170,9 @@ pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("invalid subscription OID %u", subid)));
|
||||
pgstat_reset(PGSTAT_KIND_SUBSCRIPTION, InvalidOid, subid);
|
||||
}
|
||||
|
||||
pgstat_reset_subscription_counter(subid);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user