From b1236f4b7ba2c05542f44d07c0a9ffbec3b66295 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Fri, 4 Apr 2014 18:20:22 +0300 Subject: [PATCH] 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 180eff4e6b..2605f205e2 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -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;