Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf63940d

Browse files
robertmhaasAlexander Korotkov
authored and
Alexander Korotkov
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 ispart of the PGPROC.As with previous, similar patches, this makes it significantly easierto identify these lwlocks in LWLOCK_STATS or Trace_lwlocks outputand improves modularity.Author: Ildus KurbangalievReviewed-by: Amit Kapila, Robert Haas
1 parent37b7fc0 commitf63940d

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
staticbool*KnownAssignedXidsValid;
107107
staticTransactionIdlatestObservedXid=InvalidTransactionId;
108108

109+
/* LWLock tranche for backend locks */
110+
staticLWLockTrancheProcLWLockTranche;
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
@@ -258,6 +261,13 @@ CreateSharedProcArray(void)
258261
mul_size(sizeof(bool),TOTAL_MAX_CACHED_SUBXIDS),
259262
&found);
260263
}
264+
265+
/* Register and initialize fields of ProcLWLockTranche */
266+
ProcLWLockTranche.name="proc";
267+
ProcLWLockTranche.array_base= (char*) (ProcGlobal->allProcs)+
268+
offsetof(PGPROC,backendLock);
269+
ProcLWLockTranche.array_stride=sizeof(PGPROC);
270+
LWLockRegisterTranche(LWTRANCHE_PROC,&ProcLWLockTranche);
261271
}
262272

263273
/*

‎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
uint32f;
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
Oidrelid=locktag->locktag_field2;
25702570
uint32f;
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
uint32f;
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
@@ -225,7 +225,7 @@ InitProcGlobal(void)
225225
{
226226
PGSemaphoreCreate(&(procs[i].sem));
227227
InitSharedLatch(&(procs[i].procLatch));
228-
procs[i].backendLock=LWLockAssign();
228+
LWLockInitialize(&(procs[i].backendLock),LWTRANCHE_PROC);
229229
}
230230
procs[i].pgprocno=i;
231231

‎src/include/storage/lwlock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ typedef enum BuiltinTrancheIds
209209
LWTRANCHE_WAL_INSERT,
210210
LWTRANCHE_BUFFER_CONTENT,
211211
LWTRANCHE_BUFFER_IO_IN_PROGRESS,
212+
LWTRANCHE_PROC,
212213
LWTRANCHE_FIRST_USER_DEFINED
213214
}BuiltinTrancheIds;
214215

‎src/include/storage/proc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ struct PGPROC
135135
structXidCachesubxids;/* cache for subtransaction XIDs */
136136

137137
/* Per-backend LWLock. Protects fields below. */
138-
LWLock*backendLock;/* protects the fields below */
138+
LWLockbackendLock;
139139

140140
/* Lock manager data, recording fast-path locks taken by this backend. */
141141
uint64fpLockBits;/* lock modes held for each fast-path slot */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp