From f47e88ba13bce1857f61d5b5d4517640a754f8ad Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Mon, 14 Apr 2025 16:24:54 +0900
Subject: [PATCH 3/3] aio: Use runtime arguments with injections points

This cleans up some code related to AIO for injection points, switching
the test code to use the in-core support rather than tweaks to pass
arguments to the callbacks run.
---
 src/include/storage/aio_internal.h      | 20 ---------
 src/backend/storage/aio/aio.c           | 58 +------------------------
 src/backend/storage/aio/method_worker.c |  3 +-
 src/test/modules/test_aio/test_aio.c    | 16 ++++---
 4 files changed, 13 insertions(+), 84 deletions(-)

diff --git a/src/include/storage/aio_internal.h b/src/include/storage/aio_internal.h
index 33f27b9fe508..2d37a243abe5 100644
--- a/src/include/storage/aio_internal.h
+++ b/src/include/storage/aio_internal.h
@@ -394,26 +394,6 @@ extern const char *pgaio_io_get_target_name(PgAioHandle *ioh);
 				pgaio_io_get_state_name(ioh), \
 				__VA_ARGS__)
 
-
-#ifdef USE_INJECTION_POINTS
-
-extern void pgaio_io_call_inj(PgAioHandle *ioh, const char *injection_point);
-
-/* just for use in tests, from within injection points */
-extern PgAioHandle *pgaio_inj_io_get(void);
-
-#else
-
-#define pgaio_io_call_inj(ioh, injection_point) (void) 0
-
-/*
- * no fallback for pgaio_inj_io_get, all code using injection points better be
- * guarded by USE_INJECTION_POINTS.
- */
-
-#endif
-
-
 /* Declarations for the tables of function pointers exposed by each IO method. */
 extern PGDLLIMPORT const IoMethodOps pgaio_sync_ops;
 extern PGDLLIMPORT const IoMethodOps pgaio_worker_ops;
diff --git a/src/backend/storage/aio/aio.c b/src/backend/storage/aio/aio.c
index 366cbc23d6b7..cfb2b3301106 100644
--- a/src/backend/storage/aio/aio.c
+++ b/src/backend/storage/aio/aio.c
@@ -46,13 +46,10 @@
 #include "storage/aio_subsys.h"
 #include "utils/guc.h"
 #include "utils/guc_hooks.h"
+#include "utils/injection_point.h"
 #include "utils/resowner.h"
 #include "utils/wait_event_types.h"
 
-#ifdef USE_INJECTION_POINTS
-#include "utils/injection_point.h"
-#endif
-
 
 static inline void pgaio_io_update_state(PgAioHandle *ioh, PgAioHandleState new_state);
 static void pgaio_io_reclaim(PgAioHandle *ioh);
