Re: loose ends in lazy-XID-assigment patch - Mailing list pgsql-hackers

From Florian G. Pflug
Subject Re: loose ends in lazy-XID-assigment patch
Date
Msg-id 46DEFB80.6030305@phlo.org
Whole thread Raw
In response to loose ends in lazy-XID-assigment patch  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: loose ends in lazy-XID-assigment patch
List pgsql-hackers
Tom Lane wrote:
> I've committed Florian's patch, but there remain a couple of things
> that need work:
> 
> * Should CSV-mode logging include the virtual transaction ID (VXID) in
> addition to, or instead of, XID?  There will be many situations where
> there is no XID.
Maybe make %x show both, or only the xid if that is set, and the vxid
otherwise? That would probably be what most existing users of %x want.
For those who want them seperated, we'd have %v (vxid), and maybe
%X (xid only). Seems a bit like overkills, though...

> 
> * As things stand, when a two-phase transaction is prepared, it drops
> its lock on the original VXID; this seems necessary for reasons
> previously discussed.  I made the code put an invalid VXID into the
> gxact structure for the prepared xact, which means that pg_locks shows
> things like this:
> 
> regression=# select * from pg_locks;
>    locktype    | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid |
virtualtransaction|  pid  |      mode       | granted 
 
>
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+-------+-----------------+---------
>  transactionid |          |          |      |       |            |         21774 |         |       |          | -1/0
            |       | ExclusiveLock   | t
 
>  relation      |   126093 |   126124 |      |       |            |               |         |       |          | -1/0
            |       | AccessShareLock | t
 
>  relation      |   126093 |    10969 |      |       |            |               |         |       |          | 1/260
            | 20592 | AccessShareLock | t
 
>  virtualxid    |          |          |      |       | 1/260      |               |         |       |          | 1/260
            | 20592 | ExclusiveLock   | t
 
> (4 rows)
> 
> This seems fairly undesirable :-( not least because you can't tell one
> prepared xact from another and thus can't see which locks belong to
> each.  But I'm unsure what to do about it.  We could have the prepared
> xact continue to display the original VXID, but there would be no
> certainty about the VXID remaining unique, which seems bad.  Another
> possibility is to put back the transaction ID column, but since that's
> not unique for read-only transactions, we still don't have anything
> usable as a join key.
> 
> The best idea I can think of is to make the virtualtransaction column
> read out the VXID for regular transactions and the transaction ID for
> prepared transactions, or maybe the transaction ID for any transaction
> that has one and VXID just for read-only xacts.  We can get away with
> that because the column is only text and not any better-defined
> datatype.  It seems mighty ugly though; and changing the ID shown for
> a transaction mid-stream isn't very pleasant either.

We could make the VXID in the gxact struct be
backendId=InvalidBackendId, lxid=xid. That'd be still an invalid vxid, but not
the same for every prepared transaction.

If we take this further, we could get rid of the lock on the xid completely,
I believe. We'd define some PermanentBackendId (lets say, -2, since -1 is
taken). When preparing the xact, we'd drop the lock on the old VXID, and
instead acquire one on (PermanentBackendId, xid). Waiting on an xid would
become a bit tricky, but doable I think. We'd have to first check the procarray
- if we find the xid there, we translate it to a vxid, and wait on that.
Aftwards (whether we found a vxid, or not) we wait on (PermanentBackendId, xid).
That doesn't exactly make XactLockTableWait cheaper, but that might be OK,
since we

I haven't really thought this through, though. I think that with carefull
ordering of things we can control the race conditions this might posses -
but I'm not sure at this point.

greetings, Florian Pflug



pgsql-hackers by date:

Previous
From: Greg Smith
Date:
Subject: Re: Final background writer cleanup for 8.3
Next
From: Brian Hurt
Date:
Subject: Re: Should pointers to PGPROC be volatile-qualified?