diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2020-05-15 14:28:19 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2020-05-15 14:28:25 -0400 |
commit | 5da14938f7bfb96b648ee3c47e7ea2afca5bcc4a (patch) | |
tree | a637e548f3a39f0ebaef513f870964eb5dcecec9 /src/backend/access/transam | |
parent | 756abe2bc7608b38c579c510eb66f2bd80d10785 (diff) | |
download | postgresql-5da14938f7bfb96b648ee3c47e7ea2afca5bcc4a.tar.gz postgresql-5da14938f7bfb96b648ee3c47e7ea2afca5bcc4a.zip |
Rename SLRU structures and associated LWLocks.
Originally, the names assigned to SLRUs had no purpose other than
being shmem lookup keys, so not a lot of thought went into them.
As of v13, though, we're exposing them in the pg_stat_slru view and
the pg_stat_reset_slru function, so it seems advisable to take a bit
more care. Rename them to names based on the associated on-disk
storage directories (which fortunately we *did* think about, to some
extent; since those are also visible to DBAs, consistency seems like
a good thing). Also rename the associated LWLocks, since those names
are likewise user-exposed now as wait event names.
For the most part I only touched symbols used in the respective modules'
SimpleLruInit() calls, not the names of other related objects. This
renaming could have been taken further, and maybe someday we will do so.
But for now it seems undesirable to change the names of any globally
visible functions or structs, so some inconsistency is unavoidable.
(But I *did* terminate "oldserxid" with prejudice, as I found that
name both unreadable and not descriptive of the SLRU's contents.)
Table 27.12 needs re-alphabetization now, but I'll leave that till
after the other LWLock renamings I have in mind.
Discussion: https://postgr.es/m/28683.1589405363@sss.pgh.pa.us
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r-- | src/backend/access/transam/clog.c | 116 | ||||
-rw-r--r-- | src/backend/access/transam/commit_ts.c | 34 | ||||
-rw-r--r-- | src/backend/access/transam/multixact.c | 76 | ||||
-rw-r--r-- | src/backend/access/transam/slru.c | 11 | ||||
-rw-r--r-- | src/backend/access/transam/subtrans.c | 24 | ||||
-rw-r--r-- | src/backend/access/transam/varsup.c | 8 |
6 files changed, 140 insertions, 129 deletions
diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index f8e7670f8da..23bc1f8d4c1 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -83,9 +83,9 @@ /* * Link to shared-memory data structures for CLOG control */ -static SlruCtlData ClogCtlData; +static SlruCtlData XactCtlData; -#define ClogCtl (&ClogCtlData) +#define XactCtl (&XactCtlData) static int ZeroCLOGPage(int pageno, bool writeXlog); @@ -280,10 +280,10 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, "group clog threshold less than PGPROC cached subxids"); /* - * When there is contention on CLogControlLock, we try to group multiple + * When there is contention on XactSLRULock, we try to group multiple * updates; a single leader process will perform transaction status - * updates for multiple backends so that the number of times - * CLogControlLock needs to be acquired is reduced. + * updates for multiple backends so that the number of times XactSLRULock + * needs to be acquired is reduced. * * For this optimization to be safe, the XID in MyPgXact and the subxids * in MyProc must be the same as the ones for which we're setting the @@ -300,17 +300,17 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, nsubxids * sizeof(TransactionId)) == 0) { /* - * If we can immediately acquire CLogControlLock, we update the status - * of our own XID and release the lock. If not, try use group XID + * If we can immediately acquire XactSLRULock, we update the status of + * our own XID and release the lock. If not, try use group XID * update. If that doesn't work out, fall back to waiting for the * lock to perform an update for this transaction only. */ - if (LWLockConditionalAcquire(CLogControlLock, LW_EXCLUSIVE)) + if (LWLockConditionalAcquire(XactSLRULock, LW_EXCLUSIVE)) { /* Got the lock without waiting! Do the update. */ TransactionIdSetPageStatusInternal(xid, nsubxids, subxids, status, lsn, pageno); - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); return; } else if (TransactionGroupUpdateXidStatus(xid, status, lsn, pageno)) @@ -323,10 +323,10 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, } /* Group update not applicable, or couldn't accept this page number. */ - LWLockAcquire(CLogControlLock, LW_EXCLUSIVE); + LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); TransactionIdSetPageStatusInternal(xid, nsubxids, subxids, status, lsn, pageno); - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); } /* @@ -345,7 +345,7 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, Assert(status == TRANSACTION_STATUS_COMMITTED || status == TRANSACTION_STATUS_ABORTED || (status == TRANSACTION_STATUS_SUB_COMMITTED && !TransactionIdIsValid(xid))); - Assert(LWLockHeldByMeInMode(CLogControlLock, LW_EXCLUSIVE)); + Assert(LWLockHeldByMeInMode(XactSLRULock, LW_EXCLUSIVE)); /* * If we're doing an async commit (ie, lsn is valid), then we must wait @@ -356,7 +356,7 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, * write-busy, since we don't care if the update reaches disk sooner than * we think. */ - slotno = SimpleLruReadPage(ClogCtl, pageno, XLogRecPtrIsInvalid(lsn), xid); + slotno = SimpleLruReadPage(XactCtl, pageno, XLogRecPtrIsInvalid(lsn), xid); /* * Set the main transaction id, if any. @@ -374,7 +374,7 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, { for (i = 0; i < nsubxids; i++) { - Assert(ClogCtl->shared->page_number[slotno] == TransactionIdToPage(subxids[i])); + Assert(XactCtl->shared->page_number[slotno] == TransactionIdToPage(subxids[i])); TransactionIdSetStatusBit(subxids[i], TRANSACTION_STATUS_SUB_COMMITTED, lsn, slotno); @@ -388,20 +388,20 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, /* Set the subtransactions */ for (i = 0; i < nsubxids; i++) { - Assert(ClogCtl->shared->page_number[slotno] == TransactionIdToPage(subxids[i])); + Assert(XactCtl->shared->page_number[slotno] == TransactionIdToPage(subxids[i])); TransactionIdSetStatusBit(subxids[i], status, lsn, slotno); } - ClogCtl->shared->page_dirty[slotno] = true; + XactCtl->shared->page_dirty[slotno] = true; } /* - * When we cannot immediately acquire CLogControlLock in exclusive mode at + * When we cannot immediately acquire XactSLRULock in exclusive mode at * commit time, add ourselves to a list of processes that need their XIDs * status update. The first process to add itself to the list will acquire - * CLogControlLock in exclusive mode and set transaction status as required + * XactSLRULock in exclusive mode and set transaction status as required * on behalf of all group members. This avoids a great deal of contention - * around CLogControlLock when many processes are trying to commit at once, + * around XactSLRULock when many processes are trying to commit at once, * since the lock need not be repeatedly handed off from one committing * process to the next. * @@ -493,7 +493,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, } /* We are the leader. Acquire the lock on behalf of everyone. */ - LWLockAcquire(CLogControlLock, LW_EXCLUSIVE); + LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); /* * Now that we've got the lock, clear the list of processes waiting for @@ -530,7 +530,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, } /* We're done with the lock now. */ - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); /* * Now that we've released the lock, go back and wake everybody up. We @@ -559,7 +559,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, /* * Sets the commit status of a single transaction. * - * Must be called with CLogControlLock held + * Must be called with XactSLRULock held */ static void TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, int slotno) @@ -570,7 +570,7 @@ TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, i char byteval; char curval; - byteptr = ClogCtl->shared->page_buffer[slotno] + byteno; + byteptr = XactCtl->shared->page_buffer[slotno] + byteno; curval = (*byteptr >> bshift) & CLOG_XACT_BITMASK; /* @@ -610,8 +610,8 @@ TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, i { int lsnindex = GetLSNIndex(slotno, xid); - if (ClogCtl->shared->group_lsn[lsnindex] < lsn) - ClogCtl->shared->group_lsn[lsnindex] = lsn; + if (XactCtl->shared->group_lsn[lsnindex] < lsn) + XactCtl->shared->group_lsn[lsnindex] = lsn; } } @@ -643,15 +643,15 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn) /* lock is acquired by SimpleLruReadPage_ReadOnly */ - slotno = SimpleLruReadPage_ReadOnly(ClogCtl, pageno, xid); - byteptr = ClogCtl->shared->page_buffer[slotno] + byteno; + slotno = SimpleLruReadPage_ReadOnly(XactCtl, pageno, xid); + byteptr = XactCtl->shared->page_buffer[slotno] + byteno; status = (*byteptr >> bshift) & CLOG_XACT_BITMASK; lsnindex = GetLSNIndex(slotno, xid); - *lsn = ClogCtl->shared->group_lsn[lsnindex]; + *lsn = XactCtl->shared->group_lsn[lsnindex]; - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); return status; } @@ -690,9 +690,9 @@ CLOGShmemSize(void) void CLOGShmemInit(void) { - ClogCtl->PagePrecedes = CLOGPagePrecedes; - SimpleLruInit(ClogCtl, "clog", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE, - CLogControlLock, "pg_xact", LWTRANCHE_CLOG_BUFFERS); + XactCtl->PagePrecedes = CLOGPagePrecedes; + SimpleLruInit(XactCtl, "Xact", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE, + XactSLRULock, "pg_xact", LWTRANCHE_XACT_BUFFER); } /* @@ -706,16 +706,16 @@ BootStrapCLOG(void) { int slotno; - LWLockAcquire(CLogControlLock, LW_EXCLUSIVE); + LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); /* Create and zero the first page of the commit log */ slotno = ZeroCLOGPage(0, false); /* Make sure it's written out */ - SimpleLruWritePage(ClogCtl, slotno); - Assert(!ClogCtl->shared->page_dirty[slotno]); + SimpleLruWritePage(XactCtl, slotno); + Assert(!XactCtl->shared->page_dirty[slotno]); - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); } /* @@ -732,7 +732,7 @@ ZeroCLOGPage(int pageno, bool writeXlog) { int slotno; - slotno = SimpleLruZeroPage(ClogCtl, pageno); + slotno = SimpleLruZeroPage(XactCtl, pageno); if (writeXlog) WriteZeroPageXlogRec(pageno); @@ -750,14 +750,14 @@ StartupCLOG(void) TransactionId xid = XidFromFullTransactionId(ShmemVariableCache->nextFullXid); int pageno = TransactionIdToPage(xid); - LWLockAcquire(CLogControlLock, LW_EXCLUSIVE); + LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); /* * Initialize our idea of the latest page number. */ - ClogCtl->shared->latest_page_number = pageno; + XactCtl->shared->latest_page_number = pageno; - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); } /* @@ -769,12 +769,12 @@ TrimCLOG(void) TransactionId xid = XidFromFullTransactionId(ShmemVariableCache->nextFullXid); int pageno = TransactionIdToPage(xid); - LWLockAcquire(CLogControlLock, LW_EXCLUSIVE); + LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); /* * Re-Initialize our idea of the latest page number. */ - ClogCtl->shared->latest_page_number = pageno; + XactCtl->shared->latest_page_number = pageno; /* * Zero out the remainder of the current clog page. Under normal @@ -795,18 +795,18 @@ TrimCLOG(void) int slotno; char *byteptr; - slotno = SimpleLruReadPage(ClogCtl, pageno, false, xid); - byteptr = ClogCtl->shared->page_buffer[slotno] + byteno; + slotno = SimpleLruReadPage(XactCtl, pageno, false, xid); + byteptr = XactCtl->shared->page_buffer[slotno] + byteno; /* Zero so-far-unused positions in the current byte */ *byteptr &= (1 << bshift) - 1; /* Zero the rest of the page */ MemSet(byteptr + 1, 0, BLCKSZ - byteno - 1); - ClogCtl->shared->page_dirty[slotno] = true; + XactCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); } /* @@ -817,7 +817,7 @@ ShutdownCLOG(void) { /* Flush dirty CLOG pages to disk */ TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(false); - SimpleLruFlush(ClogCtl, false); + SimpleLruFlush(XactCtl, false); /* * fsync pg_xact to ensure that any files flushed previously are durably @@ -836,7 +836,7 @@ CheckPointCLOG(void) { /* Flush dirty CLOG pages to disk */ TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(true); - SimpleLruFlush(ClogCtl, true); + SimpleLruFlush(XactCtl, true); /* * fsync pg_xact to ensure that any files flushed previously are durably @@ -871,12 +871,12 @@ ExtendCLOG(TransactionId newestXact) pageno = TransactionIdToPage(newestXact); - LWLockAcquire(CLogControlLock, LW_EXCLUSIVE); + LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroCLOGPage(pageno, true); - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); } @@ -907,7 +907,7 @@ TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid) cutoffPage = TransactionIdToPage(oldestXact); /* Check to see if there's any files that could be removed */ - if (!SlruScanDirectory(ClogCtl, SlruScanDirCbReportPresence, &cutoffPage)) + if (!SlruScanDirectory(XactCtl, SlruScanDirCbReportPresence, &cutoffPage)) return; /* nothing to remove */ /* @@ -928,7 +928,7 @@ TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid) WriteTruncateXlogRec(cutoffPage, oldestXact, oldestxid_datoid); /* Now we can remove the old CLOG segment(s) */ - SimpleLruTruncate(ClogCtl, cutoffPage); + SimpleLruTruncate(XactCtl, cutoffPage); } @@ -1007,13 +1007,13 @@ clog_redo(XLogReaderState *record) memcpy(&pageno, XLogRecGetData(record), sizeof(int)); - LWLockAcquire(CLogControlLock, LW_EXCLUSIVE); + LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); slotno = ZeroCLOGPage(pageno, false); - SimpleLruWritePage(ClogCtl, slotno); - Assert(!ClogCtl->shared->page_dirty[slotno]); + SimpleLruWritePage(XactCtl, slotno); + Assert(!XactCtl->shared->page_dirty[slotno]); - LWLockRelease(CLogControlLock); + LWLockRelease(XactSLRULock); } else if (info == CLOG_TRUNCATE) { @@ -1025,11 +1025,11 @@ clog_redo(XLogReaderState *record) * During XLOG replay, latest_page_number isn't set up yet; insert a * suitable value to bypass the sanity test in SimpleLruTruncate. */ - ClogCtl->shared->latest_page_number = xlrec.pageno; + XactCtl->shared->latest_page_number = xlrec.pageno; AdvanceOldestClogXid(xlrec.oldestXact); - SimpleLruTruncate(ClogCtl, xlrec.pageno); + SimpleLruTruncate(XactCtl, xlrec.pageno); } else elog(PANIC, "clog_redo: unknown op code %u", info); diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index 630df672cc2..9cdb1364359 100644 --- a/src/backend/access/transam/commit_ts.c +++ b/src/backend/access/transam/commit_ts.c @@ -235,7 +235,7 @@ SetXidCommitTsInPage(TransactionId xid, int nsubxids, int slotno; int i; - LWLockAcquire(CommitTsControlLock, LW_EXCLUSIVE); + LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); slotno = SimpleLruReadPage(CommitTsCtl, pageno, true, xid); @@ -245,13 +245,13 @@ SetXidCommitTsInPage(TransactionId xid, int nsubxids, CommitTsCtl->shared->page_dirty[slotno] = true; - LWLockRelease(CommitTsControlLock); + LWLockRelease(CommitTsSLRULock); } /* * Sets the commit timestamp of a single transaction. * - * Must be called with CommitTsControlLock held + * Must be called with CommitTsSLRULock held */ static void TransactionIdSetCommitTs(TransactionId xid, TimestampTz ts, @@ -352,7 +352,7 @@ TransactionIdGetCommitTsData(TransactionId xid, TimestampTz *ts, if (nodeid) *nodeid = entry.nodeid; - LWLockRelease(CommitTsControlLock); + LWLockRelease(CommitTsSLRULock); return *ts != 0; } @@ -492,9 +492,9 @@ CommitTsShmemInit(void) bool found; CommitTsCtl->PagePrecedes = CommitTsPagePrecedes; - SimpleLruInit(CommitTsCtl, "commit_timestamp", CommitTsShmemBuffers(), 0, - CommitTsControlLock, "pg_commit_ts", - LWTRANCHE_COMMITTS_BUFFERS); + SimpleLruInit(CommitTsCtl, "CommitTs", CommitTsShmemBuffers(), 0, + CommitTsSLRULock, "pg_commit_ts", + LWTRANCHE_COMMITTS_BUFFER); commitTsShared = ShmemInitStruct("CommitTs shared", sizeof(CommitTimestampShared), @@ -649,9 +649,9 @@ ActivateCommitTs(void) /* * Re-Initialize our idea of the latest page number. */ - LWLockAcquire(CommitTsControlLock, LW_EXCLUSIVE); + LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); CommitTsCtl->shared->latest_page_number = pageno; - LWLockRelease(CommitTsControlLock); + LWLockRelease(CommitTsSLRULock); /* * If CommitTs is enabled, but it wasn't in the previous server run, we @@ -679,11 +679,11 @@ ActivateCommitTs(void) { int slotno; - LWLockAcquire(CommitTsControlLock, LW_EXCLUSIVE); + LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); slotno = ZeroCommitTsPage(pageno, false); SimpleLruWritePage(CommitTsCtl, slotno); Assert(!CommitTsCtl->shared->page_dirty[slotno]); - LWLockRelease(CommitTsControlLock); + LWLockRelease(CommitTsSLRULock); } /* Change the activation status in shared memory. */ @@ -732,9 +732,9 @@ DeactivateCommitTs(void) * be overwritten anyway when we wrap around, but it seems better to be * tidy.) */ - LWLockAcquire(CommitTsControlLock, LW_EXCLUSIVE); + LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); (void) SlruScanDirectory(CommitTsCtl, SlruScanDirCbDeleteAll, NULL); - LWLockRelease(CommitTsControlLock); + LWLockRelease(CommitTsSLRULock); } /* @@ -804,12 +804,12 @@ ExtendCommitTs(TransactionId newestXact) pageno = TransactionIdToCTsPage(newestXact); - LWLockAcquire(CommitTsControlLock, LW_EXCLUSIVE); + LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroCommitTsPage(pageno, !InRecovery); - LWLockRelease(CommitTsControlLock); + LWLockRelease(CommitTsSLRULock); } /* @@ -974,13 +974,13 @@ commit_ts_redo(XLogReaderState *record) memcpy(&pageno, XLogRecGetData(record), sizeof(int)); - LWLockAcquire(CommitTsControlLock, LW_EXCLUSIVE); + LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); slotno = ZeroCommitTsPage(pageno, false); SimpleLruWritePage(CommitTsCtl, slotno); Assert(!CommitTsCtl->shared->page_dirty[slotno]); - LWLockRelease(CommitTsControlLock); + LWLockRelease(CommitTsSLRULock); } else if (info == COMMIT_TS_TRUNCATE) { diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index e2aa5c9ce42..ce84dac0c40 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -192,8 +192,8 @@ static SlruCtlData MultiXactMemberCtlData; /* * MultiXact state shared across all backends. All this state is protected - * by MultiXactGenLock. (We also use MultiXactOffsetControlLock and - * MultiXactMemberControlLock to guard accesses to the two sets of SLRU + * by MultiXactGenLock. (We also use MultiXactOffsetSLRULock and + * MultiXactMemberSLRULock to guard accesses to the two sets of SLRU * buffers. For concurrency's sake, we avoid holding more than one of these * locks at a time.) */ @@ -850,7 +850,7 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, MultiXactOffset *offptr; int i; - LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); pageno = MultiXactIdToOffsetPage(multi); entryno = MultiXactIdToOffsetEntry(multi); @@ -871,9 +871,9 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, MultiXactOffsetCtl->shared->page_dirty[slotno] = true; /* Exchange our lock */ - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); - LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); prev_pageno = -1; @@ -915,7 +915,7 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, MultiXactMemberCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(MultiXactMemberControlLock); + LWLockRelease(MultiXactMemberSLRULock); } /* @@ -1321,7 +1321,7 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, * time on every multixact creation. */ retry: - LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); pageno = MultiXactIdToOffsetPage(multi); entryno = MultiXactIdToOffsetEntry(multi); @@ -1367,7 +1367,7 @@ retry: if (nextMXOffset == 0) { /* Corner case 2: next multixact is still being filled in */ - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); CHECK_FOR_INTERRUPTS(); pg_usleep(1000L); goto retry; @@ -1376,13 +1376,13 @@ retry: length = nextMXOffset - offset; } - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); ptr = (MultiXactMember *) palloc(length * sizeof(MultiXactMember)); *members = ptr; /* Now get the members themselves. */ - LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); truelength = 0; prev_pageno = -1; @@ -1422,7 +1422,7 @@ retry: truelength++; } - LWLockRelease(MultiXactMemberControlLock); + LWLockRelease(MultiXactMemberSLRULock); /* * Copy the result into the local cache. @@ -1812,8 +1812,8 @@ MultiXactShmemSize(void) mul_size(sizeof(MultiXactId) * 2, MaxOldestSlot)) size = SHARED_MULTIXACT_STATE_SIZE; - size = add_size(size, SimpleLruShmemSize(NUM_MXACTOFFSET_BUFFERS, 0)); - size = add_size(size, SimpleLruShmemSize(NUM_MXACTMEMBER_BUFFERS, 0)); + size = add_size(size, SimpleLruShmemSize(NUM_MULTIXACTOFFSET_BUFFERS, 0)); + size = add_size(size, SimpleLruShmemSize(NUM_MULTIXACTMEMBER_BUFFERS, 0)); return size; } @@ -1829,13 +1829,13 @@ MultiXactShmemInit(void) MultiXactMemberCtl->PagePrecedes = MultiXactMemberPagePrecedes; SimpleLruInit(MultiXactOffsetCtl, - "multixact_offset", NUM_MXACTOFFSET_BUFFERS, 0, - MultiXactOffsetControlLock, "pg_multixact/offsets", - LWTRANCHE_MXACTOFFSET_BUFFERS); + "MultiXactOffset", NUM_MULTIXACTOFFSET_BUFFERS, 0, + MultiXactOffsetSLRULock, "pg_multixact/offsets", + LWTRANCHE_MULTIXACTOFFSET_BUFFER); SimpleLruInit(MultiXactMemberCtl, - "multixact_member", NUM_MXACTMEMBER_BUFFERS, 0, - MultiXactMemberControlLock, "pg_multixact/members", - LWTRANCHE_MXACTMEMBER_BUFFERS); + "MultiXactMember", NUM_MULTIXACTMEMBER_BUFFERS, 0, + MultiXactMemberSLRULock, "pg_multixact/members", + LWTRANCHE_MULTIXACTMEMBER_BUFFER); /* Initialize our shared state struct */ MultiXactState = ShmemInitStruct("Shared MultiXact State", @@ -1869,7 +1869,7 @@ BootStrapMultiXact(void) { int slotno; - LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); /* Create and zero the first page of the offsets log */ slotno = ZeroMultiXactOffsetPage(0, false); @@ -1878,9 +1878,9 @@ BootStrapMultiXact(void) SimpleLruWritePage(MultiXactOffsetCtl, slotno); Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); - LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); /* Create and zero the first page of the members log */ slotno = ZeroMultiXactMemberPage(0, false); @@ -1889,7 +1889,7 @@ BootStrapMultiXact(void) SimpleLruWritePage(MultiXactMemberCtl, slotno); Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactMemberControlLock); + LWLockRelease(MultiXactMemberSLRULock); } /* @@ -1952,7 +1952,7 @@ MaybeExtendOffsetSlru(void) pageno = MultiXactIdToOffsetPage(MultiXactState->nextMXact); - LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); if (!SimpleLruDoesPhysicalPageExist(MultiXactOffsetCtl, pageno)) { @@ -1967,7 +1967,7 @@ MaybeExtendOffsetSlru(void) SimpleLruWritePage(MultiXactOffsetCtl, slotno); } - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); } /* @@ -2020,7 +2020,7 @@ TrimMultiXact(void) LWLockRelease(MultiXactGenLock); /* Clean up offsets state */ - LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); /* * (Re-)Initialize our idea of the latest page number for offsets. @@ -2051,10 +2051,10 @@ TrimMultiXact(void) MultiXactOffsetCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); /* And the same for members */ - LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); /* * (Re-)Initialize our idea of the latest page number for members. @@ -2089,7 +2089,7 @@ TrimMultiXact(void) MultiXactMemberCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(MultiXactMemberControlLock); + LWLockRelease(MultiXactMemberSLRULock); /* signal that we're officially up */ LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE); @@ -2402,12 +2402,12 @@ ExtendMultiXactOffset(MultiXactId multi) pageno = MultiXactIdToOffsetPage(multi); - LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroMultiXactOffsetPage(pageno, true); - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); } /* @@ -2443,12 +2443,12 @@ ExtendMultiXactMember(MultiXactOffset offset, int nmembers) pageno = MXOffsetToMemberPage(offset); - LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroMultiXactMemberPage(pageno, true); - LWLockRelease(MultiXactMemberControlLock); + LWLockRelease(MultiXactMemberSLRULock); } /* @@ -2749,7 +2749,7 @@ find_multixact_start(MultiXactId multi, MultiXactOffset *result) offptr = (MultiXactOffset *) MultiXactOffsetCtl->shared->page_buffer[slotno]; offptr += entryno; offset = *offptr; - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); *result = offset; return true; @@ -3230,13 +3230,13 @@ multixact_redo(XLogReaderState *record) memcpy(&pageno, XLogRecGetData(record), sizeof(int)); - LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); slotno = ZeroMultiXactOffsetPage(pageno, false); SimpleLruWritePage(MultiXactOffsetCtl, slotno); Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactOffsetControlLock); + LWLockRelease(MultiXactOffsetSLRULock); } else if (info == XLOG_MULTIXACT_ZERO_MEM_PAGE) { @@ -3245,13 +3245,13 @@ multixact_redo(XLogReaderState *record) memcpy(&pageno, XLogRecGetData(record), sizeof(int)); - LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE); + LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); slotno = ZeroMultiXactMemberPage(pageno, false); SimpleLruWritePage(MultiXactMemberCtl, slotno); Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactMemberControlLock); + LWLockRelease(MultiXactMemberSLRULock); } else if (info == XLOG_MULTIXACT_CREATE_ID) { diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index 3572b01091e..61249f4a12d 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -160,6 +160,17 @@ SimpleLruShmemSize(int nslots, int nlsns) return BUFFERALIGN(sz) + BLCKSZ * nslots; } +/* + * Initialize, or attach to, a simple LRU cache in shared memory. + * + * ctl: address of local (unshared) control structure. + * name: name of SLRU. (This is user-visible, pick with care!) + * nslots: number of page slots to use. + * nlsns: number of LSN groups per page (set to zero if not relevant). + * ctllock: LWLock to use to control access to the shared control structure. + * subdir: PGDATA-relative subdirectory that will contain the files. + * tranche_id: LWLock tranche ID to use for the SLRU's per-buffer LWLocks. + */ void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, LWLock *ctllock, const char *subdir, int tranche_id) diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c index 25d7d739cf1..f33ae407a60 100644 --- a/src/backend/access/transam/subtrans.c +++ b/src/backend/access/transam/subtrans.c @@ -81,7 +81,7 @@ SubTransSetParent(TransactionId xid, TransactionId parent) Assert(TransactionIdIsValid(parent)); Assert(TransactionIdFollows(xid, parent)); - LWLockAcquire(SubtransControlLock, LW_EXCLUSIVE); + LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); slotno = SimpleLruReadPage(SubTransCtl, pageno, true, xid); ptr = (TransactionId *) SubTransCtl->shared->page_buffer[slotno]; @@ -99,7 +99,7 @@ SubTransSetParent(TransactionId xid, TransactionId parent) SubTransCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(SubtransControlLock); + LWLockRelease(SubtransSLRULock); } /* @@ -129,7 +129,7 @@ SubTransGetParent(TransactionId xid) parent = *ptr; - LWLockRelease(SubtransControlLock); + LWLockRelease(SubtransSLRULock); return parent; } @@ -191,9 +191,9 @@ void SUBTRANSShmemInit(void) { SubTransCtl->PagePrecedes = SubTransPagePrecedes; - SimpleLruInit(SubTransCtl, "subtrans", NUM_SUBTRANS_BUFFERS, 0, - SubtransControlLock, "pg_subtrans", - LWTRANCHE_SUBTRANS_BUFFERS); + SimpleLruInit(SubTransCtl, "Subtrans", NUM_SUBTRANS_BUFFERS, 0, + SubtransSLRULock, "pg_subtrans", + LWTRANCHE_SUBTRANS_BUFFER); /* Override default assumption that writes should be fsync'd */ SubTransCtl->do_fsync = false; } @@ -213,7 +213,7 @@ BootStrapSUBTRANS(void) { int slotno; - LWLockAcquire(SubtransControlLock, LW_EXCLUSIVE); + LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); /* Create and zero the first page of the subtrans log */ slotno = ZeroSUBTRANSPage(0); @@ -222,7 +222,7 @@ BootStrapSUBTRANS(void) SimpleLruWritePage(SubTransCtl, slotno); Assert(!SubTransCtl->shared->page_dirty[slotno]); - LWLockRelease(SubtransControlLock); + LWLockRelease(SubtransSLRULock); } /* @@ -259,7 +259,7 @@ StartupSUBTRANS(TransactionId oldestActiveXID) * Whenever we advance into a new page, ExtendSUBTRANS will likewise zero * the new page without regard to whatever was previously on disk. */ - LWLockAcquire(SubtransControlLock, LW_EXCLUSIVE); + LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); startPage = TransactionIdToPage(oldestActiveXID); nextFullXid = ShmemVariableCache->nextFullXid; @@ -275,7 +275,7 @@ StartupSUBTRANS(TransactionId oldestActiveXID) } (void) ZeroSUBTRANSPage(startPage); - LWLockRelease(SubtransControlLock); + LWLockRelease(SubtransSLRULock); } /* @@ -337,12 +337,12 @@ ExtendSUBTRANS(TransactionId newestXact) pageno = TransactionIdToPage(newestXact); - LWLockAcquire(SubtransControlLock, LW_EXCLUSIVE); + LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); /* Zero the page */ ZeroSUBTRANSPage(pageno); - LWLockRelease(SubtransControlLock); + LWLockRelease(SubtransSLRULock); } diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index 2570e7086a7..e14b53bf9e3 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -303,22 +303,22 @@ AdvanceNextFullTransactionIdPastXid(TransactionId xid) /* * Advance the cluster-wide value for the oldest valid clog entry. * - * We must acquire CLogTruncationLock to advance the oldestClogXid. It's not + * We must acquire XactTruncationLock to advance the oldestClogXid. It's not * necessary to hold the lock during the actual clog truncation, only when we * advance the limit, as code looking up arbitrary xids is required to hold - * CLogTruncationLock from when it tests oldestClogXid through to when it + * XactTruncationLock from when it tests oldestClogXid through to when it * completes the clog lookup. */ void AdvanceOldestClogXid(TransactionId oldest_datfrozenxid) { - LWLockAcquire(CLogTruncationLock, LW_EXCLUSIVE); + LWLockAcquire(XactTruncationLock, LW_EXCLUSIVE); if (TransactionIdPrecedes(ShmemVariableCache->oldestClogXid, oldest_datfrozenxid)) { ShmemVariableCache->oldestClogXid = oldest_datfrozenxid; } - LWLockRelease(CLogTruncationLock); + LWLockRelease(XactTruncationLock); } /* |