diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c
index 191c1c7..e151cc8 100644
--- a/src/backend/commands/subscriptioncmds.c
+++ b/src/backend/commands/subscriptioncmds.c
@@ -47,6 +47,7 @@
 #include "utils/acl.h"
 #include "utils/builtins.h"
 #include "utils/guc.h"
+#include "utils/injection_point.h"
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
 #include "utils/pg_lsn.h"
@@ -1884,10 +1885,13 @@ ReplicationSlotDropAtPubNode(WalReceiverConn *wrconn, char *slotname, bool missi
 	{
 		WalRcvExecResult *res;
 
+		INJECTION_POINT("tablesync-before-source-slot-drop");
 		res = walrcv_exec(wrconn, cmd.data, 0, NULL);
 
 		if (res->status == WALRCV_OK_COMMAND)
 		{
+			INJECTION_POINT("tablesync-after-source-slot-drop");
+
 			/* NOTICE. Success. */
 			ereport(NOTICE,
 					(errmsg("dropped replication slot \"%s\" on publisher",
diff --git a/src/test/modules/injection_points/injection_points.c b/src/test/modules/injection_points/injection_points.c
index dd19071..2821a2f 100644
--- a/src/test/modules/injection_points/injection_points.c
+++ b/src/test/modules/injection_points/injection_points.c
@@ -181,6 +181,9 @@ injection_wait_cleanup(int code, Datum arg)
 {
 	int			index = DatumGetInt32(arg);
 
+	/* FATAL outside a transaction must unlink the wait before DSM teardown. */
+	ConditionVariableCancelSleep();
+
 	SpinLockAcquire(&inj_state->lock);
 	inj_state->name[index][0] = '\0';
 	SpinLockRelease(&inj_state->lock);
