injection_points: Add stats for point caching and loading
authorMichael Paquier <michael@paquier.xyz>
Mon, 19 Aug 2024 00:03:52 +0000 (09:03 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 19 Aug 2024 00:03:52 +0000 (09:03 +0900)
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 from a0a5869a8598 and
4b211003ecc2.

These should have been part of f68cd847fa40, 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

src/test/modules/injection_points/injection_points--1.0.sql
src/test/modules/injection_points/injection_points.c
src/test/modules/injection_points/injection_stats.h
src/test/modules/injection_points/injection_stats_fixed.c
src/test/modules/injection_points/t/001_stats.pl

index 1b2a4938a95fbb5f3a03f0284ebbaf9684ca7811..6c81d55e0d36725093c098c3efffad662e387015 100644 (file)
@@ -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;
index dc02be1bbf6367aa834cd9fb35f8864a05590afa..4e775c7ec60ceef725e36c9f15ed1c189e343b66 100644 (file)
@@ -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);
 
index d519f29f832e07f8c5b01f0e77be0727a6d1035d..126c1101691779c034e856fbd87c4fdce0995994 100644 (file)
@@ -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
index 72a5f9decb93c3c3688e9d0ece3dc710c80ac1ce..82b07e5332f2be7a199db1456ab83a728f2ef614 100644 (file)
@@ -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)));
index 7897691f95487da35e7f389fe3206ff97128fa93..0d72cd86df7f60553747fa850815884090181d2e 100644 (file)
@@ -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();