1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-11 20:28:21 +03: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:
Simon Riggs
2011-11-02 08:06:54 +00:00
parent 5e4dd5f63b
commit 9e5fe4d492
4 changed files with 33 additions and 6 deletions

View File

@ -490,6 +490,25 @@ StartupCLOG(void)
*/ */
ClogCtl->shared->latest_page_number = pageno; 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 * Zero out the remainder of the current clog page. Under normal
* circumstances it should be zeroes already, but it seems at least * circumstances it should be zeroes already, but it seems at least

View File

@ -1568,7 +1568,7 @@ StartupMultiXact(void)
/* /*
* Zero out the remainder of the current members page. See notes in * Zero out the remainder of the current members page. See notes in
* StartupCLOG() for motivation. * TrimCLOG() for motivation.
*/ */
entryno = MXOffsetToMemberEntry(offset); entryno = MXOffsetToMemberEntry(offset);
if (entryno != 0) if (entryno != 0)

View File

@ -6384,10 +6384,12 @@ StartupXLOG(void)
oldestActiveXID = checkPoint.oldestActiveXid; oldestActiveXID = checkPoint.oldestActiveXid;
Assert(TransactionIdIsValid(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(); StartupCLOG();
StartupSUBTRANS(oldestActiveXID); StartupSUBTRANS(oldestActiveXID);
StartupMultiXact();
/* /*
* If we're beginning at a shutdown checkpoint, we know that * If we're beginning at a shutdown checkpoint, we know that
@ -6876,16 +6878,21 @@ StartupXLOG(void)
TransactionIdRetreat(ShmemVariableCache->latestCompletedXid); TransactionIdRetreat(ShmemVariableCache->latestCompletedXid);
/* /*
* Start up the commit log and related stuff, too. In hot standby mode we * Start up the commit log and subtrans, if not already done for
* did this already before WAL replay. * hot standby.
*/ */
if (standbyState == STANDBY_DISABLED) if (standbyState == STANDBY_DISABLED)
{ {
StartupCLOG(); StartupCLOG();
StartupSUBTRANS(oldestActiveXID); StartupSUBTRANS(oldestActiveXID);
StartupMultiXact();
} }
/*
* Perform end of recovery actions for any SLRUs that need it.
*/
StartupMultiXact();
TrimCLOG();
/* Reload shared-memory state for prepared transactions */ /* Reload shared-memory state for prepared transactions */
RecoverPreparedTransactions(); RecoverPreparedTransactions();

View File

@ -40,6 +40,7 @@ extern Size CLOGShmemSize(void);
extern void CLOGShmemInit(void); extern void CLOGShmemInit(void);
extern void BootStrapCLOG(void); extern void BootStrapCLOG(void);
extern void StartupCLOG(void); extern void StartupCLOG(void);
extern void TrimCLOG(void);
extern void ShutdownCLOG(void); extern void ShutdownCLOG(void);
extern void CheckPointCLOG(void); extern void CheckPointCLOG(void);
extern void ExtendCLOG(TransactionId newestXact); extern void ExtendCLOG(TransactionId newestXact);