From 9e5fe4d49227c5c5297410d54d6551a726814adc Mon Sep 17 00:00:00 2001 From: Simon Riggs Date: Wed, 2 Nov 2011 08:06:54 +0000 Subject: [PATCH] Fix timing of Startup CLOG and MultiXact during Hot Standby Patch by me, bug report by Chris Redekop, analysis by Florian Pflug --- src/backend/access/transam/clog.c | 19 +++++++++++++++++++ src/backend/access/transam/multixact.c | 2 +- src/backend/access/transam/xlog.c | 17 ++++++++++++----- src/include/access/clog.h | 1 + 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index d3de8934eee..34258ec5582 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -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 diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index bb3afd6000c..f0396726201 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -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) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 633450fbc7b..60ea3f7f1ed 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6384,10 +6384,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 @@ -6876,16 +6878,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(); diff --git a/src/include/access/clog.h b/src/include/access/clog.h index 7a8918e0fc5..691430c97ca 100644 --- a/src/include/access/clog.h +++ b/src/include/access/clog.h @@ -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);