1
0
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:
Alvaro Herrera
2024-03-05 12:09:18 +01:00
parent 030e10ff1a
commit 1a2654b32b
2 changed files with 49 additions and 22 deletions

View File

@@ -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);
}