]> granicus.if.org Git - postgresql/commitdiff
Move multixid allocation out of critical section.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 4 Apr 2014 15:20:22 +0000 (18:20 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 4 Apr 2014 15:24:43 +0000 (18:24 +0300)
It can fail if you run out of memory.

This call was added in 9.3, so backpatch to 9.3 only.

src/backend/access/heap/heapam.c

index d94980bbc16dc3062b2ada0c1e4076a6dc32dbe3..9283b70a420e248a46fd4cc35d468647b27c95be 100644 (file)
@@ -2717,6 +2717,21 @@ l1:
        /* replace cid with a combo cid if necessary */
        HeapTupleHeaderAdjustCmax(tp.t_data, &cid, &iscombo);
 
+       /*
+        * If this is the first possibly-multixact-able operation in the current
+        * transaction, set my per-backend OldestMemberMXactId setting. We can be
+        * certain that the transaction will never become a member of any older
+        * MultiXactIds than that.      (We have to do this even if we end up just
+        * using our own TransactionId below, since some other backend could
+        * incorporate our XID into a MultiXact immediately afterwards.)
+        */
+       MultiXactIdSetOldestMember();
+
+       compute_new_xmax_infomask(HeapTupleHeaderGetRawXmax(tp.t_data),
+                                                         tp.t_data->t_infomask, tp.t_data->t_infomask2,
+                                                         xid, LockTupleExclusive, true,
+                                                         &new_xmax, &new_infomask, &new_infomask2);
+
        START_CRIT_SECTION();
 
        /*
@@ -2736,21 +2751,6 @@ l1:
                                                        vmbuffer);
        }
 
-       /*
-        * If this is the first possibly-multixact-able operation in the current
-        * transaction, set my per-backend OldestMemberMXactId setting. We can be
-        * certain that the transaction will never become a member of any older
-        * MultiXactIds than that.      (We have to do this even if we end up just
-        * using our own TransactionId below, since some other backend could
-        * incorporate our XID into a MultiXact immediately afterwards.)
-        */
-       MultiXactIdSetOldestMember();
-
-       compute_new_xmax_infomask(HeapTupleHeaderGetRawXmax(tp.t_data),
-                                                         tp.t_data->t_infomask, tp.t_data->t_infomask2,
-                                                         xid, LockTupleExclusive, true,
-                                                         &new_xmax, &new_infomask, &new_infomask2);
-
        /* store transaction information of xact deleting the tuple */
        tp.t_data->t_infomask &= ~(HEAP_XMAX_BITS | HEAP_MOVED);
        tp.t_data->t_infomask2 &= ~HEAP_KEYS_UPDATED;