diff options
Diffstat (limited to 'src/backend/access')
-rw-r--r-- | src/backend/access/transam/twophase.c | 7 | ||||
-rw-r--r-- | src/backend/access/transam/xlog.c | 14 |
2 files changed, 11 insertions, 10 deletions
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index bf451d42ffb..9a8257fcafb 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -2035,9 +2035,8 @@ PrescanPreparedTransactions(TransactionId **xids_p, int *nxids_p) * This is never called at the end of recovery - we use * RecoverPreparedTransactions() at that point. * - * The lack of calls to SubTransSetParent() calls here is by design; - * those calls are made by RecoverPreparedTransactions() at the end of recovery - * for those xacts that need this. + * This updates pg_subtrans, so that any subtransactions will be correctly + * seen as in-progress in snapshots taken during recovery. */ void StandbyRecoverPreparedTransactions(void) @@ -2057,7 +2056,7 @@ StandbyRecoverPreparedTransactions(void) buf = ProcessTwoPhaseBuffer(xid, gxact->prepare_start_lsn, - gxact->ondisk, false, false); + gxact->ondisk, true, false); if (buf != NULL) pfree(buf); } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 8dcdf5a7646..a69337f2d4b 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5777,6 +5777,9 @@ StartupXLOG(void) RunningTransactionsData running; TransactionId latestCompletedXid; + /* Update pg_subtrans entries for any prepared transactions */ + StandbyRecoverPreparedTransactions(); + /* * Construct a RunningTransactions snapshot representing a * shut down server, with only prepared transactions still @@ -5785,7 +5788,7 @@ StartupXLOG(void) */ running.xcnt = nxids; running.subxcnt = 0; - running.subxid_overflow = false; + running.subxid_status = SUBXIDS_IN_SUBTRANS; running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); running.oldestRunningXid = oldestActiveXID; latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); @@ -5795,8 +5798,6 @@ StartupXLOG(void) running.xids = xids; ProcArrayApplyRecoveryInfo(&running); - - StandbyRecoverPreparedTransactions(); } } @@ -8244,6 +8245,9 @@ xlog_redo(XLogReaderState *record) oldestActiveXID = PrescanPreparedTransactions(&xids, &nxids); + /* Update pg_subtrans entries for any prepared transactions */ + StandbyRecoverPreparedTransactions(); + /* * Construct a RunningTransactions snapshot representing a shut * down server, with only prepared transactions still alive. We're @@ -8252,7 +8256,7 @@ xlog_redo(XLogReaderState *record) */ running.xcnt = nxids; running.subxcnt = 0; - running.subxid_overflow = false; + running.subxid_status = SUBXIDS_IN_SUBTRANS; running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); running.oldestRunningXid = oldestActiveXID; latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); @@ -8262,8 +8266,6 @@ xlog_redo(XLogReaderState *record) running.xids = xids; ProcArrayApplyRecoveryInfo(&running); - - StandbyRecoverPreparedTransactions(); } /* ControlFile->checkPointCopy always tracks the latest ckpt XID */ |