Skip to content

Commit b319356

Browse files
committed
Migrate PGPROC's backendLock into PGPROC itself, using a new tranche.
Previously, each PGPROC's backendLock was part of the main tranche, and the PGPROC just contained a pointer. Now, the actual LWLock is part of the PGPROC. As with previous, similar patches, this makes it significantly easier to identify these lwlocks in LWLOCK_STATS or Trace_lwlocks output and improves modularity. Author: Ildus Kurbangaliev Reviewed-by: Amit Kapila, Robert Haas
1 parent b603766 commit b319356

File tree

6 files changed

+42
-34
lines changed

6 files changed

+42
-34
lines changed

src/backend/storage/ipc/procarray.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ static TransactionId *KnownAssignedXids;
106106
static bool *KnownAssignedXidsValid;
107107
static TransactionId latestObservedXid = InvalidTransactionId;
108108

109+
/* LWLock tranche for backend locks */
110+
static LWLockTranche ProcLWLockTranche;
111+
109112
/*
110113
* If we're in STANDBY_SNAPSHOT_PENDING state, standbySnapshotPendingXmin is
111114
* the highest xid that might still be running that we don't have in
@@ -261,6 +264,13 @@ CreateSharedProcArray(void)
261264
mul_size(sizeof(bool), TOTAL_MAX_CACHED_SUBXIDS),
262265
&found);
263266
}
267+
268+
/* Register and initialize fields of ProcLWLockTranche */
269+
ProcLWLockTranche.name = "proc";
270+
ProcLWLockTranche.array_base = (char *) (ProcGlobal->allProcs) +
271+
offsetof(PGPROC, backendLock);
272+
ProcLWLockTranche.array_stride = sizeof(PGPROC);
273+
LWLockRegisterTranche(LWTRANCHE_PROC, &ProcLWLockTranche);
264274
}
265275

