]> granicus.if.org Git - postgresql/commitdiff
Move RegisterPredicateLockingXid() call to a safer place.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 6 May 2011 16:57:28 +0000 (12:57 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 6 May 2011 16:57:28 +0000 (12:57 -0400)
The SSI patch inserted a call of RegisterPredicateLockingXid into
GetNewTransactionId, which was a bad idea on a couple of grounds.  First,
it's not necessary to hold XidGenLock while manipulating that shared
memory, and doing so is bad because XidGenLock is a high-contention lock
that should be held for as short a time as possible.  (Not to mention that
it adds an entirely unnecessary deadlock hazard, since we must take
SerializableXactHashLock as well.)  Second, the specific place where it was
put was between extending CLOG and advancing nextXid, which could result in
unpleasant behavior in case of a failure there.  Pull the call out to
AssignTransactionId, which is much safer and arguably better from a
modularity standpoint too.

There is more work to do to clean up the failure-before-advancing-nextXid
issue, but that is a separate change that will need to be back-patched.
So for the moment I just want to make GetNewTransactionId look the same as
it did in prior versions.

src/backend/access/transam/varsup.c
src/backend/access/transam/xact.c

index 500335bd6ffb398e4db82807a1a7b76d7cde260a..555bb134f55ed0d525f7cc65011b7c063c8b8cef 100644 (file)
@@ -21,7 +21,6 @@
 #include "miscadmin.h"
 #include "postmaster/autovacuum.h"
 #include "storage/pmsignal.h"
-#include "storage/predicate.h"
 #include "storage/proc.h"
 #include "utils/builtins.h"
 #include "utils/syscache.h"
@@ -162,10 +161,6 @@ GetNewTransactionId(bool isSubXact)
        ExtendCLOG(xid);
        ExtendSUBTRANS(xid);
 
-       /* If it's top level, the predicate locking system also needs to know. */
-       if (!isSubXact)
-               RegisterPredicateLockingXid(xid);
-
        /*
         * Now advance the nextXid counter.  This must not happen until after we
         * have successfully completed ExtendCLOG() --- if that routine fails, we
index 8a4c4eccd7398f8e833a81f437a9f8fb09937127..2ca1c1454993dbb9b7695ad41a96fa6c2932c503 100644 (file)
@@ -454,6 +454,13 @@ AssignTransactionId(TransactionState s)
        if (isSubXact)
                SubTransSetParent(s->transactionId, s->parent->transactionId, false);
 
+       /*
+        * If it's a top-level transaction, the predicate locking system needs to
+        * be told about it too.
+        */
+       if (!isSubXact)
+               RegisterPredicateLockingXid(s->transactionId);
+
        /*
         * Acquire lock on the transaction XID.  (We assume this cannot block.) We
         * have to ensure that the lock is assigned to the transaction's own