From f75f69379809f796bd8959d9d7e7d38277cacdd3 Mon Sep 17 00:00:00 2001 From: Matthias van de Meent 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