Move multixid allocation out of critical section.
authorHeikki Linnakangas
Fri, 4 Apr 2014 15:20:22 +0000 (18:20 +0300)
committerHeikki Linnakangas
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;