diff options
author | Tom Lane | 2004-08-22 02:41:58 +0000 |
---|---|---|
committer | Tom Lane | 2004-08-22 02:41:58 +0000 |
commit | f009c316ba49857249611bc0d578c518c449879e (patch) | |
tree | 4fbab4d7068969dced2e698735407b1ffca38075 /src/backend/access/transam/subtrans.c | |
parent | 37d937ea2c062093887e6aa03879166b6db06900 (diff) |
Tweak code so that pg_subtrans is never consulted for XIDs older than
RecentXmin (== MyProc->xmin). This ensures that it will be safe to
truncate pg_subtrans at RecentGlobalXmin, which should largely eliminate
any fear of bloat. Along the way, eliminate SubTransXidsHaveCommonAncestor,
which isn't really needed and could not give a trustworthy result anyway
under the lookback restriction.
In an unrelated but nearby change, #ifdef out GetUndoRecPtr, which has
been dead code since 2001 and seems unlikely to ever be resurrected.
Diffstat (limited to 'src/backend/access/transam/subtrans.c')
-rw-r--r-- | src/backend/access/transam/subtrans.c | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c index 1babedbe590..ace1bb1434a 100644 --- a/src/backend/access/transam/subtrans.c +++ b/src/backend/access/transam/subtrans.c @@ -15,7 +15,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/subtrans.c,v 1.1 2004/07/01 00:49:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/subtrans.c,v 1.2 2004/08/22 02:41:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -30,6 +30,7 @@ #include "access/subtrans.h" #include "miscadmin.h" #include "storage/lwlock.h" +#include "utils/tqual.h" /* @@ -113,6 +114,9 @@ SubTransGetParent(TransactionId xid) TransactionId *ptr; TransactionId parent; + /* Can't ask about stuff that might not be around anymore */ + Assert(TransactionIdFollowsOrEquals(xid, RecentXmin)); + /* Bootstrap and frozen XIDs have no parent */ if (!TransactionIdIsNormal(xid)) return InvalidTransactionId; @@ -133,6 +137,13 @@ SubTransGetParent(TransactionId xid) * SubTransGetTopmostTransaction * * Returns the topmost transaction of the given transaction id. + * + * Because we cannot look back further than RecentXmin, it is possible + * that this function will lie and return an intermediate subtransaction ID + * instead of the true topmost parent ID. This is OK, because in practice + * we only care about detecting whether the topmost parent is still running + * or is part of a current snapshot's list of still-running transactions. + * Therefore, any XID before RecentXmin is as good as any other. */ TransactionId SubTransGetTopmostTransaction(TransactionId xid) @@ -140,9 +151,14 @@ SubTransGetTopmostTransaction(TransactionId xid) TransactionId parentXid = xid, previousXid = xid; + /* Can't ask about stuff that might not be around anymore */ + Assert(TransactionIdFollowsOrEquals(xid, RecentXmin)); + while (TransactionIdIsValid(parentXid)) { previousXid = parentXid; + if (TransactionIdPrecedes(parentXid, RecentXmin)) + break; parentXid = SubTransGetParent(parentXid); } @@ -151,30 +167,6 @@ SubTransGetTopmostTransaction(TransactionId xid) return previousXid; } -/* - * SubTransXidsHaveCommonAncestor - * - * Returns true iff the Xids have a common ancestor - */ -bool -SubTransXidsHaveCommonAncestor(TransactionId xid1, TransactionId xid2) -{ - if (TransactionIdEquals(xid1, xid2)) - return true; - - while (TransactionIdIsValid(xid1) && TransactionIdIsValid(xid2)) - { - if (TransactionIdPrecedes(xid2, xid1)) - xid1 = SubTransGetParent(xid1); - else - xid2 = SubTransGetParent(xid2); - - if (TransactionIdEquals(xid1, xid2)) - return true; - } - - return false; -} /* * Initialization of shared memory for Subtrans |