0001-Prefer-FRM_INVALIDATE_XMAX-over-FRM_NOOP-when-cheape.patch
application/octet-stream
Filename: 0001-Prefer-FRM_INVALIDATE_XMAX-over-FRM_NOOP-when-cheape.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: Prefer FRM_INVALIDATE_XMAX over FRM_NOOP when cheaper.
| File | + | − |
|---|---|---|
| src/backend/access/heap/heapam.c | 13 | 2 |
From a070c3d806a1d05bab24d040ad4a3bdb0a951b60 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Thu, 29 Dec 2022 13:25:24 -0800
Subject: [PATCH] Prefer FRM_INVALIDATE_XMAX over FRM_NOOP when cheaper.
---
src/backend/access/heap/heapam.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 34d83dc70..0bc7d27d7 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -6146,7 +6146,8 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
TransactionId newxmax;
MultiXactMember *members;
int nmembers;
- bool need_replace;
+ bool need_replace,
+ cheap_to_replace;
int nnewmembers;
MultiXactMember *newmembers;
bool has_lockers;
@@ -6262,6 +6263,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
* OldestXmin/OldestMxact, so later values never need to be tracked here.)
*/
need_replace = false;
+ cheap_to_replace = true;
FreezePageRelfrozenXid = pagefrz->FreezePageRelfrozenXid;
for (int i = 0; i < nmembers; i++)
{
@@ -6275,6 +6277,8 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
need_replace = true;
break;
}
+ if (TransactionIdFollowsOrEquals(xid, cutoffs->OldestXmin))
+ cheap_to_replace = false;
if (TransactionIdPrecedes(xid, FreezePageRelfrozenXid))
FreezePageRelfrozenXid = xid;
}
@@ -6283,7 +6287,12 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
if (!need_replace)
need_replace = MultiXactIdPrecedes(multi, cutoffs->MultiXactCutoff);
- if (!need_replace)
+ /*
+ * FRM_NOOP isn't cheaper than a second pass that indicates that xmax gets
+ * FRM_INVALIDATE_XMAX processing. Avoid FRM_NOOP whenever we've already
+ * determined that doing a second pass will be cheaper (and more useful).
+ */
+ if (!need_replace && !cheap_to_replace)
{
/*
* vacuumlazy.c might ratchet back NewRelminMxid, NewRelfrozenXid, or
@@ -6424,6 +6433,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
* interesting, because those are longer-lived.)
*/
Assert(nnewmembers == 1);
+ Assert(need_replace);
*flags |= FRM_RETURN_IS_XID;
if (update_committed)
*flags |= FRM_MARK_COMMITTED;
@@ -6435,6 +6445,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask,
* Create a new multixact with the surviving members of the previous
* one, to set as new Xmax in the tuple
*/
+ Assert(need_replace);
newxmax = MultiXactIdCreateFromMembers(nnewmembers, newmembers);
*flags |= FRM_RETURN_IS_MULTI;
}
--
2.38.1