266276
/*

src/backend/storage/lmgr/lock.c

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -825,13 +825,13 @@ LockAcquireExtended(const LOCKTAG *locktag,
825825
* FastPathStrongRelationLocks->counts becomes visible after we test
826826
* it has yet to begin to transfer fast-path locks.
827827
*/
828-
LWLockAcquire(MyProc->backendLock, LW_EXCLUSIVE);
828+
LWLockAcquire(&MyProc->backendLock, LW_EXCLUSIVE);
829829
if (FastPathStrongRelationLocks->count[fasthashcode] != 0)
830830
acquired = false;
831831
else
832832
acquired = FastPathGrantRelationLock(locktag->locktag_field2,
833833
lockmode);
834-
LWLockRelease(MyProc->backendLock);
834+
LWLockRelease(&MyProc->backendLock);
835835
if (acquired)
836836
{
837837
/*
@@ -1838,10 +1838,10 @@ LockRelease(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
18381838
* We might not find the lock here, even if we originally entered it
18391839
* here. Another backend may have moved it to the main table.
18401840
*/
1841-
LWLockAcquire(MyProc->backendLock, LW_EXCLUSIVE);
1841+
LWLockAcquire(&MyProc->backendLock, LW_EXCLUSIVE);
18421842
released = FastPathUnGrantRelationLock(locktag->locktag_field2,
18431843
lockmode);
1844-
LWLockRelease(MyProc->backendLock);
1844+
LWLockRelease(&MyProc->backendLock);
18451845
if (released)
18461846
{
18471847
RemoveLocalLock(locallock);
@@ -2044,7 +2044,7 @@ LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
20442044
*/
20452045
if (!have_fast_path_lwlock)
20462046
{
2047-
LWLockAcquire(MyProc->backendLock, LW_EXCLUSIVE);
2047+
LWLockAcquire(&MyProc->backendLock, LW_EXCLUSIVE);
20482048
have_fast_path_lwlock = true;
20492049
}
20502050

@@ -2061,7 +2061,7 @@ LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
20612061
* transferred to the main lock table. That's going to require
20622062
* some extra work, so release our fast-path lock before starting.
20632063
*/
2064-
LWLockRelease(MyProc->backendLock);
2064+
LWLockRelease(&MyProc->backendLock);
20652065
have_fast_path_lwlock = false;
20662066

20672067
/*
@@ -2087,7 +2087,7 @@ LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
20872087

20882088
/* Done with the fast-path data structures */
20892089
if (have_fast_path_lwlock)
2090-
LWLockRelease(MyProc->backendLock);
2090+
LWLockRelease(&MyProc->backendLock);
20912091

20922092
/*
20932093
* Now, scan each lock partition separately.
@@ -2490,7 +2490,7 @@ FastPathTransferRelationLocks(LockMethod lockMethodTable, const LOCKTAG *locktag
24902490
PGPROC *proc = &ProcGlobal->allProcs[i];
24912491
uint32 f;
24922492

2493-
LWLockAcquire(proc->backendLock, LW_EXCLUSIVE);
2493+
LWLockAcquire(&proc->backendLock, LW_EXCLUSIVE);
24942494

24952495
/*
24962496
* If the target backend isn't referencing the same database as the
@@ -2499,7 +2499,7 @@ FastPathTransferRelationLocks(LockMethod lockMethodTable, const LOCKTAG *locktag
24992499
*
25002500
* proc->databaseId is set at backend startup time and never changes
25012501
* thereafter, so it might be safe to perform this test before
2502-
* acquiring proc->backendLock. In particular, it's certainly safe to
2502+
* acquiring &proc->backendLock. In particular, it's certainly safe to
25032503
* assume that if the target backend holds any fast-path locks, it
25042504
* must have performed a memory-fencing operation (in particular, an
25052505
* LWLock acquisition) since setting proc->databaseId. However, it's
@@ -2509,7 +2509,7 @@ FastPathTransferRelationLocks(LockMethod lockMethodTable, const LOCKTAG *locktag
25092509
*/
25102510
if (proc->databaseId != locktag->locktag_field1)
25112511
{
2512-
LWLockRelease(proc->backendLock);
2512+
LWLockRelease(&proc->backendLock);
25132513
continue;
25142514
}
25152515

@@ -2536,7 +2536,7 @@ FastPathTransferRelationLocks(LockMethod lockMethodTable, const LOCKTAG *locktag
25362536
if (!proclock)
25372537
{
25382538
LWLockRelease(partitionLock);
2539-
LWLockRelease(proc->backendLock);
2539+
LWLockRelease(&proc->backendLock);
25402540
return false;
25412541
}
25422542
GrantLock(proclock->tag.myLock, proclock, lockmode);
@@ -2547,7 +2547,7 @@ FastPathTransferRelationLocks(LockMethod lockMethodTable, const LOCKTAG *locktag
25472547
/* No need to examine remaining slots. */
25482548
break;
25492549
}
2550-
LWLockRelease(proc->backendLock);
2550+
LWLockRelease(&proc->backendLock);
25512551
}
25522552
return true;
25532553
}
@@ -2569,7 +2569,7 @@ FastPathGetRelationLockEntry(LOCALLOCK *locallock)
25692569
Oid relid = locktag->locktag_field2;
25702570
uint32 f;
25712571

2572-
LWLockAcquire(MyProc->backendLock, LW_EXCLUSIVE);
2572+
LWLockAcquire(&MyProc->backendLock, LW_EXCLUSIVE);
25732573

25742574
for (f = 0; f < FP_LOCK_SLOTS_PER_BACKEND; f++)
25752575
{
@@ -2592,7 +2592,7 @@ FastPathGetRelationLockEntry(LOCALLOCK *locallock)
25922592
if (!proclock)
25932593
{
25942594
LWLockRelease(partitionLock);
2595-
LWLockRelease(MyProc->backendLock);
2595+
LWLockRelease(&MyProc->backendLock);
25962596
ereport(ERROR,
25972597
(errcode(ERRCODE_OUT_OF_MEMORY),
25982598
errmsg("out of shared memory"),
@@ -2607,7 +2607,7 @@ FastPathGetRelationLockEntry(LOCALLOCK *locallock)
26072607
break;
26082608
}
26092609

2610-
LWLockRelease(MyProc->backendLock);
2610+
LWLockRelease(&MyProc->backendLock);
26112611

26122612
/* Lock may have already been transferred by some other backend. */
26132613
if (proclock == NULL)
@@ -2732,7 +2732,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode)
27322732
if (proc == MyProc)
27332733
continue;
27342734

2735-
LWLockAcquire(proc->backendLock, LW_SHARED);
2735+
LWLockAcquire(&proc->backendLock, LW_SHARED);
27362736

27372737
/*
27382738
* If the target backend isn't referencing the same database as
@@ -2744,7 +2744,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode)
27442744
*/
27452745
if (proc->databaseId != locktag->locktag_field1)
27462746
{
2747-
LWLockRelease(proc->backendLock);
2747+
LWLockRelease(&proc->backendLock);
27482748
continue;
27492749
}
27502750

@@ -2782,7 +2782,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode)
27822782
break;
27832783
}
27842784

2785-
LWLockRelease(proc->backendLock);
2785+
LWLockRelease(&proc->backendLock);
27862786
}
27872787
}
27882788

