diff --git a/src/backend/storage/lmgr/deadlock.c b/src/backend/storage/lmgr/deadlock.c index f8c5df08e69..59060b6080f 100644 --- a/src/backend/storage/lmgr/deadlock.c +++ b/src/backend/storage/lmgr/deadlock.c @@ -555,6 +555,14 @@ FindLockCycleRecurseMember(PGPROC *checkProc, int numLockModes, lm; + /* + * The relation extension lock can never participate in actual deadlock + * cycle. See Assert in LockAcquireExtended. So, there is no advantage + * in checking wait edges from it. + */ + if (LOCK_LOCKTAG(*lock) == LOCKTAG_RELATION_EXTEND) + return false; + lockMethodTable = GetLocksMethodTable(lock); numLockModes = lockMethodTable->numLockModes; conflictMask = lockMethodTable->conflictTab[checkProc->waitLockMode]; diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index be44913e2a0..5f326173429 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -1469,6 +1469,16 @@ LockCheckConflicts(LockMethod lockMethodTable, return true; } + /* + * The relation extension lock conflict even between the group members. + */ + if (LOCK_LOCKTAG(*lock) == LOCKTAG_RELATION_EXTEND) + { + PROCLOCK_PRINT("LockCheckConflicts: conflicting (group)", + proclock); + return true; + } + /* * Locks held in conflicting modes by members of our own lock group are * not real conflicts; we can subtract those out and see if we still have diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index eb321f72ea4..fa07ddf4f75 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -1077,7 +1077,13 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) /* * If group locking is in use, locks held by members of my locking group - * need to be included in myHeldLocks. + * need to be included in myHeldLocks. This is not required for relation + * extension lock which conflict among group members. However, including + * them in myHeldLocks will give group members the priority to get those + * locks as compared to other backends which are also trying to acquire + * those locks. OTOH, we can avoid giving priority to group members for + * that kind of locks, but there doesn't appear to be a clear advantage of + * the same. */ if (leader != NULL) { diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h index fc0a7128807..a89e54dbb09 100644 --- a/src/include/storage/lock.h +++ b/src/include/storage/lock.h @@ -301,6 +301,7 @@ typedef struct LOCK } LOCK; #define LOCK_LOCKMETHOD(lock) ((LOCKMETHODID) (lock).tag.locktag_lockmethodid) +#define LOCK_LOCKTAG(lock) ((LockTagType) (lock).tag.locktag_type) /*