mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-07 19:47:50 +08:00
Fix timing of Startup CLOG and MultiXact during Hot Standby
Patch by me, bug report by Chris Redekop, analysis by Florian Pflug
This commit is contained in:
parent
7f797d27fe
commit
2f55c535e1
@ -490,6 +490,25 @@ StartupCLOG(void)
|
||||
*/
|
||||
ClogCtl->shared->latest_page_number = pageno;
|
||||
|
||||
LWLockRelease(CLogControlLock);
|
||||
}
|
||||
|
||||
/*
|
||||
* This must be called ONCE at the end of startup/recovery.
|
||||
*/
|
||||
void
|
||||
TrimCLOG(void)
|
||||
{
|
||||
TransactionId xid = ShmemVariableCache->nextXid;
|
||||
int pageno = TransactionIdToPage(xid);
|
||||
|
||||
LWLockAcquire(CLogControlLock, LW_EXCLUSIVE);
|
||||
|
||||
/*
|
||||
* Re-Initialize our idea of the latest page number.
|
||||
*/
|
||||
ClogCtl->shared->latest_page_number = pageno;
|
||||
|
||||
/*
|
||||
* Zero out the remainder of the current clog page. Under normal
|
||||
* circumstances it should be zeroes already, but it seems at least
|
||||
|
@ -1568,7 +1568,7 @@ StartupMultiXact(void)
|
||||
|
||||
/*
|
||||
* Zero out the remainder of the current members page. See notes in
|
||||
* StartupCLOG() for motivation.
|
||||
* TrimCLOG() for motivation.
|
||||
*/
|
||||
entryno = MXOffsetToMemberEntry(offset);
|
||||
if (entryno != 0)
|
||||
|
@ -6067,10 +6067,12 @@ StartupXLOG(void)
|
||||
oldestActiveXID = checkPoint.oldestActiveXid;
|
||||
Assert(TransactionIdIsValid(oldestActiveXID));
|
||||
|
||||
/* Startup commit log and related stuff */
|
||||
/*
|
||||
* Startup commit log and subtrans only. Other SLRUs are not
|
||||
* maintained during recovery and need not be started yet.
|
||||
*/
|
||||
StartupCLOG();
|
||||
StartupSUBTRANS(oldestActiveXID);
|
||||
StartupMultiXact();
|
||||
|
||||
/*
|
||||
* If we're beginning at a shutdown checkpoint, we know that
|
||||
@ -6530,16 +6532,21 @@ StartupXLOG(void)
|
||||
TransactionIdRetreat(ShmemVariableCache->latestCompletedXid);
|
||||
|
||||
/*
|
||||
* Start up the commit log and related stuff, too. In hot standby mode we
|
||||
* did this already before WAL replay.
|
||||
* Start up the commit log and subtrans, if not already done for
|
||||
* hot standby.
|
||||
*/
|
||||
if (standbyState == STANDBY_DISABLED)
|
||||
{
|
||||
StartupCLOG();
|
||||
StartupSUBTRANS(oldestActiveXID);
|
||||
StartupMultiXact();
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform end of recovery actions for any SLRUs that need it.
|
||||
*/
|
||||
StartupMultiXact();
|
||||
TrimCLOG();
|
||||
|
||||
/* Reload shared-memory state for prepared transactions */
|
||||
RecoverPreparedTransactions();
|
||||
|
||||
|
@ -40,6 +40,7 @@ extern Size CLOGShmemSize(void);
|
||||
extern void CLOGShmemInit(void);
|
||||
extern void BootStrapCLOG(void);
|
||||
extern void StartupCLOG(void);
|
||||
extern void TrimCLOG(void);
|
||||
extern void ShutdownCLOG(void);
|
||||
extern void CheckPointCLOG(void);
|
||||
extern void ExtendCLOG(TransactionId newestXact);
|
||||
|
Loading…
Reference in New Issue
Block a user