1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-19 17:02:53 +03:00

injection_points: Add support and tests for runtime arguments

This commit provides some test coverage for the runtime arguments of
injection points, for both INJECTION_POINT_CACHED() and
INJECTION_POINT(), as extended in 371f2db8b0.

The SQL functions injection_points_cached() and injection_points_run()
are extended so as it is possible to pass an optional string value to
them.

Reviewed-by: Greg Burd <greg@burd.me>
Discussion: https://postgr.es/m/Z_y9TtnXubvYAApS@paquier.xyz
This commit is contained in:
Michael Paquier
2025-05-10 07:40:25 +09:00
parent 371f2db8b0
commit 36e5fda632
4 changed files with 93 additions and 10 deletions

View File

@@ -245,26 +245,36 @@ void
injection_error(const char *name, const void *private_data, void *arg)
{
InjectionPointCondition *condition = (InjectionPointCondition *) private_data;
char *argstr = (char *) arg;
if (!injection_point_allowed(condition))
return;
pgstat_report_inj(name);
elog(ERROR, "error triggered for injection point %s", name);
if (argstr)
elog(ERROR, "error triggered for injection point %s (%s)",
name, argstr);
else
elog(ERROR, "error triggered for injection point %s", name);
}
void
injection_notice(const char *name, const void *private_data, void *arg)
{
InjectionPointCondition *condition = (InjectionPointCondition *) private_data;
char *argstr = (char *) arg;
if (!injection_point_allowed(condition))
return;
pgstat_report_inj(name);
elog(NOTICE, "notice triggered for injection point %s", name);
if (argstr)
elog(NOTICE, "notice triggered for injection point %s (%s)",
name, argstr);
else
elog(NOTICE, "notice triggered for injection point %s", name);
}
/* Wait on a condition variable, awaken by injection_points_wakeup() */
@@ -405,10 +415,18 @@ PG_FUNCTION_INFO_V1(injection_points_run);
Datum
injection_points_run(PG_FUNCTION_ARGS)
{
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
char *name;
char *arg = NULL;
if (PG_ARGISNULL(0))
PG_RETURN_VOID();
name = text_to_cstring(PG_GETARG_TEXT_PP(0));
if (!PG_ARGISNULL(1))
arg = text_to_cstring(PG_GETARG_TEXT_PP(1));
pgstat_report_inj_fixed(0, 0, 1, 0, 0);
INJECTION_POINT(name, NULL);
INJECTION_POINT(name, arg);
PG_RETURN_VOID();
}
@@ -420,10 +438,18 @@ PG_FUNCTION_INFO_V1(injection_points_cached);
Datum
injection_points_cached(PG_FUNCTION_ARGS)
{
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
char *name;
char *arg = NULL;
if (PG_ARGISNULL(0))
PG_RETURN_VOID();
name = text_to_cstring(PG_GETARG_TEXT_PP(0));
if (!PG_ARGISNULL(1))
arg = text_to_cstring(PG_GETARG_TEXT_PP(1));
pgstat_report_inj_fixed(0, 0, 0, 1, 0);
INJECTION_POINT_CACHED(name, NULL);
INJECTION_POINT_CACHED(name, arg);
PG_RETURN_VOID();
}