mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
injection_points: Add stats for point caching and loading
This adds two counters to the fixed-numbered stats of injection points to track the number of times injection points have been cached and loaded from the cache, as of the additions coming froma0a5869a85
and4b211003ec
. These should have been part off68cd847fa
, but I have lacked time and energy back then, and it did not prevent the code to be a useful template. While on it, this commit simplifies the description of a few tests while adding coverage for the new stats data. Author: Yogesh Sharma Discussion: https://postgr.es/m/3a6977f7-54ab-43ce-8806-11d5e15526a2@catprosystems.com
This commit is contained in:
@ -91,7 +91,9 @@ LANGUAGE C STRICT;
|
||||
-- Reports fixed-numbered statistics for injection points.
|
||||
CREATE FUNCTION injection_points_stats_fixed(OUT numattach int8,
|
||||
OUT numdetach int8,
|
||||
OUT numrun int8)
|
||||
OUT numrun int8,
|
||||
OUT numcached int8,
|
||||
OUT numloaded int8)
|
||||
RETURNS record
|
||||
AS 'MODULE_PATHNAME', 'injection_points_stats_fixed'
|
||||
LANGUAGE C STRICT;
|
||||
|
@ -297,7 +297,7 @@ injection_points_attach(PG_FUNCTION_ARGS)
|
||||
condition.pid = MyProcPid;
|
||||
}
|
||||
|
||||
pgstat_report_inj_fixed(1, 0, 0);
|
||||
pgstat_report_inj_fixed(1, 0, 0, 0, 0);
|
||||
InjectionPointAttach(name, "injection_points", function, &condition,
|
||||
sizeof(InjectionPointCondition));
|
||||
|
||||
@ -329,6 +329,7 @@ injection_points_load(PG_FUNCTION_ARGS)
|
||||
if (inj_state == NULL)
|
||||
injection_init_shmem();
|
||||
|
||||
pgstat_report_inj_fixed(0, 0, 0, 0, 1);
|
||||
INJECTION_POINT_LOAD(name);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
@ -343,7 +344,7 @@ injection_points_run(PG_FUNCTION_ARGS)
|
||||
{
|
||||
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
||||
|
||||
pgstat_report_inj_fixed(0, 0, 1);
|
||||
pgstat_report_inj_fixed(0, 0, 1, 0, 0);
|
||||
INJECTION_POINT(name);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
@ -358,6 +359,7 @@ injection_points_cached(PG_FUNCTION_ARGS)
|
||||
{
|
||||
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
||||
|
||||
pgstat_report_inj_fixed(0, 0, 0, 1, 0);
|
||||
INJECTION_POINT_CACHED(name);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
@ -434,7 +436,7 @@ injection_points_detach(PG_FUNCTION_ARGS)
|
||||
{
|
||||
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
||||
|
||||
pgstat_report_inj_fixed(0, 1, 0);
|
||||
pgstat_report_inj_fixed(0, 1, 0, 0, 0);
|
||||
if (!InjectionPointDetach(name))
|
||||
elog(ERROR, "could not detach injection point \"%s\"", name);
|
||||
|
||||
|
@ -25,6 +25,8 @@ extern void pgstat_report_inj(const char *name);
|
||||
extern void pgstat_register_inj_fixed(void);
|
||||
extern void pgstat_report_inj_fixed(uint32 numattach,
|
||||
uint32 numdetach,
|
||||
uint32 numrun);
|
||||
uint32 numrun,
|
||||
uint32 numcached,
|
||||
uint32 numloaded);
|
||||
|
||||
#endif
|
||||
|
@ -29,6 +29,8 @@ typedef struct PgStat_StatInjFixedEntry
|
||||
PgStat_Counter numattach; /* number of points attached */
|
||||
PgStat_Counter numdetach; /* number of points detached */
|
||||
PgStat_Counter numrun; /* number of points run */
|
||||
PgStat_Counter numcached; /* number of points cached */
|
||||
PgStat_Counter numloaded; /* number of points loaded */
|
||||
TimestampTz stat_reset_timestamp;
|
||||
} PgStat_StatInjFixedEntry;
|
||||
|
||||
@ -114,6 +116,8 @@ injection_stats_fixed_snapshot_cb(void)
|
||||
FIXED_COMP(numattach);
|
||||
FIXED_COMP(numdetach);
|
||||
FIXED_COMP(numrun);
|
||||
FIXED_COMP(numcached);
|
||||
FIXED_COMP(numloaded);
|
||||
#undef FIXED_COMP
|
||||
}
|
||||
|
||||
@ -135,7 +139,9 @@ pgstat_register_inj_fixed(void)
|
||||
void
|
||||
pgstat_report_inj_fixed(uint32 numattach,
|
||||
uint32 numdetach,
|
||||
uint32 numrun)
|
||||
uint32 numrun,
|
||||
uint32 numcached,
|
||||
uint32 numloaded)
|
||||
{
|
||||
PgStatShared_InjectionPointFixed *stats_shmem;
|
||||
|
||||
@ -149,6 +155,8 @@ pgstat_report_inj_fixed(uint32 numattach,
|
||||
stats_shmem->stats.numattach += numattach;
|
||||
stats_shmem->stats.numdetach += numdetach;
|
||||
stats_shmem->stats.numrun += numrun;
|
||||
stats_shmem->stats.numcached += numcached;
|
||||
stats_shmem->stats.numloaded += numloaded;
|
||||
pgstat_end_changecount_write(&stats_shmem->changecount);
|
||||
}
|
||||
|
||||
@ -160,8 +168,8 @@ Datum
|
||||
injection_points_stats_fixed(PG_FUNCTION_ARGS)
|
||||
{
|
||||
TupleDesc tupdesc;
|
||||
Datum values[3] = {0};
|
||||
bool nulls[3] = {0};
|
||||
Datum values[5] = {0};
|
||||
bool nulls[5] = {0};
|
||||
PgStat_StatInjFixedEntry *stats;
|
||||
|
||||
if (!inj_fixed_loaded)
|
||||
@ -171,21 +179,29 @@ injection_points_stats_fixed(PG_FUNCTION_ARGS)
|
||||
stats = pgstat_get_custom_snapshot_data(PGSTAT_KIND_INJECTION_FIXED);
|
||||
|
||||
/* Initialise attributes information in the tuple descriptor */
|
||||
tupdesc = CreateTemplateTupleDesc(3);
|
||||
tupdesc = CreateTemplateTupleDesc(5);
|
||||
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "numattach",
|
||||
INT8OID, -1, 0);
|
||||
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "numdetach",
|
||||
INT8OID, -1, 0);
|
||||
TupleDescInitEntry(tupdesc, (AttrNumber) 3, "numrun",
|
||||
INT8OID, -1, 0);
|
||||
TupleDescInitEntry(tupdesc, (AttrNumber) 4, "numcached",
|
||||
INT8OID, -1, 0);
|
||||
TupleDescInitEntry(tupdesc, (AttrNumber) 5, "numloaded",
|
||||
INT8OID, -1, 0);
|
||||
BlessTupleDesc(tupdesc);
|
||||
|
||||
values[0] = Int64GetDatum(stats->numattach);
|
||||
values[1] = Int64GetDatum(stats->numdetach);
|
||||
values[2] = Int64GetDatum(stats->numrun);
|
||||
values[3] = Int64GetDatum(stats->numcached);
|
||||
values[4] = Int64GetDatum(stats->numloaded);
|
||||
nulls[0] = false;
|
||||
nulls[1] = false;
|
||||
nulls[2] = false;
|
||||
nulls[3] = false;
|
||||
nulls[4] = false;
|
||||
|
||||
/* Returns the record as Datum */
|
||||
PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
|
||||
|
@ -35,16 +35,26 @@ my $numcalls = $node->safe_psql('postgres',
|
||||
is($numcalls, '2', 'number of stats calls');
|
||||
my $fixedstats = $node->safe_psql('postgres',
|
||||
"SELECT * FROM injection_points_stats_fixed();");
|
||||
is($fixedstats, '1|0|2', 'number of fixed stats');
|
||||
is($fixedstats, '1|0|2|0|0', 'fixed stats after some calls');
|
||||
|
||||
# Loading and caching.
|
||||
$node->safe_psql(
|
||||
'postgres', "
|
||||
SELECT injection_points_load('stats-notice');
|
||||
SELECT injection_points_cached('stats-notice');
|
||||
");
|
||||
$fixedstats = $node->safe_psql('postgres',
|
||||
"SELECT * FROM injection_points_stats_fixed();");
|
||||
is($fixedstats, '1|0|2|1|1', 'fixed stats after loading and caching');
|
||||
|
||||
# Restart the node cleanly, stats should still be around.
|
||||
$node->restart;
|
||||
$numcalls = $node->safe_psql('postgres',
|
||||
"SELECT injection_points_stats_numcalls('stats-notice');");
|
||||
is($numcalls, '2', 'number of stats after clean restart');
|
||||
is($numcalls, '3', 'number of stats after clean restart');
|
||||
$fixedstats = $node->safe_psql('postgres',
|
||||
"SELECT * FROM injection_points_stats_fixed();");
|
||||
is($fixedstats, '1|0|2', 'number of fixed stats after clean restart');
|
||||
is($fixedstats, '1|0|2|1|1', 'fixed stats after clean restart');
|
||||
|
||||
# On crash the stats are gone.
|
||||
$node->stop('immediate');
|
||||
@ -54,6 +64,6 @@ $numcalls = $node->safe_psql('postgres',
|
||||
is($numcalls, '', 'number of stats after crash');
|
||||
$fixedstats = $node->safe_psql('postgres',
|
||||
"SELECT * FROM injection_points_stats_fixed();");
|
||||
is($fixedstats, '0|0|0', 'number of fixed stats after crash');
|
||||
is($fixedstats, '0|0|0|0|0', 'fixed stats after crash');
|
||||
|
||||
done_testing();
|
||||
|
Reference in New Issue
Block a user