aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2024-06-27 21:06:32 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2024-06-27 21:09:15 +0300
commit5dea6628b32d8092e789d9e31509ed74840a271e (patch)
treefd5e77cdf78e3a60cd27215e1b87c483373b71d3 /src/backend/access/transam/xlog.c
parent266454f192e8f67e8e5e8e9f7667d7c8c77de232 (diff)
downloadpostgresql-5dea6628b32d8092e789d9e31509ed74840a271e.tar.gz
postgresql-5dea6628b32d8092e789d9e31509ed74840a271e.zip
Fix MVCC bug with prepared xact with subxacts on standby
We did not recover the subtransaction IDs of prepared transactions when starting a hot standby from a shutdown checkpoint. As a result, such subtransactions were considered as aborted, rather than in-progress. That would lead to hint bits being set incorrectly, and the subtransactions suddenly becoming visible to old snapshots when the prepared transaction was committed. To fix, update pg_subtrans with prepared transactions's subxids when starting hot standby from a shutdown checkpoint. The snapshots taken from that state need to be marked as "suboverflowed", so that we also check the pg_subtrans. Backport to all supported versions. Discussion: https://www.postgresql.org/message-id/6b852e98-2d49-4ca1-9e95-db419a2696e0@iki.fi
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 98e4cbc27dd..d36784627d9 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7044,6 +7044,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
@@ -7052,7 +7055,7 @@ StartupXLOG(void)
*/
running.xcnt = nxids;
running.subxcnt = 0;
- running.subxid_overflow = false;
+ running.subxid_status = SUBXIDS_IN_SUBTRANS;
running.nextXid = XidFromFullTransactionId(checkPoint.nextFullXid);
running.oldestRunningXid = oldestActiveXID;
latestCompletedXid = XidFromFullTransactionId(checkPoint.nextFullXid);
@@ -7062,8 +7065,6 @@ StartupXLOG(void)
running.xids = xids;
ProcArrayApplyRecoveryInfo(&running);
-
- StandbyRecoverPreparedTransactions();
}
}
@@ -9977,6 +9978,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
@@ -9985,7 +9989,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.nextFullXid);
running.oldestRunningXid = oldestActiveXID;
latestCompletedXid = XidFromFullTransactionId(checkPoint.nextFullXid);
@@ -9995,8 +9999,6 @@ xlog_redo(XLogReaderState *record)
running.xids = xids;
ProcArrayApplyRecoveryInfo(&running);
-
- StandbyRecoverPreparedTransactions();
}
/* ControlFile->checkPointCopy always tracks the latest ckpt XID */