mirror of
https://github.com/postgres/postgres.git
synced 2025-12-19 17:02:53 +03:00
Rework redundant code in subtrans.c
When this code was written the duplicity didn't matter, but with all the SLRU-bank stuff we just added, it has become excessive. Turn it into a simpler loop with no code duplication. Also add a test so that this code becomes covered. Discussion: https://postgr.es/m/202403041517.3a35jw53os65@alvherre.pgsql
This commit is contained in:
@@ -311,7 +311,7 @@ StartupSUBTRANS(TransactionId oldestActiveXID)
|
||||
FullTransactionId nextXid;
|
||||
int64 startPage;
|
||||
int64 endPage;
|
||||
LWLock *prevlock;
|
||||
LWLock *prevlock = NULL;
|
||||
LWLock *lock;
|
||||
|
||||
/*
|
||||
@@ -324,42 +324,27 @@ StartupSUBTRANS(TransactionId oldestActiveXID)
|
||||
nextXid = TransamVariables->nextXid;
|
||||
endPage = TransactionIdToPage(XidFromFullTransactionId(nextXid));
|
||||
|
||||
prevlock = SimpleLruGetBankLock(SubTransCtl, startPage);
|
||||
LWLockAcquire(prevlock, LW_EXCLUSIVE);
|
||||
while (startPage != endPage)
|
||||
for (;;)
|
||||
{
|
||||
lock = SimpleLruGetBankLock(SubTransCtl, startPage);
|
||||
|
||||
/*
|
||||
* Check if we need to acquire the lock on the new bank then release
|
||||
* the lock on the old bank and acquire on the new bank.
|
||||
*/
|
||||
if (prevlock != lock)
|
||||
{
|
||||
LWLockRelease(prevlock);
|
||||
if (prevlock)
|
||||
LWLockRelease(prevlock);
|
||||
LWLockAcquire(lock, LW_EXCLUSIVE);
|
||||
prevlock = lock;
|
||||
}
|
||||
|
||||
(void) ZeroSUBTRANSPage(startPage);
|
||||
if (startPage == endPage)
|
||||
break;
|
||||
|
||||
startPage++;
|
||||
/* must account for wraparound */
|
||||
if (startPage > TransactionIdToPage(MaxTransactionId))
|
||||
startPage = 0;
|
||||
}
|
||||
|
||||
lock = SimpleLruGetBankLock(SubTransCtl, startPage);
|
||||
|
||||
/*
|
||||
* Check if we need to acquire the lock on the new bank then release the
|
||||
* lock on the old bank and acquire on the new bank.
|
||||
*/
|
||||
if (prevlock != lock)
|
||||
{
|
||||
LWLockRelease(prevlock);
|
||||
LWLockAcquire(lock, LW_EXCLUSIVE);
|
||||
}
|
||||
(void) ZeroSUBTRANSPage(startPage);
|
||||
LWLockRelease(lock);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user