Simon Riggs wrote:
On Thu, 2009-02-12 at 14:23 +0200, Heikki Linnakangas wrote:
Simon Riggs wrote:
On Thu, 2009-02-12 at 09:50 +0200, Heikki Linnakangas wrote:
So far so good, but what about all the other callers of SubTransGetParent()? For example, XactLockTableWait will fail an assertion if asked to wait on a subtransaction which is then released.
I agree that it could fail the assertion, though it is clear that the
assertion should now be removed.
No, then you just get an infinite loop instead, trying to get the parent of 0 over and over again.

There is no infinite loop. Try it, or read TransactionIdIsInProgress().

I did, my CPU was pegged at 100%. Hmm, attaching with a debugger shows that it's not looping within XactLockTableWait as I assumed. Instead, XactLockTableWait returns without waiting on the parent, so we get into an busy loop in _bt_do_insert, trying to wait on the transaction over and over again.

The logic is: if there is no lock table entry for that xid *and* it is
not in progress *and* it is not in pg_subtrans, then it must have been
an aborted subtransaction of a currently active xact or it has otherwise
completed.
Right, we got it right that far. But after the subtransaction has completed, the question is: what's its parent? That's what the patch got wrong.

We can find that out from procarray, since a subcommitted xid will still
be present in the subxid cache of its parent (by definition, otherwise
it will be marked in pg_subtrans).

Unless the top transaction just committed. Looking at the other callers of SubTransGetParent, I think it would introduce a race condition to TransactionIdDidAbort and TransactionIdDidCommit.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to