diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c
index 2b6d3225594381a1c37135b7ede1ad470eb6bca4..e0add949534ea0ccf9b48e0952e2dfd271b30e01 100644
--- a/src/backend/commands/subscriptioncmds.c
+++ b/src/backend/commands/subscriptioncmds.c
@@ -301,10 +301,20 @@ CreateSubscription(CreateSubscriptionStmt *stmt)
 			ereport(ERROR,
 					(errmsg("could not connect to the publisher: %s", err)));
 
-		walrcv_create_slot(wrconn, slotname, false, &lsn);
-		ereport(NOTICE,
-				(errmsg("created replication slot \"%s\" on publisher",
-						slotname)));
+		PG_TRY();
+		{
+			walrcv_create_slot(wrconn, slotname, false, &lsn);
+			ereport(NOTICE,
+					(errmsg("created replication slot \"%s\" on publisher",
+							slotname)));
+		}
+		PG_CATCH();
+		{
+			/* Close the connection in case of failure. */
+			walrcv_disconnect(wrconn);
+			PG_RE_THROW();
+		}
+		PG_END_TRY();
 
 		/* And we are done with the remote side. */
 		walrcv_disconnect(wrconn);