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.
|
-- Reports fixed-numbered statistics for injection points.
|
||||||
CREATE FUNCTION injection_points_stats_fixed(OUT numattach int8,
|
CREATE FUNCTION injection_points_stats_fixed(OUT numattach int8,
|
||||||
OUT numdetach int8,
|
OUT numdetach int8,
|
||||||
OUT numrun int8)
|
OUT numrun int8,
|
||||||
|
OUT numcached int8,
|
||||||
|
OUT numloaded int8)
|
||||||
RETURNS record
|
RETURNS record
|
||||||
AS 'MODULE_PATHNAME', 'injection_points_stats_fixed'
|
AS 'MODULE_PATHNAME', 'injection_points_stats_fixed'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT;
|
||||||
|
@ -297,7 +297,7 @@ injection_points_attach(PG_FUNCTION_ARGS)
|
|||||||
condition.pid = MyProcPid;
|
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,
|
InjectionPointAttach(name, "injection_points", function, &condition,
|
||||||
sizeof(InjectionPointCondition));
|
sizeof(InjectionPointCondition));
|
||||||
|
|
||||||
@ -329,6 +329,7 @@ injection_points_load(PG_FUNCTION_ARGS)
|
|||||||
if (inj_state == NULL)
|
if (inj_state == NULL)
|
||||||
injection_init_shmem();
|
injection_init_shmem();
|
||||||
|
|
||||||
|
pgstat_report_inj_fixed(0, 0, 0, 0, 1);
|
||||||
INJECTION_POINT_LOAD(name);
|
INJECTION_POINT_LOAD(name);
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
@ -343,7 +344,7 @@ injection_points_run(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
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);
|
INJECTION_POINT(name);
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
@ -358,6 +359,7 @@ injection_points_cached(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
||||||
|
|
||||||
|
pgstat_report_inj_fixed(0, 0, 0, 1, 0);
|
||||||
INJECTION_POINT_CACHED(name);
|
INJECTION_POINT_CACHED(name);
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
@ -434,7 +436,7 @@ injection_points_detach(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
|
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))
|
if (!InjectionPointDetach(name))
|
||||||
elog(ERROR, "could not detach injection point \"%s\"", 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_register_inj_fixed(void);
|
||||||
extern void pgstat_report_inj_fixed(uint32 numattach,
|
extern void pgstat_report_inj_fixed(uint32 numattach,
|
||||||
uint32 numdetach,
|
uint32 numdetach,
|
||||||
uint32 numrun);
|
uint32 numrun,
|
||||||
|
uint32 numcached,
|
||||||
|
uint32 numloaded);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -29,6 +29,8 @@ typedef struct PgStat_StatInjFixedEntry
|
|||||||
PgStat_Counter numattach; /* number of points attached */
|
PgStat_Counter numattach; /* number of points attached */
|
||||||
PgStat_Counter numdetach; /* number of points detached */
|
PgStat_Counter numdetach; /* number of points detached */
|
||||||
PgStat_Counter numrun; /* number of points run */
|
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;
|
TimestampTz stat_reset_timestamp;
|
||||||
} PgStat_StatInjFixedEntry;
|
} PgStat_StatInjFixedEntry;
|
||||||
|
|
||||||
@ -114,6 +116,8 @@ injection_stats_fixed_snapshot_cb(void)
|
|||||||
FIXED_COMP(numattach);
|
FIXED_COMP(numattach);
|
||||||
FIXED_COMP(numdetach);
|
FIXED_COMP(numdetach);
|
||||||
FIXED_COMP(numrun);
|
FIXED_COMP(numrun);
|
||||||
|
FIXED_COMP(numcached);
|
||||||
|
FIXED_COMP(numloaded);
|
||||||
#undef FIXED_COMP
|
#undef FIXED_COMP
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +139,9 @@ pgstat_register_inj_fixed(void)
|
|||||||
void
|
void
|
||||||
pgstat_report_inj_fixed(uint32 numattach,
|
pgstat_report_inj_fixed(uint32 numattach,
|
||||||
uint32 numdetach,
|
uint32 numdetach,
|
||||||
uint32 numrun)
|
uint32 numrun,
|
||||||
|
uint32 numcached,
|
||||||
|
uint32 numloaded)
|
||||||
{
|
{
|
||||||
PgStatShared_InjectionPointFixed *stats_shmem;
|
PgStatShared_InjectionPointFixed *stats_shmem;
|
||||||
|
|
||||||
@ -149,6 +155,8 @@ pgstat_report_inj_fixed(uint32 numattach,
|
|||||||
stats_shmem->stats.numattach += numattach;
|
stats_shmem->stats.numattach += numattach;
|
||||||
stats_shmem->stats.numdetach += numdetach;
|
stats_shmem->stats.numdetach += numdetach;
|
||||||
stats_shmem->stats.numrun += numrun;
|
stats_shmem->stats.numrun += numrun;
|
||||||
|
stats_shmem->stats.numcached += numcached;
|
||||||
|
stats_shmem->stats.numloaded += numloaded;
|
||||||
pgstat_end_changecount_write(&stats_shmem->changecount);
|
pgstat_end_changecount_write(&stats_shmem->changecount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,8 +168,8 @@ Datum
|
|||||||
injection_points_stats_fixed(PG_FUNCTION_ARGS)
|
injection_points_stats_fixed(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
TupleDesc tupdesc;
|
TupleDesc tupdesc;
|
||||||
Datum values[3] = {0};
|
Datum values[5] = {0};
|
||||||
bool nulls[3] = {0};
|
bool nulls[5] = {0};
|
||||||
PgStat_StatInjFixedEntry *stats;
|
PgStat_StatInjFixedEntry *stats;
|
||||||
|
|
||||||
if (!inj_fixed_loaded)
|
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);
|
stats = pgstat_get_custom_snapshot_data(PGSTAT_KIND_INJECTION_FIXED);
|
||||||
|
|
||||||
/* Initialise attributes information in the tuple descriptor */
|
/* Initialise attributes information in the tuple descriptor */
|
||||||
tupdesc = CreateTemplateTupleDesc(3);
|
tupdesc = CreateTemplateTupleDesc(5);
|
||||||
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "numattach",
|
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "numattach",
|
||||||
INT8OID, -1, 0);
|
INT8OID, -1, 0);
|
||||||
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "numdetach",
|
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "numdetach",
|
||||||
INT8OID, -1, 0);
|
INT8OID, -1, 0);
|
||||||
TupleDescInitEntry(tupdesc, (AttrNumber) 3, "numrun",
|
TupleDescInitEntry(tupdesc, (AttrNumber) 3, "numrun",
|
||||||
INT8OID, -1, 0);
|
INT8OID, -1, 0);
|
||||||
|
TupleDescInitEntry(tupdesc, (AttrNumber) 4, "numcached",
|
||||||
|
INT8OID, -1, 0);
|
||||||
|
TupleDescInitEntry(tupdesc, (AttrNumber) 5, "numloaded",
|
||||||
|
INT8OID, -1, 0);
|
||||||
BlessTupleDesc(tupdesc);
|
BlessTupleDesc(tupdesc);
|
||||||
|
|
||||||
values[0] = Int64GetDatum(stats->numattach);
|
values[0] = Int64GetDatum(stats->numattach);
|
||||||
values[1] = Int64GetDatum(stats->numdetach);
|
values[1] = Int64GetDatum(stats->numdetach);
|
||||||
values[2] = Int64GetDatum(stats->numrun);
|
values[2] = Int64GetDatum(stats->numrun);
|
||||||
|
values[3] = Int64GetDatum(stats->numcached);
|
||||||
|
values[4] = Int64GetDatum(stats->numloaded);
|
||||||
nulls[0] = false;
|
nulls[0] = false;
|
||||||
nulls[1] = false;
|
nulls[1] = false;
|
||||||
nulls[2] = false;
|
nulls[2] = false;
|
||||||
|
nulls[3] = false;
|
||||||
|
nulls[4] = false;
|
||||||
|
|
||||||
/* Returns the record as Datum */
|
/* Returns the record as Datum */
|
||||||
PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
|
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');
|
is($numcalls, '2', 'number of stats calls');
|
||||||
my $fixedstats = $node->safe_psql('postgres',
|
my $fixedstats = $node->safe_psql('postgres',
|
||||||
"SELECT * FROM injection_points_stats_fixed();");
|
"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.
|
# Restart the node cleanly, stats should still be around.
|
||||||
$node->restart;
|
$node->restart;
|
||||||
$numcalls = $node->safe_psql('postgres',
|
$numcalls = $node->safe_psql('postgres',
|
||||||
"SELECT injection_points_stats_numcalls('stats-notice');");
|
"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',
|
$fixedstats = $node->safe_psql('postgres',
|
||||||
"SELECT * FROM injection_points_stats_fixed();");
|
"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.
|
# On crash the stats are gone.
|
||||||
$node->stop('immediate');
|
$node->stop('immediate');
|
||||||
@ -54,6 +64,6 @@ $numcalls = $node->safe_psql('postgres',
|
|||||||
is($numcalls, '', 'number of stats after crash');
|
is($numcalls, '', 'number of stats after crash');
|
||||||
$fixedstats = $node->safe_psql('postgres',
|
$fixedstats = $node->safe_psql('postgres',
|
||||||
"SELECT * FROM injection_points_stats_fixed();");
|
"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();
|
done_testing();
|
||||||
|
Reference in New Issue
Block a user