From 22f7bc63f25fbdaa218e64330fd3d13c865da654 Mon Sep 17 00:00:00 2001
From: Mahendra Singh Thalor <mahi6run@gmail.com>
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