@@ -96,17 +93,6 @@ static const IoMethodOps *const pgaio_method_ops_table[] = {
 const IoMethodOps *pgaio_method_ops;
 
 
-/*
- * Currently there's no infrastructure to pass arguments to injection points,
- * so we instead set this up for the duration of the injection point
- * invocation. See pgaio_io_call_inj().
- */
-#ifdef USE_INJECTION_POINTS
-static PgAioHandle *pgaio_inj_cur_handle;
-#endif
-
-
-
 /* --------------------------------------------------------------------------------
  * Public Functions related to PgAioHandle
  * --------------------------------------------------------------------------------
@@ -507,7 +493,7 @@ pgaio_io_process_completion(PgAioHandle *ioh, int result)
 
 	pgaio_io_update_state(ioh, PGAIO_HS_COMPLETED_IO);
 
-	pgaio_io_call_inj(ioh, "AIO_PROCESS_COMPLETION_BEFORE_SHARED");
+	INJECTION_POINT("AIO_PROCESS_COMPLETION_BEFORE_SHARED", ioh);
 
 	pgaio_io_call_complete_shared(ioh);
 
@@ -1225,43 +1211,3 @@ check_io_max_concurrency(int *newval, void **extra, GucSource source)
 
 	return true;
 }
-
-
-
-/* --------------------------------------------------------------------------------
- * Injection point support
- * --------------------------------------------------------------------------------
- */
-
-#ifdef USE_INJECTION_POINTS
-
-/*
- * Call injection point with support for pgaio_inj_io_get().
- */
-void
-pgaio_io_call_inj(PgAioHandle *ioh, const char *injection_point)
-{
-	pgaio_inj_cur_handle = ioh;
-
-	PG_TRY();
-	{
-		InjectionPointCached(injection_point, NULL);
-	}
-	PG_FINALLY();
-	{
-		pgaio_inj_cur_handle = NULL;
-	}
-	PG_END_TRY();
-}
-
-/*
- * Return IO associated with injection point invocation. This is only needed
- * as injection points currently don't support arguments.
- */
-PgAioHandle *
-pgaio_inj_io_get(void)
-{
-	return pgaio_inj_cur_handle;
-}
-
-#endif
diff --git a/src/backend/storage/aio/method_worker.c b/src/backend/storage/aio/method_worker.c
index 8ad17ec1ef73..6779fb9b7f77 100644
--- a/src/backend/storage/aio/method_worker.c
+++ b/src/backend/storage/aio/method_worker.c
@@ -42,6 +42,7 @@
 #include "storage/latch.h"
 #include "storage/proc.h"
 #include "tcop/tcopprot.h"
+#include "utils/injection_point.h"
 #include "utils/memdebug.h"
 #include "utils/ps_status.h"
 #include "utils/wait_event.h"
@@ -525,7 +526,7 @@ IoWorkerMain(const void *startup_data, size_t startup_data_len)
 			 * To be able to exercise the reopen-fails path, allow injection
 			 * points to trigger a failure at this point.
 			 */
-			pgaio_io_call_inj(ioh, "AIO_WORKER_AFTER_REOPEN");
+			INJECTION_POINT("AIO_WORKER_AFTER_REOPEN", ioh);
 
 			error_errno = 0;
 			error_ioh = NULL;
diff --git a/src/test/modules/test_aio/test_aio.c b/src/test/modules/test_aio/test_aio.c
index 1d776010ef41..07711e46ecbf 100644
--- a/src/test/modules/test_aio/test_aio.c
+++ b/src/test/modules/test_aio/test_aio.c
@@ -674,13 +674,17 @@ batch_end(PG_FUNCTION_ARGS)
 }
 
 #ifdef USE_INJECTION_POINTS
-extern PGDLLEXPORT void inj_io_short_read(const char *name, const void *private_data);
-extern PGDLLEXPORT void inj_io_reopen(const char *name, const void *private_data);
+extern PGDLLEXPORT void inj_io_short_read(const char *name,
+										  const void *private_data,
+										  const void *arg);
+extern PGDLLEXPORT void inj_io_reopen(const char *name,
+									  const void *private_data,
+									  const void *arg);
 
 void
-inj_io_short_read(const char *name, const void *private_data)
+inj_io_short_read(const char *name, const void *private_data, const void *arg)
 {
-	PgAioHandle *ioh;
+	PgAioHandle *ioh = (PgAioHandle *) arg;
 
 	ereport(LOG,
 			errmsg("short read injection point called, is enabled: %d",
@@ -689,8 +693,6 @@ inj_io_short_read(const char *name, const void *private_data)
 
 	if (inj_io_error_state->enabled_short_read)
 	{
-		ioh = pgaio_inj_io_get();
-
 		/*
 		 * Only shorten reads that are actually longer than the target size,
 		 * otherwise we can trigger over-reads.
@@ -742,7 +744,7 @@ inj_io_short_read(const char *name, const void *private_data)
 }
 
 void
-inj_io_reopen(const char *name, const void *private_data)
+inj_io_reopen(const char *name, const void *private_data, const void *arg)
 {
 	ereport(LOG,
 			errmsg("reopen injection point called, is enabled: %d",
-- 
2.49.0

