I wrote:
> I see a bug though, which is that RecordSubTransactionAbort() calls
> GetCurrentTransactionId() before having verified that it needs to do
> anything. This means that we'll generate and then discard an XID
> uselessly in a failed subxact that didn't touch disk.
Well, it would be a bug except that RecordSubTransactionAbort isn't
called unless the current subxact has an XID. Perhaps a comment would
be appropriate but there's nothing to fix here.
I think Theo's problem is probably somewhere else, too --- apparently
it's not so much that TransactionIdIsCurrentTransactionId takes a long
time as that something is calling it lots of times with no check for
interrupt.
regards, tom lane