@@ -3332,7 +3332,7 @@ GetLockStatusData(void)
33323332
PGPROC *proc = &ProcGlobal->allProcs[i];
33333333
uint32 f;
33343334

3335-
LWLockAcquire(proc->backendLock, LW_SHARED);
3335+
LWLockAcquire(&proc->backendLock, LW_SHARED);
33363336

33373337
for (f = 0; f < FP_LOCK_SLOTS_PER_BACKEND; ++f)
33383338
{
@@ -3390,7 +3390,7 @@ GetLockStatusData(void)
33903390
el++;
33913391
}
33923392

3393-
LWLockRelease(proc->backendLock);
3393+
LWLockRelease(&proc->backendLock);
33943394
}
33953395

33963396
/*
@@ -3930,7 +3930,7 @@ VirtualXactLockTableInsert(VirtualTransactionId vxid)
39303930
{
39313931
Assert(VirtualTransactionIdIsValid(vxid));
39323932

3933-
LWLockAcquire(MyProc->backendLock, LW_EXCLUSIVE);
3933+
LWLockAcquire(&MyProc->backendLock, LW_EXCLUSIVE);
39343934

39353935
Assert(MyProc->backendId == vxid.backendId);
39363936
Assert(MyProc->fpLocalTransactionId == InvalidLocalTransactionId);
@@ -3939,7 +3939,7 @@ VirtualXactLockTableInsert(VirtualTransactionId vxid)
39393939
MyProc->fpVXIDLock = true;
39403940
MyProc->fpLocalTransactionId = vxid.localTransactionId;
39413941

3942-
LWLockRelease(MyProc->backendLock);
3942+
LWLockRelease(&MyProc->backendLock);
39433943
}
39443944

39453945
/*
@@ -3959,14 +3959,14 @@ VirtualXactLockTableCleanup(void)
39593959
/*
39603960
* Clean up shared memory state.
39613961
*/
3962-
LWLockAcquire(MyProc->backendLock, LW_EXCLUSIVE);
3962+
LWLockAcquire(&MyProc->backendLock, LW_EXCLUSIVE);
39633963

39643964
fastpath = MyProc->fpVXIDLock;
39653965
lxid = MyProc->fpLocalTransactionId;
39663966
MyProc->fpVXIDLock = false;
39673967
MyProc->fpLocalTransactionId = InvalidLocalTransactionId;
39683968

3969-
LWLockRelease(MyProc->backendLock);
3969+
LWLockRelease(&MyProc->backendLock);
39703970

