diff options
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); } /* |