diff options
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r-- | src/backend/access/transam/xact.c | 123 |
1 files changed, 65 insertions, 58 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 044afd582dd..43966d5ab6f 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.288 2010/02/20 21:24:01 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.289 2010/02/26 02:00:34 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -139,9 +139,9 @@ typedef struct TransactionStateData int nChildXids; /* # of subcommitted child XIDs */ int maxChildXids; /* allocated size of childXids[] */ Oid prevUser; /* previous CurrentUserId setting */ - int prevSecContext; /* previous SecurityRestrictionContext */ + int prevSecContext; /* previous SecurityRestrictionContext */ bool prevXactReadOnly; /* entry-time xact r/o state */ - bool startedInRecovery; /* did we start in recovery? */ + bool startedInRecovery; /* did we start in recovery? */ struct TransactionStateData *parent; /* back link to parent */ } TransactionStateData; @@ -178,7 +178,7 @@ static TransactionStateData TopTransactionStateData = { * unreportedXids holds XIDs of all subtransactions that have not yet been * reported in a XLOG_XACT_ASSIGNMENT record. */ -static int nUnreportedXids; +static int nUnreportedXids; static TransactionId unreportedXids[PGPROC_MAX_CACHED_SUBXIDS]; static TransactionState CurrentTransactionState = &TopTransactionStateData; @@ -452,25 +452,28 @@ AssignTransactionId(TransactionState s) * include the top-level xid and all the subxids that have not yet been * reported using XLOG_XACT_ASSIGNMENT records. * - * This is required to limit the amount of shared memory required in a - * hot standby server to keep track of in-progress XIDs. See notes for + * This is required to limit the amount of shared memory required in a hot + * standby server to keep track of in-progress XIDs. See notes for * RecordKnownAssignedTransactionIds(). * - * We don't keep track of the immediate parent of each subxid, - * only the top-level transaction that each subxact belongs to. This - * is correct in recovery only because aborted subtransactions are - * separately WAL logged. + * We don't keep track of the immediate parent of each subxid, only the + * top-level transaction that each subxact belongs to. This is correct in + * recovery only because aborted subtransactions are separately WAL + * logged. */ if (isSubXact && XLogStandbyInfoActive()) { unreportedXids[nUnreportedXids] = s->transactionId; nUnreportedXids++; - /* ensure this test matches similar one in RecoverPreparedTransactions() */ + /* + * ensure this test matches similar one in + * RecoverPreparedTransactions() + */ if (nUnreportedXids >= PGPROC_MAX_CACHED_SUBXIDS) { XLogRecData rdata[2]; - xl_xact_assignment xlrec; + xl_xact_assignment xlrec; /* * xtop is always set by now because we recurse up transaction @@ -899,6 +902,7 @@ RecordTransactionCommit(void) nchildren = xactGetCommittedChildren(&children); nmsgs = xactGetCommittedInvalidationMessages(&invalMessages, &RelcacheInitFileInval); + /* * If we haven't been assigned an XID yet, we neither can, nor do we want * to write a COMMIT record. @@ -1098,10 +1102,9 @@ static void AtCCI_LocalCache(void) { /* - * Make any pending relation map changes visible. We must do this - * before processing local sinval messages, so that the map changes - * will get reflected into the relcache when relcache invals are - * processed. + * Make any pending relation map changes visible. We must do this before + * processing local sinval messages, so that the map changes will get + * reflected into the relcache when relcache invals are processed. */ AtCCI_RelationMap(); @@ -1227,9 +1230,9 @@ AtSubCommit_childXids(void) * * Note: We rely on the fact that the XID of a child always follows that * of its parent. By copying the XID of this subtransaction before the - * XIDs of its children, we ensure that the array stays ordered. - * Likewise, all XIDs already in the array belong to subtransactions - * started and subcommitted before us, so their XIDs must precede ours. + * XIDs of its children, we ensure that the array stays ordered. Likewise, + * all XIDs already in the array belong to subtransactions started and + * subcommitted before us, so their XIDs must precede ours. */ s->parent->childXids[s->parent->nChildXids] = s->transactionId; @@ -1457,10 +1460,10 @@ AtSubAbort_childXids(void) s->maxChildXids = 0; /* - * We could prune the unreportedXids array here. But we don't bother. - * That would potentially reduce number of XLOG_XACT_ASSIGNMENT records - * but it would likely introduce more CPU time into the more common - * paths, so we choose not to do that. + * We could prune the unreportedXids array here. But we don't bother. That + * would potentially reduce number of XLOG_XACT_ASSIGNMENT records but it + * would likely introduce more CPU time into the more common paths, so we + * choose not to do that. */ } @@ -2162,7 +2165,7 @@ AbortTransaction(void) /* * do abort processing */ - AfterTriggerEndXact(false); /* 'false' means it's abort */ + AfterTriggerEndXact(false); /* 'false' means it's abort */ AtAbort_Portals(); AtEOXact_LargeObject(false); AtAbort_Notify(); @@ -4362,9 +4365,9 @@ xact_redo_commit(xl_xact_commit *xlrec, TransactionId xid, XLogRecPtr lsn) /* * Make sure nextXid is beyond any XID mentioned in the record. * - * We don't expect anyone else to modify nextXid, hence we - * don't need to hold a lock while checking this. We still acquire - * the lock to modify it, though. + * We don't expect anyone else to modify nextXid, hence we don't need to + * hold a lock while checking this. We still acquire the lock to modify + * it, though. */ if (TransactionIdFollowsOrEquals(max_xid, ShmemVariableCache->nextXid)) @@ -4400,8 +4403,8 @@ xact_redo_commit(xl_xact_commit *xlrec, TransactionId xid, XLogRecPtr lsn) * protocol during recovery to provide information on database * consistency for when users try to set hint bits. It is important * that we do not set hint bits until the minRecoveryPoint is past - * this commit record. This ensures that if we crash we don't see - * hint bits set on changes made by transactions that haven't yet + * this commit record. This ensures that if we crash we don't see hint + * bits set on changes made by transactions that haven't yet * recovered. It's unlikely but it's good to be safe. */ TransactionIdAsyncCommitTree(xid, xlrec->nsubxacts, sub_xids, lsn); @@ -4413,17 +4416,17 @@ xact_redo_commit(xl_xact_commit *xlrec, TransactionId xid, XLogRecPtr lsn) /* * Send any cache invalidations attached to the commit. We must - * maintain the same order of invalidation then release locks - * as occurs in . + * maintain the same order of invalidation then release locks as + * occurs in . */ ProcessCommittedInvalidationMessages(inval_msgs, xlrec->nmsgs, - XactCompletionRelcacheInitFileInval(xlrec), - xlrec->dbId, xlrec->tsId); + XactCompletionRelcacheInitFileInval(xlrec), + xlrec->dbId, xlrec->tsId); /* - * Release locks, if any. We do this for both two phase and normal - * one phase transactions. In effect we are ignoring the prepare - * phase and just going straight to lock release. + * Release locks, if any. We do this for both two phase and normal one + * phase transactions. In effect we are ignoring the prepare phase and + * just going straight to lock release. */ StandbyReleaseLockTree(xid, xlrec->nsubxacts, sub_xids); } @@ -4446,15 +4449,16 @@ xact_redo_commit(xl_xact_commit *xlrec, TransactionId xid, XLogRecPtr lsn) } /* - * We issue an XLogFlush() for the same reason we emit ForceSyncCommit() in - * normal operation. For example, in DROP DATABASE, we delete all the files - * belonging to the database, and then commit the transaction. If we crash - * after all the files have been deleted but before the commit, you have an - * entry in pg_database without any files. To minimize the window for that, - * we use ForceSyncCommit() to rush the commit record to disk as quick as - * possible. We have the same window during recovery, and forcing an - * XLogFlush() (which updates minRecoveryPoint during recovery) helps - * to reduce that problem window, for any user that requested ForceSyncCommit(). + * We issue an XLogFlush() for the same reason we emit ForceSyncCommit() + * in normal operation. For example, in DROP DATABASE, we delete all the + * files belonging to the database, and then commit the transaction. If we + * crash after all the files have been deleted but before the commit, you + * have an entry in pg_database without any files. To minimize the window + * for that, we use ForceSyncCommit() to rush the commit record to disk as + * quick as possible. We have the same window during recovery, and forcing + * an XLogFlush() (which updates minRecoveryPoint during recovery) helps + * to reduce that problem window, for any user that requested + * ForceSyncCommit(). */ if (XactCompletionForceSyncCommit(xlrec)) XLogFlush(lsn); @@ -4480,9 +4484,11 @@ xact_redo_abort(xl_xact_abort *xlrec, TransactionId xid) max_xid = TransactionIdLatest(xid, xlrec->nsubxacts, sub_xids); /* Make sure nextXid is beyond any XID mentioned in the record */ - /* We don't expect anyone else to modify nextXid, hence we - * don't need to hold a lock while checking this. We still acquire - * the lock to modify it, though. + + /* + * We don't expect anyone else to modify nextXid, hence we don't need to + * hold a lock while checking this. We still acquire the lock to modify + * it, though. */ if (TransactionIdFollowsOrEquals(max_xid, ShmemVariableCache->nextXid)) @@ -4496,12 +4502,13 @@ xact_redo_abort(xl_xact_abort *xlrec, TransactionId xid) if (InHotStandby) { /* - * If a transaction completion record arrives that has as-yet unobserved - * subtransactions then this will not have been fully handled by the call - * to RecordKnownAssignedTransactionIds() in the main recovery loop in - * xlog.c. So we need to do bookkeeping again to cover that case. This is - * confusing and it is easy to think this call is irrelevant, which has - * happened three times in development already. Leave it in. + * If a transaction completion record arrives that has as-yet + * unobserved subtransactions then this will not have been fully + * handled by the call to RecordKnownAssignedTransactionIds() in the + * main recovery loop in xlog.c. So we need to do bookkeeping again to + * cover that case. This is confusing and it is easy to think this + * call is irrelevant, which has happened three times in development + * already. Leave it in. */ RecordKnownAssignedTransactionIds(max_xid); } @@ -4631,8 +4638,8 @@ xact_desc_commit(StringInfo buf, xl_xact_commit *xlrec) msgs = (SharedInvalidationMessage *) &xacts[xlrec->nsubxacts]; if (XactCompletionRelcacheInitFileInval(xlrec)) - appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u", - xlrec->dbId, xlrec->tsId); + appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u", + xlrec->dbId, xlrec->tsId); appendStringInfo(buf, "; inval msgs:"); for (i = 0; i < xlrec->nmsgs; i++) @@ -4738,8 +4745,8 @@ xact_desc(StringInfo buf, uint8 xl_info, char *rec) /* * Note that we ignore the WAL record's xid, since we're more - * interested in the top-level xid that issued the record - * and which xids are being reported here. + * interested in the top-level xid that issued the record and which + * xids are being reported here. */ appendStringInfo(buf, "xid assignment xtop %u: ", xlrec->xtop); xact_desc_assignment(buf, xlrec); |