Skip to content

Commit b06679e

Browse files
Ensure age() returns a stable value rather than the latest value
1 parent 3652d72 commit b06679e

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

src/backend/access/transam/xact.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,28 @@ GetCurrentTransactionIdIfAny(void)
391391
}
392392

393393

394+
/*
395+
* GetStableLatestTransactionIdIfAny
396+
*
397+
* Get the latest XID once and then return same value for rest of transaction.
398+
* Acts as a useful reference point for maintenance tasks.
399+
*/
400+
TransactionId
401+
GetStableLatestTransactionId(void)
402+
{
403+
static LocalTransactionId lxid = InvalidLocalTransactionId;
404+
static TransactionId stablexid = InvalidTransactionId;
405+
406+
if (lxid != MyProc->lxid ||
407+
!TransactionIdIsValid(stablexid))
408+
{
409+
lxid = MyProc->lxid;
410+
stablexid = ReadNewTransactionId();
411+
}
412+
413+
return stablexid;
414+
}
415+
394416
/*
395417
* AssignTransactionId
396418
*

src/backend/utils/adt/xid.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "access/transam.h"
2020
#include "access/xact.h"
2121
#include "libpq/pqformat.h"
22+
#include "storage/proc.h"
2223
#include "utils/builtins.h"
2324

2425
#define PG_GETARG_TRANSACTIONID(n) DatumGetTransactionId(PG_GETARG_DATUM(n))
@@ -87,16 +88,13 @@ xideq(PG_FUNCTION_ARGS)
8788
}
8889

8990
/*
90-
* xid_age - compute age of an XID (relative to current xact)
91+
* xid_age - compute age of an XID (relative to latest stable xid)
9192
*/
9293
Datum
9394
xid_age(PG_FUNCTION_ARGS)
9495
{
9596
TransactionId xid = PG_GETARG_TRANSACTIONID(0);
96-
TransactionId now = GetTopTransactionIdIfAny();
97-
98-
if (!TransactionIdIsValid(now))
99-
now = ReadNewTransactionId();
97+
TransactionId now = GetStableLatestTransactionId();
10098

10199
/* Permanent XIDs are always infinitely old */
102100
if (!TransactionIdIsNormal(xid))

src/include/access/xact.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ extern TransactionId GetTopTransactionId(void);
209209
extern TransactionId GetTopTransactionIdIfAny(void);
210210
extern TransactionId GetCurrentTransactionId(void);
211211
extern TransactionId GetCurrentTransactionIdIfAny(void);
212+
extern TransactionId GetStableLatestTransactionId(void);
212213
extern SubTransactionId GetCurrentSubTransactionId(void);
213214
extern CommandId GetCurrentCommandId(bool used);
214215
extern TimestampTz GetCurrentTransactionStartTimestamp(void);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy