*** a/src/backend/commands/subscriptioncmds.c --- b/src/backend/commands/subscriptioncmds.c *************** *** 441,447 **** DropSubscription(DropSubscriptionStmt *stmt) WalReceiverConn *wrconn = NULL; StringInfoData cmd; ! rel = heap_open(SubscriptionRelationId, RowExclusiveLock); tup = SearchSysCache2(SUBSCRIPTIONNAME, MyDatabaseId, CStringGetDatum(stmt->subname)); --- 441,452 ---- WalReceiverConn *wrconn = NULL; StringInfoData cmd; ! /* ! * Lock pg_subscription with AccessExclusiveLock to ensure ! * that the launcher doesn't restart new worker during dropping ! * the subscription ! */ ! rel = heap_open(SubscriptionRelationId, AccessExclusiveLock); tup = SearchSysCache2(SUBSCRIPTIONNAME, MyDatabaseId, CStringGetDatum(stmt->subname)); *************** *** 508,521 **** DropSubscription(DropSubscriptionStmt *stmt) /* Clean up dependencies */ deleteSharedDependencyRecordsFor(SubscriptionRelationId, subid, 0); - /* Protect against launcher restarting the worker. */ - LWLockAcquire(LogicalRepLauncherLock, LW_EXCLUSIVE); - /* Kill the apply worker so that the slot becomes accessible. */ logicalrep_worker_stop(subid); - LWLockRelease(LogicalRepLauncherLock); - /* Remove the origin tracking if exists. */ snprintf(originname, sizeof(originname), "pg_%u", subid); originid = replorigin_by_name(originname, true); --- 513,521 ---- *** a/src/backend/replication/logical/launcher.c --- b/src/backend/replication/logical/launcher.c *************** *** 305,321 **** logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid) /* * Stop the logical replication worker and wait until it detaches from the * slot. - * - * The caller must hold LogicalRepLauncherLock to ensure that new workers are - * not being started during this function call. */ void logicalrep_worker_stop(Oid subid) { LogicalRepWorker *worker; - Assert(LWLockHeldByMe(LogicalRepLauncherLock)); - LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); worker = logicalrep_worker_find(subid); --- 305,316 ---- *************** *** 602,610 **** ApplyLauncherMain(Datum main_arg) ALLOCSET_DEFAULT_MAXSIZE); oldctx = MemoryContextSwitchTo(subctx); - /* Block any concurrent DROP SUBSCRIPTION. */ - LWLockAcquire(LogicalRepLauncherLock, LW_EXCLUSIVE); - /* search for subscriptions to start or stop. */ sublist = get_subscription_list(); --- 597,602 ---- *************** *** 628,635 **** ApplyLauncherMain(Datum main_arg) } } - LWLockRelease(LogicalRepLauncherLock); - /* Switch back to original memory context. */ MemoryContextSwitchTo(oldctx); /* Clean the temporary memory. */ --- 620,625 ---- *** a/src/backend/storage/lmgr/lwlocknames.txt --- b/src/backend/storage/lmgr/lwlocknames.txt *************** *** 48,52 **** ReplicationOriginLock 40 MultiXactTruncationLock 41 OldSnapshotTimeMapLock 42 BackendRandomLock 43 ! LogicalRepLauncherLock 44 ! LogicalRepWorkerLock 45 --- 48,51 ---- MultiXactTruncationLock 41 OldSnapshotTimeMapLock 42 BackendRandomLock 43 ! LogicalRepWorkerLock 44