diff options
Diffstat (limited to 'src')
5 files changed, 37 insertions, 8 deletions
diff --git a/src/test/modules/injection_points/injection_points.c b/src/test/modules/injection_points/injection_points.c index abb1516e124..6bcde7b34e8 100644 --- a/src/test/modules/injection_points/injection_points.c +++ b/src/test/modules/injection_points/injection_points.c @@ -28,6 +28,7 @@ #include "storage/lwlock.h" #include "storage/shmem.h" #include "utils/builtins.h" +#include "utils/guc.h" #include "utils/injection_point.h" #include "utils/memutils.h" #include "utils/wait_event.h" @@ -102,6 +103,15 @@ extern PGDLLEXPORT void injection_wait(const char *name, /* track if injection points attached in this process are linked to it */ static bool injection_point_local = false; +/* + * GUC variable + * + * This GUC is useful to control if statistics should be enabled or not + * during a test with injection points, like for example if a test relies + * on a callback run in a critical section where no allocation should happen. + */ +bool inj_stats_enabled = false; + /* Shared memory init callbacks */ static shmem_request_hook_type prev_shmem_request_hook = NULL; static shmem_startup_hook_type prev_shmem_startup_hook = NULL; @@ -513,6 +523,19 @@ _PG_init(void) if (!process_shared_preload_libraries_in_progress) return; + DefineCustomBoolVariable("injection_points.stats", + "Enables statistics for injection points.", + NULL, + &inj_stats_enabled, + false, + PGC_POSTMASTER, + 0, + NULL, + NULL, + NULL); + + MarkGUCPrefixReserved("injection_points"); + /* Shared memory initialization */ prev_shmem_request_hook = shmem_request_hook; shmem_request_hook = injection_shmem_request; diff --git a/src/test/modules/injection_points/injection_stats.c b/src/test/modules/injection_points/injection_stats.c index 78042074ffa..582686a0a83 100644 --- a/src/test/modules/injection_points/injection_stats.c +++ b/src/test/modules/injection_points/injection_stats.c @@ -91,7 +91,7 @@ pgstat_fetch_stat_injentry(const char *name) { PgStat_StatInjEntry *entry = NULL; - if (!inj_stats_loaded) + if (!inj_stats_loaded || !inj_stats_enabled) return NULL; /* Compile the lookup key as a hash of the point name */ @@ -123,7 +123,7 @@ pgstat_create_inj(const char *name) PgStatShared_InjectionPoint *shstatent; /* leave if disabled */ - if (!inj_stats_loaded) + if (!inj_stats_loaded || !inj_stats_enabled) return; entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_INJECTION, InvalidOid, @@ -142,7 +142,7 @@ void pgstat_drop_inj(const char *name) { /* leave if disabled */ - if (!inj_stats_loaded) + if (!inj_stats_loaded || !inj_stats_enabled) return; if (!pgstat_drop_entry(PGSTAT_KIND_INJECTION, InvalidOid, @@ -164,7 +164,7 @@ pgstat_report_inj(const char *name) PgStat_StatInjEntry *statent; /* leave if disabled */ - if (!inj_stats_loaded) + if (!inj_stats_loaded || !inj_stats_enabled) return; entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_INJECTION, InvalidOid, diff --git a/src/test/modules/injection_points/injection_stats.h b/src/test/modules/injection_points/injection_stats.h index 126c1101691..c48d533b4b7 100644 --- a/src/test/modules/injection_points/injection_stats.h +++ b/src/test/modules/injection_points/injection_stats.h @@ -15,6 +15,9 @@ #ifndef INJECTION_STATS #define INJECTION_STATS +/* GUC variable */ +extern bool inj_stats_enabled; + /* injection_stats.c */ extern void pgstat_register_inj(void); extern void pgstat_create_inj(const char *name); diff --git a/src/test/modules/injection_points/injection_stats_fixed.c b/src/test/modules/injection_points/injection_stats_fixed.c index 82b07e5332f..2fed178b7a6 100644 --- a/src/test/modules/injection_points/injection_stats_fixed.c +++ b/src/test/modules/injection_points/injection_stats_fixed.c @@ -146,7 +146,7 @@ pgstat_report_inj_fixed(uint32 numattach, PgStatShared_InjectionPointFixed *stats_shmem; /* leave if disabled */ - if (!inj_fixed_loaded) + if (!inj_fixed_loaded || !inj_stats_enabled) return; stats_shmem = pgstat_get_custom_shmem_data(PGSTAT_KIND_INJECTION_FIXED); @@ -172,7 +172,7 @@ injection_points_stats_fixed(PG_FUNCTION_ARGS) bool nulls[5] = {0}; PgStat_StatInjFixedEntry *stats; - if (!inj_fixed_loaded) + if (!inj_fixed_loaded || !inj_stats_enabled) PG_RETURN_NULL(); pgstat_snapshot_fixed(PGSTAT_KIND_INJECTION_FIXED); diff --git a/src/test/modules/injection_points/t/001_stats.pl b/src/test/modules/injection_points/t/001_stats.pl index 0d72cd86df7..7d6070e7137 100644 --- a/src/test/modules/injection_points/t/001_stats.pl +++ b/src/test/modules/injection_points/t/001_stats.pl @@ -20,8 +20,11 @@ if ($ENV{enable_injection_points} ne 'yes') # Node initialization my $node = PostgreSQL::Test::Cluster->new('master'); $node->init; -$node->append_conf('postgresql.conf', - "shared_preload_libraries = 'injection_points'"); +$node->append_conf( + 'postgresql.conf', qq( +shared_preload_libraries = 'injection_points' +injection_points.stats = true +)); $node->start; $node->safe_psql('postgres', 'CREATE EXTENSION injection_points;'); |