0001-Swicth-TransamVariables-oldestClogXid-to-FullTransac.patch
application/octet-stream
Filename: 0001-Swicth-TransamVariables-oldestClogXid-to-FullTransac.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Swicth TransamVariables->oldestClogXid to FullTransactionId
| File | + | − |
|---|---|---|
| contrib/amcheck/verify_heapam.c | 1 | 3 |
| src/backend/access/transam/varsup.c | 7 | 3 |
| src/backend/utils/adt/xid8funcs.c | 5 | 15 |
| src/include/access/transam.h | 2 | 1 |
From d8f68fbce06bb9af4e6c15d3260e0266a46555ea Mon Sep 17 00:00:00 2001
From: Maxim Orlov <orlovmg@gmail.com>
Date: Fri, 27 Feb 2026 14:25:21 +0300
Subject: [PATCH 1/3] Swicth TransamVariables->oldestClogXid to
FullTransactionId
This commit refactors the code as a step to FullTransactionId in clog.
---
contrib/amcheck/verify_heapam.c | 4 +---
src/backend/access/transam/varsup.c | 10 +++++++---
src/backend/utils/adt/xid8funcs.c | 20 +++++---------------
src/include/access/transam.h | 3 ++-
4 files changed, 15 insertions(+), 22 deletions(-)
diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 31e19fbc69..e4a654e0ad 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -2157,9 +2157,7 @@ get_xid_status(TransactionId xid, HeapCheckContext *ctx,
*status = XID_COMMITTED;
LWLockAcquire(XactTruncationLock, LW_SHARED);
- clog_horizon =
- FullTransactionIdFromXidAndCtx(TransamVariables->oldestClogXid,
- ctx);
+ clog_horizon = TransamVariables->oldestClogXid;
if (FullTransactionIdPrecedesOrEquals(clog_horizon, fxid))
{
if (TransactionIdIsCurrentTransactionId(xid))
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 3e95d4cfd1..3e08c308d0 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -354,11 +354,15 @@ AdvanceNextFullTransactionIdPastXid(TransactionId xid)
void
AdvanceOldestClogXid(TransactionId oldest_datfrozenxid)
{
+ FullTransactionId oldest_datfrozenfxid =
+ FullTransactionIdFromAllowableAt(ReadNextFullTransactionId(),
+ oldest_datfrozenxid);
+
LWLockAcquire(XactTruncationLock, LW_EXCLUSIVE);
- if (TransactionIdPrecedes(TransamVariables->oldestClogXid,
- oldest_datfrozenxid))
+ if (FullTransactionIdPrecedes(TransamVariables->oldestClogXid,
+ oldest_datfrozenfxid))
{
- TransamVariables->oldestClogXid = oldest_datfrozenxid;
+ TransamVariables->oldestClogXid = oldest_datfrozenfxid;
}
LWLockRelease(XactTruncationLock);
}
diff --git a/src/backend/utils/adt/xid8funcs.c b/src/backend/utils/adt/xid8funcs.c
index c607e78d9a..7c37b40b41 100644
--- a/src/backend/utils/adt/xid8funcs.c
+++ b/src/backend/utils/adt/xid8funcs.c
@@ -97,25 +97,18 @@ StaticAssertDecl(MAX_BACKENDS * 2 <= PG_SNAPSHOT_MAX_NXIP,
static bool
TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid)
{
- TransactionId xid = XidFromFullTransactionId(fxid);
- FullTransactionId now_fullxid;
- TransactionId oldest_clog_xid;
- FullTransactionId oldest_clog_fxid;
-
- now_fullxid = ReadNextFullTransactionId();
-
if (extracted_xid != NULL)
- *extracted_xid = xid;
+ *extracted_xid = XidFromFullTransactionId(fxid);
- if (!TransactionIdIsValid(xid))
+ if (!FullTransactionIdIsValid(fxid))
return false;
/* For non-normal transaction IDs, we can ignore the epoch. */
- if (!TransactionIdIsNormal(xid))
+ if (!FullTransactionIdIsNormal(fxid))
return true;
/* If the transaction ID is in the future, throw an error. */
- if (!FullTransactionIdPrecedes(fxid, now_fullxid))
+ if (!FullTransactionIdPrecedes(fxid, ReadNextFullTransactionId()))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("transaction ID %" PRIu64 " is in the future",
@@ -141,10 +134,7 @@ TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid)
* advancement reinstated the usual oldestClogXid==oldestXid. Whether or
* not that happened, oldestClogXid is allowable relative to now_fullxid.
*/
- oldest_clog_xid = TransamVariables->oldestClogXid;
- oldest_clog_fxid =
- FullTransactionIdFromAllowableAt(now_fullxid, oldest_clog_xid);
- return !FullTransactionIdPrecedes(fxid, oldest_clog_fxid);
+ return !FullTransactionIdPrecedes(fxid, TransamVariables->oldestClogXid);
}
/*
diff --git a/src/include/access/transam.h b/src/include/access/transam.h
index 6fa91bfcdc..f08362898c 100644
--- a/src/include/access/transam.h
+++ b/src/include/access/transam.h
@@ -250,7 +250,8 @@ typedef struct TransamVariablesData
/*
* These fields are protected by XactTruncationLock
*/
- TransactionId oldestClogXid; /* oldest it's safe to look up in clog */
+ FullTransactionId oldestClogXid; /* oldest it's safe to look up in
+ * clog */
} TransamVariablesData;
--
2.43.0