39713971
/*
39723972
* If fpVXIDLock has been cleared without touching fpLocalTransactionId,
@@ -4022,13 +4022,13 @@ VirtualXactLock(VirtualTransactionId vxid, bool wait)
40224022
* against the ones we're waiting for. The target backend will only set
40234023
* or clear lxid while holding this lock.
40244024
*/
4025-
LWLockAcquire(proc->backendLock, LW_EXCLUSIVE);
4025+
LWLockAcquire(&proc->backendLock, LW_EXCLUSIVE);
40264026

40274027
/* If the transaction has ended, our work here is done. */
40284028
if (proc->backendId != vxid.backendId
40294029
|| proc->fpLocalTransactionId != vxid.localTransactionId)
40304030
{
4031-
LWLockRelease(proc->backendLock);
4031+
LWLockRelease(&proc->backendLock);
40324032
return true;
40334033
}
40344034

@@ -4038,7 +4038,7 @@ VirtualXactLock(VirtualTransactionId vxid, bool wait)
40384038
*/
40394039
if (!wait)
40404040
{
4041-
LWLockRelease(proc->backendLock);
4041+
LWLockRelease(&proc->backendLock);
40424042
return false;
40434043
}
40444044

@@ -4063,7 +4063,7 @@ VirtualXactLock(VirtualTransactionId vxid, bool wait)
40634063
if (!proclock)
40644064
{
40654065
LWLockRelease(partitionLock);
4066-
LWLockRelease(proc->backendLock);
4066+
LWLockRelease(&proc->backendLock);
40674067
ereport(ERROR,
40684068
(errcode(ERRCODE_OUT_OF_MEMORY),
40694069
errmsg("out of shared memory"),
@@ -4077,7 +4077,7 @@ VirtualXactLock(VirtualTransactionId vxid, bool wait)
40774077
}
40784078

40794079
/* Done with proc->fpLockBits */
4080-
LWLockRelease(proc->backendLock);
4080+
LWLockRelease(&proc->backendLock);
40814081

40824082
/* Time to wait. */
40834083
(void) LockAcquire(&tag, ShareLock, false, false);

src/backend/storage/lmgr/lwlock.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,6 @@ NumLWLocks(void)
353353
/* Predefined LWLocks */
354354
numLocks = NUM_FIXED_LWLOCKS;
355355

356-
/* proc.c needs one for each backend or auxiliary process */
357-
numLocks += MaxBackends + NUM_AUXILIARY_PROCS;
358-
359356
/* slot.c needs one for each slot */
360357
numLocks += max_replication_slots;
361358

src/backend/storage/lmgr/proc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ InitProcGlobal(void)
226226
{
227227
PGSemaphoreCreate(&(procs[i].sem));
228228
InitSharedLatch(&(procs[i].procLatch));
229-
procs[i].backendLock = LWLockAssign();
229+
LWLockInitialize(&(procs[i].backendLock), LWTRANCHE_PROC);
230230
}
231231
procs[i].pgprocno = i;
232232

src/include/storage/lwlock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ typedef enum BuiltinTrancheIds
213213
LWTRANCHE_WAL_INSERT,
214214
LWTRANCHE_BUFFER_CONTENT,
215215
LWTRANCHE_BUFFER_IO_IN_PROGRESS,
216+
LWTRANCHE_PROC,
216217
LWTRANCHE_FIRST_USER_DEFINED
217218
} BuiltinTrancheIds;
218219

src/include/storage/proc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ struct PGPROC
147147
TransactionId backendLatestXid;
148148

149149
/* Per-backend LWLock. Protects fields below. */
150-
LWLock *backendLock; /* protects the fields below */
150+
LWLock backendLock;
151151

152152
/* Lock manager data, recording fast-path locks taken by this backend. */
153153
uint64 fpLockBits; /* lock modes held for each fast-path slot */

0 commit comments

Comments
 (0)