mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
snapshot scalability: Move PGXACT->vacuumFlags to ProcGlobal->vacuumFlags.
Similar to the previous commit this increases the chance that data frequently needed by GetSnapshotData() stays in l2 cache. As we now take care to not unnecessarily write to ProcGlobal->vacuumFlags, there should be very few modifications to the ProcGlobal->vacuumFlags array. Author: Andres Freund <andres@anarazel.de> Reviewed-By: Robert Haas <robertmhaas@gmail.com> Reviewed-By: Thomas Munro <thomas.munro@gmail.com> Reviewed-By: David Rowley <dgrowleyml@gmail.com> Discussion: https://postgr.es/m/20200301083601.ews6hz5dduc3w2se@alap3.anarazel.de
This commit is contained in:
@@ -544,7 +544,6 @@ FindLockCycleRecurseMember(PGPROC *checkProc,
|
||||
{
|
||||
PGPROC *proc;
|
||||
LOCK *lock = checkProc->waitLock;
|
||||
PGXACT *pgxact;
|
||||
PROCLOCK *proclock;
|
||||
SHM_QUEUE *procLocks;
|
||||
LockMethod lockMethodTable;
|
||||
@@ -582,7 +581,6 @@ FindLockCycleRecurseMember(PGPROC *checkProc,
|
||||
PGPROC *leader;
|
||||
|
||||
proc = proclock->tag.myProc;
|
||||
pgxact = &ProcGlobal->allPgXact[proc->pgprocno];
|
||||
leader = proc->lockGroupLeader == NULL ? proc : proc->lockGroupLeader;
|
||||
|
||||
/* A proc never blocks itself or any other lock group member */
|
||||
@@ -630,7 +628,7 @@ FindLockCycleRecurseMember(PGPROC *checkProc,
|
||||
* ProcArrayLock.
|
||||
*/
|
||||
if (checkProc == MyProc &&
|
||||
pgxact->vacuumFlags & PROC_IS_AUTOVACUUM)
|
||||
proc->vacuumFlags & PROC_IS_AUTOVACUUM)
|
||||
blocking_autovacuum_proc = proc;
|
||||
|
||||
/* We're done looking at this proclock */
|
||||
|
@@ -114,6 +114,7 @@ ProcGlobalShmemSize(void)
|
||||
size = add_size(size, mul_size(NUM_AUXILIARY_PROCS, sizeof(PGXACT)));
|
||||
size = add_size(size, mul_size(max_prepared_xacts, sizeof(PGXACT)));
|
||||
size = add_size(size, mul_size(TotalProcs, sizeof(*ProcGlobal->xids)));
|
||||
size = add_size(size, mul_size(TotalProcs, sizeof(*ProcGlobal->vacuumFlags)));
|
||||
|
||||
return size;
|
||||
}
|
||||
@@ -223,6 +224,8 @@ InitProcGlobal(void)
|
||||
ProcGlobal->xids =
|
||||
(TransactionId *) ShmemAlloc(TotalProcs * sizeof(*ProcGlobal->xids));
|
||||
MemSet(ProcGlobal->xids, 0, TotalProcs * sizeof(*ProcGlobal->xids));
|
||||
ProcGlobal->vacuumFlags = (uint8 *) ShmemAlloc(TotalProcs * sizeof(*ProcGlobal->vacuumFlags));
|
||||
MemSet(ProcGlobal->vacuumFlags, 0, TotalProcs * sizeof(*ProcGlobal->vacuumFlags));
|
||||
|
||||
for (i = 0; i < TotalProcs; i++)
|
||||
{
|
||||
@@ -405,10 +408,10 @@ InitProcess(void)
|
||||
MyProc->tempNamespaceId = InvalidOid;
|
||||
MyProc->isBackgroundWorker = IsBackgroundWorker;
|
||||
MyProc->delayChkpt = false;
|
||||
MyPgXact->vacuumFlags = 0;
|
||||
MyProc->vacuumFlags = 0;
|
||||
/* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */
|
||||
if (IsAutoVacuumWorkerProcess())
|
||||
MyPgXact->vacuumFlags |= PROC_IS_AUTOVACUUM;
|
||||
MyProc->vacuumFlags |= PROC_IS_AUTOVACUUM;
|
||||
MyProc->lwWaiting = false;
|
||||
MyProc->lwWaitMode = 0;
|
||||
MyProc->waitLock = NULL;
|
||||
@@ -587,7 +590,7 @@ InitAuxiliaryProcess(void)
|
||||
MyProc->tempNamespaceId = InvalidOid;
|
||||
MyProc->isBackgroundWorker = IsBackgroundWorker;
|
||||
MyProc->delayChkpt = false;
|
||||
MyPgXact->vacuumFlags = 0;
|
||||
MyProc->vacuumFlags = 0;
|
||||
MyProc->lwWaiting = false;
|
||||
MyProc->lwWaitMode = 0;
|
||||
MyProc->waitLock = NULL;
|
||||
@@ -1323,7 +1326,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
|
||||
if (deadlock_state == DS_BLOCKED_BY_AUTOVACUUM && allow_autovacuum_cancel)
|
||||
{
|
||||
PGPROC *autovac = GetBlockingAutoVacuumPgproc();
|
||||
PGXACT *autovac_pgxact = &ProcGlobal->allPgXact[autovac->pgprocno];
|
||||
uint8 vacuumFlags;
|
||||
|
||||
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
|
||||
|
||||
@@ -1331,8 +1334,9 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
|
||||
* Only do it if the worker is not working to protect against Xid
|
||||
* wraparound.
|
||||
*/
|
||||
if ((autovac_pgxact->vacuumFlags & PROC_IS_AUTOVACUUM) &&
|
||||
!(autovac_pgxact->vacuumFlags & PROC_VACUUM_FOR_WRAPAROUND))
|
||||
vacuumFlags = ProcGlobal->vacuumFlags[proc->pgxactoff];
|
||||
if ((vacuumFlags & PROC_IS_AUTOVACUUM) &&
|
||||
!(vacuumFlags & PROC_VACUUM_FOR_WRAPAROUND))
|
||||
{
|
||||
int pid = autovac->pid;
|
||||
StringInfoData locktagbuf;
|
||||
|
Reference in New Issue
Block a user