On 18/09/10 21:52, Kevin Grittner wrote:
> [Apologies for not reply-linking this; work email is down so I'm
> sending from gmail.]
>
> Based on feedback from Heikki and Tom I've reworked how I find the
> top-level transaction. This is in the git repo, and the changes can
> be viewed at:
>
>
http://git.postgresql.org/gitweb?p=users/kgrittn/postgres.git;a=commitdiff;h=e29927c7966adba2443fdc4f64da9d282f95a05b
Thanks, much simpler. Now let's simplify it some more ;-)
ISTM you never search the SerializableXactHash table using a hash key,
except the one call in CheckForSerializableConflictOut, but there you
already have a pointer to the SERIALIZABLEXACT struct. You only re-find
it to make sure it hasn't gone away while you trade the shared lock for
an exclusive one. If we find another way to ensure that, ISTM we don't
need SerializableXactHash at all. My first thought was to forget about
VirtualTransactionId and use TransactionId directly as the hash key for
SERIALIZABLEXACT. The problem is that a transaction doesn't have a
transaction ID when RegisterSerializableTransaction is called. We could
leave the TransactionId blank and only add the SERIALIZABLEXACT struct
to the hash table when an XID is assigned, but there's no provision to
insert an existing struct to a hash table in the current hash table API.
So, I'm not sure of the details yet, but it seems like it could be made
simpler somehow..
-- Heikki Linnakangas EnterpriseDB http://www.enterprisedb.com