From 22f7bc63f25fbdaa218e64330fd3d13c865da654 Mon Sep 17 00:00:00 2001 From: Mahendra Singh Thalor Date: Tue, 3 Mar 2020 04:15:18 -0800 Subject: [PATCH 1/2] Conflict EXTENTION lock in group member --- src/backend/storage/lmgr/deadlock.c | 9 +++++++++ src/backend/storage/lmgr/lock.c | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/src/backend/storage/lmgr/deadlock.c b/src/backend/storage/lmgr/deadlock.c index f8c5df08e6..8bff91b495 100644 --- a/src/backend/storage/lmgr/deadlock.c +++ b/src/backend/storage/lmgr/deadlock.c @@ -568,6 +568,15 @@ FindLockCycleRecurseMember(PGPROC *checkProc, proclock = (PROCLOCK *) SHMQueueNext(procLocks, procLocks, offsetof(PROCLOCK, lockLink)); + /* + * After acquiring relation extension lock we don't acquire any other + * heavyweight lock so relation extension lock never participate in actual + * deadlock cycle. So avoid the wait edge for this type of lock so that + * we can avoid any false cycle detection due to group locking. + */ + if (lock->tag.locktag_type == LOCKTAG_RELATION_EXTEND) + return false; + while (proclock) { PGPROC *leader; diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index 56dba09299..ef14655cf8 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -1403,6 +1403,14 @@ LockCheckConflicts(LockMethod lockMethodTable, return true; } + /* If it's a relation extension lock. */ + if (lock->tag.locktag_type == LOCKTAG_RELATION_EXTEND) + { + PROCLOCK_PRINT("LockCheckConflicts: conflicting (simple)", + 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 -- 2.17.1