diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 0af1c61a4cc..8b5220d8aab 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -887,8 +887,6 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, MultiXactOffset *next_offptr; MultiXactOffset next_offset; - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); - /* position of this multixid in the offsets SLRU area */ pageno = MultiXactIdToOffsetPage(multi); entryno = MultiXactIdToOffsetEntry(multi); @@ -950,6 +948,8 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, { elog(DEBUG1, "next offsets page is not initialized, initializing it now"); + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); + /* Create and zero the page */ slotno = SimpleLruZeroPage(MultiXactOffsetCtl, next_pageno); @@ -957,6 +957,8 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, SimpleLruWritePage(MultiXactOffsetCtl, slotno); Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]); + LWLockRelease(MultiXactOffsetSLRULock); + /* * Remember that we initialized the page, so that we don't zero it * again at the XLOG_MULTIXACT_ZERO_OFF_PAGE record. @@ -975,6 +977,7 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, * concurrently, we might race ahead and get called before the previous * multixid. */ + LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); /* * Note: we pass the MultiXactId to SimpleLruReadPage as the "transaction"