It seems to me that heap_lock_updated_tuple_rec can lead to a buffer refcount leak while locking an updated tuple by an aborted transaction. In commit - 5c609a74, we have added the code to deal with aborted transactions as below:
heap_lock_updated_tuple_rec() { .. if (PageIsAllVisible(BufferGetPage(buf))) visibilitymap_pin(rel, block, &vmbuffer); else vmbuffer = InvalidBuffer; LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); .. -------------------------- below code is added by commit -5c609a74 ----------- if (TransactionIdDidAbort(HeapTupleHeaderGetXmin(mytup.t_data))) { UnlockReleaseBuffer(buf); return HeapTupleMayBeUpdated; } ------------------------------------------------------------- I think the above code forgets to deal with vmbuffer and can lead to a leak of the same. Attached patch ensures that it deals with vmbuffer when required. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
fix_failure_cond_tup_version_locking_v1.patch
Description: Binary data