From: Alvaro Herrera Date: Mon, 2 Dec 2013 16:28:18 +0000 (-0300) Subject: Fix incomplete backpatch of pg_multixact truncation changes to <= 9.2 X-Git-Tag: REL9_1_11~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0176f8bea436e166654fb3e5d2d8a1ff42552f7a;p=postgresql 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 --- diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 9ad3b3c962..27de1ee5c8 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6308,6 +6308,12 @@ StartupXLOG(void) XLogCtl->ckptXidEpoch = checkPoint.nextXidEpoch; 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 @@ -6453,8 +6459,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); @@ -6966,7 +6973,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 c3ec763985..c86aeee44e 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,