diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index e23a7e2ee97..f1611312e13 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -288,22 +288,34 @@ AddSubscriptionRelState(Oid subid, Oid relid, char state, */ void UpdateSubscriptionRelStateEx(Oid subid, Oid relid, char state, - XLogRecPtr sublsn) + XLogRecPtr sublsn, bool already_locked) { Relation rel; HeapTuple tup; bool nulls[Natts_pg_subscription_rel]; Datum values[Natts_pg_subscription_rel]; bool replaces[Natts_pg_subscription_rel]; - LOCKTAG tag PG_USED_FOR_ASSERTS_ONLY; - Assert(CheckRelationOidLockedByMe(SubscriptionRelRelationId, - RowExclusiveLock, true)); - - SET_LOCKTAG_OBJECT(tag, InvalidOid, SubscriptionRelationId, subid, 0); - Assert(LockHeldByMe(&tag, AccessShareLock, true)); - - rel = table_open(SubscriptionRelRelationId, NoLock); + if (already_locked) + { +#ifdef USE_ASSERT_CHECKING + LOCKTAG tag; +#endif + + Assert(CheckRelationOidLockedByMe(SubscriptionRelRelationId, + RowExclusiveLock, true)); + + rel = table_open(SubscriptionRelRelationId, NoLock); +#ifdef USE_ASSERT_CHECKING + SET_LOCKTAG_OBJECT(tag, InvalidOid, SubscriptionRelationId, subid, 0); + Assert(LockHeldByMe(&tag, AccessShareLock, true)); +#endif + } + else + { + LockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); + rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); + } /* Try finding existing mapping. */ tup = SearchSysCacheCopy2(SUBSCRIPTIONRELMAP, @@ -344,16 +356,7 @@ void UpdateSubscriptionRelState(Oid subid, Oid relid, char state, XLogRecPtr sublsn) { - Relation rel; - - LockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); - - rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); - - UpdateSubscriptionRelStateEx(subid, relid, state, sublsn); - - /* close table */ - table_close(rel, NoLock); + UpdateSubscriptionRelStateEx(subid, relid, state, sublsn, false); } /* diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 157f41720c5..1da5a7e7ef8 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -515,7 +515,7 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) */ UpdateSubscriptionRelStateEx(MyLogicalRepWorker->subid, rstate->relid, rstate->state, - rstate->lsn); + rstate->lsn, true); } } else diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h index 7a287423d75..0afda883219 100644 --- a/src/include/catalog/pg_subscription_rel.h +++ b/src/include/catalog/pg_subscription_rel.h @@ -87,7 +87,7 @@ extern void AddSubscriptionRelState(Oid subid, Oid relid, char state, extern void UpdateSubscriptionRelState(Oid subid, Oid relid, char state, XLogRecPtr sublsn); extern void UpdateSubscriptionRelStateEx(Oid subid, Oid relid, char state, - XLogRecPtr sublsn); + XLogRecPtr sublsn, bool already_locked); extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn); extern void RemoveSubscriptionRel(Oid subid, Oid relid);