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:20:22 +0000 (18:20 +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 180eff4e6b066224cc3d80681696fda0375c3df5..2605f205e27d3acd273c484056c0c87bc3382bc8 100644 (file)
@@ -2814,6 +2814,21 @@ l1:
     */
    old_key_tuple = ExtractReplicaIdentity(relation, &tp, true, &old_key_copied);
 
+   /*
+    * 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();
 
    /*
@@ -2833,21 +2848,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;