@@ -4183,7 +4183,9 @@ heap_lock_tuple(Relation relation, HeapTuple tuple,
4183
4183
* the case, HeapTupleSatisfiesUpdate would have returned
4184
4184
* MayBeUpdated and we wouldn't be here.
4185
4185
*/
4186
- nmembers = GetMultiXactIdMembers (xwait , & members , false);
4186
+ nmembers =
4187
+ GetMultiXactIdMembers (xwait , & members , false,
4188
+ HEAP_XMAX_IS_LOCKED_ONLY (infomask ));
4187
4189
4188
4190
for (i = 0 ; i < nmembers ; i ++ )
4189
4191
{
@@ -4204,7 +4206,8 @@ heap_lock_tuple(Relation relation, HeapTuple tuple,
4204
4206
}
4205
4207
}
4206
4208
4207
- pfree (members );
4209
+ if (members )
4210
+ pfree (members );
4208
4211
}
4209
4212
4210
4213
/*
@@ -4353,7 +4356,9 @@ heap_lock_tuple(Relation relation, HeapTuple tuple,
4353
4356
* been the case, HeapTupleSatisfiesUpdate would have returned
4354
4357
* MayBeUpdated and we wouldn't be here.
4355
4358
*/
4356
- nmembers = GetMultiXactIdMembers (xwait , & members , false);
4359
+ nmembers =
4360
+ GetMultiXactIdMembers (xwait , & members , false,
4361
+ HEAP_XMAX_IS_LOCKED_ONLY (infomask ));
4357
4362
4358
4363
if (nmembers <= 0 )
4359
4364
{
@@ -4834,7 +4839,7 @@ compute_new_xmax_infomask(TransactionId xmax, uint16 old_infomask,
4834
4839
* MultiXactIdExpand if we weren't to do this, so this check is not
4835
4840
* incurring extra work anyhow.
4836
4841
*/
4837
- if (!MultiXactIdIsRunning (xmax ))
4842
+ if (!MultiXactIdIsRunning (xmax , HEAP_XMAX_IS_LOCKED_ONLY ( old_infomask ) ))
4838
4843
{
4839
4844
if (HEAP_XMAX_IS_LOCKED_ONLY (old_infomask ) ||
4840
4845
TransactionIdDidAbort (MultiXactIdGetUpdateXid (xmax ,
@@ -5175,7 +5180,8 @@ heap_lock_updated_tuple_rec(Relation rel, ItemPointer tid, TransactionId xid,
5175
5180
int i ;
5176
5181
MultiXactMember * members ;
5177
5182
5178
- nmembers = GetMultiXactIdMembers (rawxmax , & members , false);
5183
+ nmembers = GetMultiXactIdMembers (rawxmax , & members , false,
5184
+ HEAP_XMAX_IS_LOCKED_ONLY (old_infomask ));
5179
5185
for (i = 0 ; i < nmembers ; i ++ )
5180
5186
{
5181
5187
HTSU_Result res ;
@@ -5533,7 +5539,8 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
5533
5539
*/
5534
5540
Assert ((!(t_infomask & HEAP_LOCK_MASK ) &&
5535
5541
HEAP_XMAX_IS_LOCKED_ONLY (t_infomask )) ||
5536
- !MultiXactIdIsRunning (multi ));
5542
+ !MultiXactIdIsRunning (multi ,
5543
+ HEAP_XMAX_IS_LOCKED_ONLY (t_infomask )));
5537
5544
if (HEAP_XMAX_IS_LOCKED_ONLY (t_infomask ))
5538
5545
{
5539
5546
* flags |= FRM_INVALIDATE_XMAX ;
@@ -5576,7 +5583,9 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
5576
5583
5577
5584
allow_old = !(t_infomask & HEAP_LOCK_MASK ) &&
5578
5585
HEAP_XMAX_IS_LOCKED_ONLY (t_infomask );
5579
- nmembers = GetMultiXactIdMembers (multi , & members , allow_old );
5586
+ nmembers =
5587
+ GetMultiXactIdMembers (multi , & members , allow_old ,
5588
+ HEAP_XMAX_IS_LOCKED_ONLY (t_infomask ));
5580
5589
if (nmembers <= 0 )
5581
5590
{
5582
5591
/* Nothing worth keeping */
@@ -5983,7 +5992,7 @@ GetMultiXactIdHintBits(MultiXactId multi, uint16 *new_infomask,
5983
5992
* We only use this in multis we just created, so they cannot be values
5984
5993
* pre-pg_upgrade.
5985
5994
*/
5986
- nmembers = GetMultiXactIdMembers (multi , & members , false);
5995
+ nmembers = GetMultiXactIdMembers (multi , & members , false, false );
5987
5996
5988
5997
for (i = 0 ; i < nmembers ; i ++ )
5989
5998
{
@@ -6062,7 +6071,7 @@ MultiXactIdGetUpdateXid(TransactionId xmax, uint16 t_infomask)
6062
6071
* Since we know the LOCK_ONLY bit is not set, this cannot be a multi from
6063
6072
* pre-pg_upgrade.
6064
6073
*/
6065
- nmembers = GetMultiXactIdMembers (xmax , & members , false);
6074
+ nmembers = GetMultiXactIdMembers (xmax , & members , false, false );
6066
6075
6067
6076
if (nmembers > 0 )
6068
6077
{
@@ -6148,7 +6157,8 @@ Do_MultiXactIdWait(MultiXactId multi, MultiXactStatus status,
6148
6157
int remain = 0 ;
6149
6158
6150
6159
allow_old = !(infomask & HEAP_LOCK_MASK ) && HEAP_XMAX_IS_LOCKED_ONLY (infomask );
6151
- nmembers = GetMultiXactIdMembers (multi , & members , allow_old );
6160
+ nmembers = GetMultiXactIdMembers (multi , & members , allow_old ,
6161
+ HEAP_XMAX_IS_LOCKED_ONLY (infomask ));
6152
6162
6153
6163
if (nmembers >= 0 )
6154
6164
{
@@ -6294,7 +6304,8 @@ heap_tuple_needs_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid,
6294
6304
6295
6305
allow_old = !(tuple -> t_infomask & HEAP_LOCK_MASK ) &&
6296
6306
HEAP_XMAX_IS_LOCKED_ONLY (tuple -> t_infomask );
6297
- nmembers = GetMultiXactIdMembers (multi , & members , allow_old );
6307
+ nmembers = GetMultiXactIdMembers (multi , & members , allow_old ,
6308
+ HEAP_XMAX_IS_LOCKED_ONLY (tuple -> t_infomask ));
6298
6309
6299
6310
for (i = 0 ; i < nmembers ; i ++ )
6300
6311
{
0 commit comments