postgres.git / summary / log / commit / refs
commit a2f9572ca507bfcb71bcf1b81b563e5094fd6904
Author: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Fri Apr 04 15:20:22 2014 +0000
First released in: 9.4.0, 9.3.5
Move multixid allocation out of critical section.
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 | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index d94980bbc16..9283b70a420 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -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;
[parent: 1891a4b6b8ad]