v01_0001-Conflict-EXTENTION-lock-in-group-member.patch

application/octet-stream

Filename: v01_0001-Conflict-EXTENTION-lock-in-group-member.patch
Type: application/octet-stream
Part: 0
Message: Re: [HACKERS] Moving relation extension locks out of heavyweight lock manager

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v1-0001
Subject: Conflict EXTENTION lock in group member
File+
src/backend/storage/lmgr/deadlock.c 9 0
src/backend/storage/lmgr/lock.c 8 0
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