aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-08-30 19:00:03 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-08-30 19:00:03 +0000
commit9cf4eaa00b554721ec8367a29d21368f81fc0372 (patch)
tree3ecc77fb9980d1ea2de005cf96790f600e3fd20d
parentaf8406bb2ae7e3dc0b732b6057946e4cc322a121 (diff)
downloadpostgresql-9cf4eaa00b554721ec8367a29d21368f81fc0372.tar.gz
postgresql-9cf4eaa00b554721ec8367a29d21368f81fc0372.zip
Fix failure to advance nextXID beyond subtransactions whose XIDs appear
only within COMMIT or ABORT records.
-rw-r--r--src/backend/access/transam/xact.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index c0ef2ca7637..cc36548b181 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.184 2004/08/30 02:54:38 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.185 2004/08/30 19:00:03 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3462,12 +3462,30 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record)
if (info == XLOG_XACT_COMMIT)
{
xl_xact_commit *xlrec = (xl_xact_commit *) XLogRecGetData(record);
+ TransactionId *sub_xids;
+ TransactionId max_xid;
int i;
TransactionIdCommit(record->xl_xid);
+
/* Mark committed subtransactions as committed */
- TransactionIdCommitTree(xlrec->nsubxacts,
- (TransactionId *) &(xlrec->xnodes[xlrec->nrels]));
+ sub_xids = (TransactionId *) &(xlrec->xnodes[xlrec->nrels]);
+ TransactionIdCommitTree(xlrec->nsubxacts, sub_xids);
+
+ /* Make sure nextXid is beyond any XID mentioned in the record */
+ max_xid = record->xl_xid;
+ for (i = 0; i < xlrec->nsubxacts; i++)
+ {
+ if (TransactionIdPrecedes(max_xid, sub_xids[i]))
+ max_xid = sub_xids[i];
+ }
+ if (TransactionIdFollowsOrEquals(max_xid,
+ ShmemVariableCache->nextXid))
+ {
+ ShmemVariableCache->nextXid = max_xid;
+ TransactionIdAdvance(ShmemVariableCache->nextXid);
+ }
+
/* Make sure files supposed to be dropped are dropped */
for (i = 0; i < xlrec->nrels; i++)
{
@@ -3478,12 +3496,30 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record)
else if (info == XLOG_XACT_ABORT)
{
xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record);
+ TransactionId *sub_xids;
+ TransactionId max_xid;
int i;
TransactionIdAbort(record->xl_xid);
- /* mark subtransactions as aborted */
- TransactionIdAbortTree(xlrec->nsubxacts,
- (TransactionId *) &(xlrec->xnodes[xlrec->nrels]));
+
+ /* Mark subtransactions as aborted */
+ sub_xids = (TransactionId *) &(xlrec->xnodes[xlrec->nrels]);
+ TransactionIdAbortTree(xlrec->nsubxacts, sub_xids);
+
+ /* Make sure nextXid is beyond any XID mentioned in the record */
+ max_xid = record->xl_xid;
+ for (i = 0; i < xlrec->nsubxacts; i++)
+ {
+ if (TransactionIdPrecedes(max_xid, sub_xids[i]))
+ max_xid = sub_xids[i];
+ }
+ if (TransactionIdFollowsOrEquals(max_xid,
+ ShmemVariableCache->nextXid))
+ {
+ ShmemVariableCache->nextXid = max_xid;
+ TransactionIdAdvance(ShmemVariableCache->nextXid);
+ }
+
/* Make sure files supposed to be dropped are dropped */
for (i = 0; i < xlrec->nrels; i++)
{