File tree Expand file tree Collapse file tree 3 files changed +26
-5
lines changed Expand file tree Collapse file tree 3 files changed +26
-5
lines changed Original file line number Diff line number Diff line change @@ -393,6 +393,28 @@ GetCurrentTransactionIdIfAny(void)
393
393
}
394
394
395
395
396
+ /*
397
+ * GetStableLatestTransactionIdIfAny
398
+ *
399
+ * Get the latest XID once and then return same value for rest of transaction.
400
+ * Acts as a useful reference point for maintenance tasks.
401
+ */
402
+ TransactionId
403
+ GetStableLatestTransactionId (void )
404
+ {
405
+ static LocalTransactionId lxid = InvalidLocalTransactionId ;
406
+ static TransactionId stablexid = InvalidTransactionId ;
407
+
408
+ if (lxid != MyProc -> lxid ||
409
+ !TransactionIdIsValid (stablexid ))
410
+ {
411
+ lxid = MyProc -> lxid ;
412
+ stablexid = ReadNewTransactionId ();
413
+ }
414
+
415
+ return stablexid ;
416
+ }
417
+
396
418
/*
397
419
* AssignTransactionId
398
420
*
Original file line number Diff line number Diff line change 19
19
#include "access/transam.h"
20
20
#include "access/xact.h"
21
21
#include "libpq/pqformat.h"
22
+ #include "storage/proc.h"
22
23
#include "utils/builtins.h"
23
24
24
25
#define PG_GETARG_TRANSACTIONID (n ) DatumGetTransactionId(PG_GETARG_DATUM(n))
@@ -87,16 +88,13 @@ xideq(PG_FUNCTION_ARGS)
87
88
}
88
89
89
90
/*
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 )
91
92
*/
92
93
Datum
93
94
xid_age (PG_FUNCTION_ARGS )
94
95
{
95
96
TransactionId xid = PG_GETARG_TRANSACTIONID (0 );
96
- TransactionId now = GetTopTransactionIdIfAny ();
97
-
98
- if (!TransactionIdIsValid (now ))
99
- now = ReadNewTransactionId ();
97
+ TransactionId now = GetStableLatestTransactionId ();
100
98
101
99
/* Permanent XIDs are always infinitely old */
102
100
if (!TransactionIdIsNormal (xid ))
Original file line number Diff line number Diff line change @@ -198,6 +198,7 @@ extern TransactionId GetTopTransactionId(void);
198
198
extern TransactionId GetTopTransactionIdIfAny (void );
199
199
extern TransactionId GetCurrentTransactionId (void );
200
200
extern TransactionId GetCurrentTransactionIdIfAny (void );
201
+ extern TransactionId GetStableLatestTransactionId (void );
201
202
extern SubTransactionId GetCurrentSubTransactionId (void );
202
203
extern CommandId GetCurrentCommandId (bool used );
203
204
extern TimestampTz GetCurrentTransactionStartTimestamp (void );
You can’t perform that action at this time.
0 commit comments