mirror of
https://github.com/postgres/postgres.git
synced 2025-10-22 14:32:25 +03:00
injection_points: Add injection_points_list()
This function can be used to retrieve the information about all the
injection points attached to a cluster, providing coverage for
InjectionPointList() introduced in 7b2eb72b1b
.
The original proposal turned around a system function, but that would
not be backpatchable to stable branches. It was also a bit weird to
have a system function that fails depending on if the build allows
injection points or not.
Reviewed-by: Aleksander Alekseev <aleksander@timescale.com>
Reviewed-by: Rahila Syed <rahilasyed90@gmail.com>
Discussion: https://postgr.es/m/Z_xYkA21KyLEHvWR@paquier.xyz
This commit is contained in:
@@ -39,6 +39,15 @@ SELECT injection_points_attach('TestInjectionLog2', 'notice');
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT point_name, library, function FROM injection_points_list()
|
||||||
|
ORDER BY point_name COLLATE "C";
|
||||||
|
point_name | library | function
|
||||||
|
--------------------+------------------+------------------
|
||||||
|
TestInjectionError | injection_points | injection_error
|
||||||
|
TestInjectionLog | injection_points | injection_notice
|
||||||
|
TestInjectionLog2 | injection_points | injection_notice
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
SELECT injection_points_run('TestInjectionBooh'); -- nothing
|
SELECT injection_points_run('TestInjectionBooh'); -- nothing
|
||||||
injection_points_run
|
injection_points_run
|
||||||
----------------------
|
----------------------
|
||||||
@@ -298,5 +307,12 @@ SELECT injection_points_detach('TestConditionLocal1');
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- No points should be left around.
|
||||||
|
SELECT point_name, library, function FROM injection_points_list()
|
||||||
|
ORDER BY point_name COLLATE "C";
|
||||||
|
point_name | library | function
|
||||||
|
------------+---------+----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
DROP EXTENSION injection_points;
|
DROP EXTENSION injection_points;
|
||||||
DROP FUNCTION wait_pid;
|
DROP FUNCTION wait_pid;
|
||||||
|
@@ -77,6 +77,18 @@ RETURNS void
|
|||||||
AS 'MODULE_PATHNAME', 'injection_points_detach'
|
AS 'MODULE_PATHNAME', 'injection_points_detach'
|
||||||
LANGUAGE C STRICT PARALLEL UNSAFE;
|
LANGUAGE C STRICT PARALLEL UNSAFE;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- injection_points_list()
|
||||||
|
--
|
||||||
|
-- List of all the injection points currently attached.
|
||||||
|
--
|
||||||
|
CREATE FUNCTION injection_points_list(OUT point_name text,
|
||||||
|
OUT library text,
|
||||||
|
OUT function text)
|
||||||
|
RETURNS SETOF record
|
||||||
|
AS 'MODULE_PATHNAME', 'injection_points_list'
|
||||||
|
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- injection_points_stats_numcalls()
|
-- injection_points_stats_numcalls()
|
||||||
--
|
--
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#include "fmgr.h"
|
#include "fmgr.h"
|
||||||
|
#include "funcapi.h"
|
||||||
#include "injection_stats.h"
|
#include "injection_stats.h"
|
||||||
#include "miscadmin.h"
|
#include "miscadmin.h"
|
||||||
#include "nodes/pg_list.h"
|
#include "nodes/pg_list.h"
|
||||||
@@ -545,6 +546,44 @@ injection_points_detach(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SQL function for listing all the injection points attached.
|
||||||
|
*/
|
||||||
|
PG_FUNCTION_INFO_V1(injection_points_list);
|
||||||
|
Datum
|
||||||
|
injection_points_list(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
#define NUM_INJECTION_POINTS_LIST 3
|
||||||
|
ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
|
||||||
|
List *inj_points;
|
||||||
|
ListCell *lc;
|
||||||
|
|
||||||
|
/* Build a tuplestore to return our results in */
|
||||||
|
InitMaterializedSRF(fcinfo, 0);
|
||||||
|
|
||||||
|
inj_points = InjectionPointList();
|
||||||
|
|
||||||
|
foreach(lc, inj_points)
|
||||||
|
{
|
||||||
|
Datum values[NUM_INJECTION_POINTS_LIST];
|
||||||
|
bool nulls[NUM_INJECTION_POINTS_LIST];
|
||||||
|
InjectionPointData *inj_point = lfirst(lc);
|
||||||
|
|
||||||
|
memset(values, 0, sizeof(values));
|
||||||
|
memset(nulls, 0, sizeof(nulls));
|
||||||
|
|
||||||
|
values[0] = PointerGetDatum(cstring_to_text(inj_point->name));
|
||||||
|
values[1] = PointerGetDatum(cstring_to_text(inj_point->library));
|
||||||
|
values[2] = PointerGetDatum(cstring_to_text(inj_point->function));
|
||||||
|
|
||||||
|
/* shove row into tuplestore */
|
||||||
|
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Datum) 0;
|
||||||
|
#undef NUM_INJECTION_POINTS_LIST
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_PG_init(void)
|
_PG_init(void)
|
||||||
|
@@ -18,6 +18,9 @@ SELECT injection_points_attach('TestInjectionError', 'error');
|
|||||||
SELECT injection_points_attach('TestInjectionLog', 'notice');
|
SELECT injection_points_attach('TestInjectionLog', 'notice');
|
||||||
SELECT injection_points_attach('TestInjectionLog2', 'notice');
|
SELECT injection_points_attach('TestInjectionLog2', 'notice');
|
||||||
|
|
||||||
|
SELECT point_name, library, function FROM injection_points_list()
|
||||||
|
ORDER BY point_name COLLATE "C";
|
||||||
|
|
||||||
SELECT injection_points_run('TestInjectionBooh'); -- nothing
|
SELECT injection_points_run('TestInjectionBooh'); -- nothing
|
||||||
SELECT injection_points_run('TestInjectionLog2'); -- notice
|
SELECT injection_points_run('TestInjectionLog2'); -- notice
|
||||||
SELECT injection_points_run('TestInjectionLog2', NULL); -- notice
|
SELECT injection_points_run('TestInjectionLog2', NULL); -- notice
|
||||||
@@ -85,5 +88,9 @@ SELECT injection_points_detach('TestConditionError');
|
|||||||
SELECT injection_points_attach('TestConditionLocal1', 'error');
|
SELECT injection_points_attach('TestConditionLocal1', 'error');
|
||||||
SELECT injection_points_detach('TestConditionLocal1');
|
SELECT injection_points_detach('TestConditionLocal1');
|
||||||
|
|
||||||
|
-- No points should be left around.
|
||||||
|
SELECT point_name, library, function FROM injection_points_list()
|
||||||
|
ORDER BY point_name COLLATE "C";
|
||||||
|
|
||||||
DROP EXTENSION injection_points;
|
DROP EXTENSION injection_points;
|
||||||
DROP FUNCTION wait_pid;
|
DROP FUNCTION wait_pid;
|
||||||
|
Reference in New Issue
Block a user