From 28e9dc7185b0553a5604ac49ac0092ffad2306b7 Mon Sep 17 00:00:00 2001 From: Dilip Kumar Date: Fri, 24 Sep 2021 18:29:17 +0530 Subject: [PATCH v4 5/6] New interface to lock relation id Same as LockRelationOid, but instead of rel oid it will take LockRelId object as an input. So instead of using MyDatabaseId it will use the dboid passed in the LockRelId object. So this will provide an option to lock the relation even if we are not connected to the database. --- src/backend/storage/lmgr/lmgr.c | 28 ++++++++++++++++++++++++++++ src/include/storage/lmgr.h | 1 + 2 files changed, 29 insertions(+) diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c index cdf2266..4a321aa 100644 --- a/src/backend/storage/lmgr/lmgr.c +++ b/src/backend/storage/lmgr/lmgr.c @@ -176,6 +176,34 @@ ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode) } /* + * LockRelationId + * + * Lock, given a LockRelId. Same as LockRelationOid but take LockRelId as an + * input. + */ +void +LockRelationId(LockRelId *relid, LOCKMODE lockmode) +{ + LOCKTAG tag; + LOCALLOCK *locallock; + LockAcquireResult res; + + SET_LOCKTAG_RELATION(tag, relid->dbId, relid->relId); + + res = LockAcquireExtended(&tag, lockmode, false, false, true, &locallock); + + /* + * Now that we have the lock, check for invalidation messages; see notes + * in LockRelationOid. + */ + if (res != LOCKACQUIRE_ALREADY_CLEAR) + { + AcceptInvalidationMessages(); + MarkLockClear(locallock); + } +} + +/* * UnlockRelationId * * Unlock, given a LockRelId. This is preferred over UnlockRelationOid diff --git a/src/include/storage/lmgr.h b/src/include/storage/lmgr.h index b009559..092ee93 100644 --- a/src/include/storage/lmgr.h +++ b/src/include/storage/lmgr.h @@ -38,6 +38,7 @@ extern void RelationInitLockInfo(Relation relation); /* Lock a relation */ extern void LockRelationOid(Oid relid, LOCKMODE lockmode); +extern void LockRelationId(LockRelId *relid, LOCKMODE lockmode); extern bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode); extern void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode); extern void UnlockRelationOid(Oid relid, LOCKMODE lockmode); -- 1.8.3.1