diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index b5240dcede..18919724af 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -349,10 +349,21 @@ logicalrep_worker_stop(Oid subid) ResetLatch(&MyProc->procLatch); - /* Check if the worker has started. */ + /* Check worker status. */ LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); - worker = logicalrep_worker_find(subid); - if (!worker || worker->proc) + + /* + * Worker is no longer associated with subscription. It must have + * exited, nothing more for us to do. + */ + if (worker->subid == InvalidOid) + { + LWLockRelease(LogicalRepWorkerLock); + return; + } + + /* Worker has assigned proc, so it has started. */ + if (worker->proc) break; } diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 7d86736444..3ee9cc12df 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -1218,6 +1218,22 @@ reread_subscription(void) newsub = GetSubscription(MyLogicalRepWorker->subid, true); + /* + * Exit if the subscription was removed. + * This normally should not happen as the worker gets killed + * during DROP SUBSCRIPTION. + */ + if (!newsub) + { + ereport(LOG, + (errmsg("logical replication worker for subscription \"%s\" will " + "stop because the subscription was removed", + MySubscription->name))); + + walrcv_disconnect(wrconn); + proc_exit(0); + } + /* * Exit if connection string was changed. The launcher will start * new worker. @@ -1248,22 +1264,6 @@ reread_subscription(void) proc_exit(0); } - /* - * Exit if the subscription was removed. - * This normally should not happen as the worker gets killed - * during DROP SUBSCRIPTION. - */ - if (!newsub) - { - ereport(LOG, - (errmsg("logical replication worker for subscription \"%s\" will " - "stop because the subscription was removed", - MySubscription->name))); - - walrcv_disconnect(wrconn); - proc_exit(0); - } - /* * Exit if the subscription was disabled. * This normally should not happen as the worker gets killed