v0-0003-Reduce-size-of-PROCLOCK-by-8-bytes-on-64-bit-syst.patch
application/octet-stream
Filename: v0-0003-Reduce-size-of-PROCLOCK-by-8-bytes-on-64-bit-syst.patch
Type: application/octet-stream
Part: 2
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 v0-0003
Subject: Reduce size of PROCLOCK by 8 bytes on 64-bit systems
| File | + | − |
|---|---|---|
| src/backend/storage/lmgr/lock.c | 9 | 7 |
| src/backend/storage/lmgr/proc.c | 4 | 1 |
| src/include/storage/lock.h | 1 | 1 |
From f75f69379809f796bd8959d9d7e7d38277cacdd3 Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Wed, 20 Nov 2024 04:07:28 +0100
Subject: [PATCH v0 3/4] Reduce size of PROCLOCK by 8 bytes on 64-bit systems
---
src/include/storage/lock.h | 2 +-
src/backend/storage/lmgr/lock.c | 16 +++++++++-------
src/backend/storage/lmgr/proc.c | 5 ++++-
3 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h
index 345ded934f..b1d4f18402 100644
--- a/src/include/storage/lock.h
+++ b/src/include/storage/lock.h
@@ -386,7 +386,7 @@ typedef struct PROCLOCK
PROCLOCKTAG tag; /* unique identifier of proclock object */
/* data */
- PGPROC *groupLeader; /* proc's lock group leader, or proc itself */
+ ProcNumber groupLeader; /* proc's lock group leader, or proc itself */
LOCKMASK holdMask; /* bitmask for lock types currently held */
LOCKMASK releaseMask; /* bitmask for lock types to be released */
dlist_node lockLink; /* list link in LOCK's list of proclocks */
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 65349b1196..15e1512e75 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -1321,6 +1321,7 @@ SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc,
if (!found)
{
uint32 partition = LockHashPartition(hashcode);
+ PGPROC *leaderProc;
/*
* It might seem unsafe to access proclock->groupLeader without a
@@ -1332,8 +1333,9 @@ SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc,
* lock group leader without first releasing all of its locks (and in
* particular the one we are currently transferring).
*/
- proclock->groupLeader = proc->lockGroupLeader != NULL ?
+ leaderProc = proc->lockGroupLeader != NULL ?
proc->lockGroupLeader : proc;
+ proclock->groupLeader = GetNumberFromPGProc(leaderProc);
proclock->holdMask = 0;
proclock->releaseMask = 0;
/* Add proclock to appropriate lists */
@@ -1535,7 +1537,7 @@ LockCheckConflicts(LockMethod lockMethodTable,
}
/* If no group locking, it's definitely a conflict. */
- if (proclock->groupLeader == MyProc && MyProc->lockGroupLeader == NULL)
+ if (proclock->groupLeader == MyProcNumber && MyProc->lockGroupLeader == NULL)
{
Assert(proclock->tag.myProc == MyProc);
PROCLOCK_PRINT("LockCheckConflicts: conflicting (simple)",
@@ -3640,8 +3642,8 @@ PostPrepare_Locks(TransactionId xid)
* Update groupLeader pointer to point to the new proc. (We'd
* better not be a member of somebody else's lock group!)
*/
- Assert(proclock->groupLeader == proclock->tag.myProc);
- proclock->groupLeader = newproc;
+ Assert(proclock->groupLeader == GetNumberFromPGProc(proclock->tag.myProc));
+ proclock->groupLeader = GetNumberFromPGProc(newproc);
/*
* Update the proclock. We should not find any existing entry for
@@ -3864,7 +3866,7 @@ GetLockStatusData(void)
instance->vxid.procNumber = proc->vxid.procNumber;
instance->vxid.localTransactionId = proc->vxid.lxid;
instance->pid = proc->pid;
- instance->leaderPid = proclock->groupLeader->pid;
+ instance->leaderPid = GetPGProcByNumber(proclock->groupLeader)->pid;
instance->fastpath = false;
instance->waitStart = (TimestampTz) pg_atomic_read_u64(&proc->waitStart);
@@ -4040,7 +4042,7 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data)
instance->vxid.procNumber = proc->vxid.procNumber;
instance->vxid.localTransactionId = proc->vxid.lxid;
instance->pid = proc->pid;
- instance->leaderPid = proclock->groupLeader->pid;
+ instance->leaderPid = GetPGProcByNumber(proclock->groupLeader)->pid;
instance->fastpath = false;
data->nlocks++;
}
@@ -4394,7 +4396,7 @@ lock_twophase_recover(TransactionId xid, uint16 info,
if (!found)
{
Assert(proc->lockGroupLeader == NULL);
- proclock->groupLeader = proc;
+ proclock->groupLeader = GetNumberFromPGProc(proc);
proclock->holdMask = 0;
proclock->releaseMask = 0;
/* Add proclock to appropriate lists */
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index a359c0be21..43e79e07e2 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -1119,6 +1119,9 @@ JoinWaitQueue(LOCALLOCK *locallock, LockMethod lockMethodTable, bool dontWait)
if (leader != NULL)
{
dlist_iter iter;
+ ProcNumber leaderNo;
+
+ leaderNo = GetNumberFromPGProc(leader);
dlist_foreach(iter, &lock->procLocks)
{
@@ -1126,7 +1129,7 @@ JoinWaitQueue(LOCALLOCK *locallock, LockMethod lockMethodTable, bool dontWait)
otherproclock = dlist_container(PROCLOCK, lockLink, iter.cur);
- if (otherproclock->groupLeader == leader)
+ if (otherproclock->groupLeader == leaderNo)
myHeldLocks |= otherproclock->holdMask;
}
}
--
2.45.2