v02_0002-Conflict-EXTENTION-lock-in-group-member.patch
application/octet-stream
Filename: v02_0002-Conflict-EXTENTION-lock-in-group-member.patch
Type: application/octet-stream
Part: 1
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 v2-0002
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