Fix using injection points at backend startup in EXEC_BACKEND mode
authorHeikki Linnakangas <[email protected]>
Fri, 26 Jul 2024 11:55:04 +0000 (14:55 +0300)
committerHeikki Linnakangas <[email protected]>
Fri, 26 Jul 2024 12:12:12 +0000 (15:12 +0300)
Commit 86db52a506 changed the locking of injection points to use only
atomic ops and spinlocks, to make it possible to define injection
points in processes that don't have a PGPROC entry (yet). However, it
didn't work in EXEC_BACKEND mode, because the pointer to shared memory
area was not initialized until the process "attaches" to all the
shared memory structs. To fix, pass the pointer to the child process
along with other global variables that need to be set up early.

Backpatch-through: 17

src/backend/postmaster/launch_backend.c
src/backend/utils/misc/injection_point.c
src/include/utils/injection_point.h

index d6c63896a65629bd5fa1c573e0be6818e875d326..bdf490c31d0260e321caf3777aa3dbaac877b7f8 100644 (file)
@@ -63,6 +63,7 @@
 #include "utils/builtins.h"
 #include "utils/datetime.h"
 #include "utils/guc.h"
+#include "utils/injection_point.h"
 #include "utils/memutils.h"
 #include "utils/timestamp.h"
 
@@ -104,6 +105,9 @@ typedef struct
    void       *UsedShmemSegAddr;
    slock_t    *ShmemLock;
    struct bkend *ShmemBackendArray;
+#ifdef USE_INJECTION_POINTS
+   struct InjectionPointsCtl *ActiveInjectionPoints;
+#endif
 #ifndef HAVE_SPINLOCKS
    PGSemaphore *SpinlockSemaArray;
 #endif
@@ -722,6 +726,10 @@ save_backend_variables(BackendParameters *param, ClientSocket *client_sock,
    param->ShmemLock = ShmemLock;
    param->ShmemBackendArray = ShmemBackendArray;
 
+#ifdef USE_INJECTION_POINTS
+   param->ActiveInjectionPoints = ActiveInjectionPoints;
+#endif
+
 #ifndef HAVE_SPINLOCKS
    param->SpinlockSemaArray = SpinlockSemaArray;
 #endif
@@ -981,6 +989,10 @@ restore_backend_variables(BackendParameters *param)
    ShmemLock = param->ShmemLock;
    ShmemBackendArray = param->ShmemBackendArray;
 
+#ifdef USE_INJECTION_POINTS
+   ActiveInjectionPoints = param->ActiveInjectionPoints;
+#endif
+
 #ifndef HAVE_SPINLOCKS
    SpinlockSemaArray = param->SpinlockSemaArray;
 #endif
index 3c63a8ace861bc94f21f3cf42e1c0fb2cf3293bf..ab327779902faa4b8db9e1d3af3d08c0f4b626b9 100644 (file)
@@ -85,7 +85,7 @@ typedef struct InjectionPointsCtl
    InjectionPointEntry entries[MAX_INJECTION_POINTS];
 } InjectionPointsCtl;
 
-static InjectionPointsCtl *ActiveInjectionPoints;
+NON_EXEC_STATIC InjectionPointsCtl *ActiveInjectionPoints;
 
 /*
  * Backend local cache of injection callbacks already loaded, stored in
index a61d5d44391d75056bb43870031f0eb8d8c21a40..6e417cedc60b34592bc75551833a64ef79edfbfd 100644 (file)
@@ -37,4 +37,8 @@ extern void InjectionPointAttach(const char *name,
 extern void InjectionPointRun(const char *name);
 extern bool InjectionPointDetach(const char *name);
 
+#ifdef EXEC_BACKEND
+extern PGDLLIMPORT struct InjectionPointsCtl *ActiveInjectionPoints;
+#endif
+
 #endif                         /* INJECTION_POINT_H */