diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c
index cac5854fcf..6f13084c43 100644
--- a/src/backend/access/transam/xlogfuncs.c
+++ b/src/backend/access/transam/xlogfuncs.c
@@ -80,6 +80,7 @@ pg_start_backup(PG_FUNCTION_ARGS)
 	}
 	else
 	{
+		static bool exit_handler_registered = false;
 		MemoryContext oldcontext;
 
 		/*
@@ -91,7 +92,12 @@ pg_start_backup(PG_FUNCTION_ARGS)
 		tblspc_map_file = makeStringInfo();
 		MemoryContextSwitchTo(oldcontext);
 
-		before_shmem_exit(do_pg_abort_backup, BoolGetDatum(true));
+		/* We don't remove this handler so register it only once */
+		if (!exit_handler_registered)
+		{
+			before_shmem_exit(do_pg_abort_backup, BoolGetDatum(true));
+			exit_handler_registered = true;
+		}
 
 		startpoint = do_pg_start_backup(backupidstr, fast, NULL, label_file,
 										NULL, tblspc_map_file, false, true);
diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c
index 05d02c23f5..44a1b24009 100644
--- a/src/backend/storage/ipc/ipc.c
+++ b/src/backend/storage/ipc/ipc.c
@@ -389,11 +389,11 @@ on_shmem_exit(pg_on_exit_callback function, Datum arg)
 void
 cancel_before_shmem_exit(pg_on_exit_callback function, Datum arg)
 {
-	if (before_shmem_exit_index > 0 &&
-		before_shmem_exit_list[before_shmem_exit_index - 1].function
-		== function &&
-		before_shmem_exit_list[before_shmem_exit_index - 1].arg == arg)
-		--before_shmem_exit_index;
+	Assert(before_shmem_exit_index > 0 &&
+		   before_shmem_exit_list[before_shmem_exit_index - 1].function
+		   == function &&
+		   before_shmem_exit_list[before_shmem_exit_index - 1].arg == arg);
+	--before_shmem_exit_index;
 }
 
 /* ----------------------------------------------------------------
