summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera2013-12-02 16:28:24 +0000
committerAlvaro Herrera2013-12-02 16:28:24 +0000
commit715f44be058c4c270af9ef60493ed74539b513d1 (patch)
tree67bfac033fce0d6b93ac227bfa8c50435f44847e
parentff61dd206699187ca6d0b11ae3a173b690fd4bc4 (diff)
Fix incomplete backpatch of pg_multixact truncation changes to <= 9.2
The backpatch of a95335b544d9c8377e9dc7a399d8e9a155895f82 to 9.2, 9.1 and 9.0 was incomplete, missing changes to xlog.c, primarily the call to TrimMultiXact(). Testing presumably didn't show a problem without these changes because TrimMultiXact() performs defense-in-depth work, which is not strictly necessary. It also missed moving StartupMultiXact() which would have been problematic if a restartpoing happened in exactly the wrong moment, causing a transient error. Andres Freund
-rw-r--r--src/backend/access/transam/xlog.c13
-rw-r--r--src/include/access/multixact.h1
2 files changed, 11 insertions, 3 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 8243ea62d78..190d86b7529 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6531,6 +6531,12 @@ StartupXLOG(void)
XLogCtl->ckptXid = checkPoint.nextXid;
/*
+ * Startup MultiXact. We need to do this early because we need its state
+ * initialized because we attempt truncation during restartpoints.
+ */
+ StartupMultiXact();
+
+ /*
* We must replay WAL entries using the same TimeLineID they were created
* under, so temporarily adopt the TLI indicated by the checkpoint (see
* also xlog_redo()).
@@ -6696,8 +6702,9 @@ StartupXLOG(void)
ProcArrayInitRecovery(ShmemVariableCache->nextXid);
/*
- * Startup commit log and subtrans only. Other SLRUs are not
- * maintained during recovery and need not be started yet.
+ * Startup commit log and subtrans only. MultiXact has already
+ * been started up and other SLRUs are not maintained during
+ * recovery and need not be started yet.
*/
StartupCLOG();
StartupSUBTRANS(oldestActiveXID);
@@ -7238,7 +7245,7 @@ StartupXLOG(void)
/*
* Perform end of recovery actions for any SLRUs that need it.
*/
- StartupMultiXact();
+ TrimMultiXact();
TrimCLOG();
/* Reload shared-memory state for prepared transactions */
diff --git a/src/include/access/multixact.h b/src/include/access/multixact.h
index e20573d01fb..7f46c3eeea4 100644
--- a/src/include/access/multixact.h
+++ b/src/include/access/multixact.h
@@ -59,6 +59,7 @@ extern Size MultiXactShmemSize(void);
extern void MultiXactShmemInit(void);
extern void BootStrapMultiXact(void);
extern void StartupMultiXact(void);
+extern void TrimMultiXact(void);
extern void ShutdownMultiXact(void);
extern void MultiXactGetCheckptMulti(bool is_shutdown,
MultiXactId *nextMulti,