Skip to content

Commit 58f9465

Browse files
committed
Obtain xmin from GTM
1 parent adbbd19 commit 58f9465

File tree

5 files changed

+34
-7
lines changed

5 files changed

+34
-7
lines changed

contrib/pg_xtm/pg_dtm.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ static void DtmInitialize(void);
6868
static void DtmXactCallback(XactEvent event, void *arg);
6969
static TransactionId DtmGetNextXid(void);
7070
static TransactionId DtmGetNewTransactionId(bool isSubXact);
71+
static TransactionId DtmGetOldestXmin(Relation rel, bool ignoreVacuum);
7172

7273
static bool TransactionIdIsInDtmSnapshot(TransactionId xid);
7374
static bool TransactionIdIsInDoubt(TransactionId xid);
@@ -81,10 +82,11 @@ static Snapshot CurrentTransactionSnapshot;
8182

8283
static TransactionId DtmNextXid;
8384
static SnapshotData DtmSnapshot = { HeapTupleSatisfiesMVCC };
85+
static TransactionId DtmMinXid;
8486
static bool DtmHasGlobalSnapshot;
8587
static bool DtmIsGlobalTransaction;
8688
static int DtmLocalXidReserve;
87-
static TransactionManager DtmTM = { DtmGetTransactionStatus, DtmSetTransactionStatus, DtmGetSnapshot, DtmGetNewTransactionId };
89+
static TransactionManager DtmTM = { DtmGetTransactionStatus, DtmSetTransactionStatus, DtmGetSnapshot, DtmGetNewTransactionId, DtmGetOldestXmin };
8890

8991

9092
#define XTM_TRACE(fmt, ...)
@@ -163,9 +165,14 @@ static void DtmMergeSnapshots(Snapshot dst, Snapshot src)
163165
DumpSnapshot(src, "DTM");
164166

165167
/* Merge two snapshots: produce most restrictive snapshots whihc includes running transactions from both of them */
166-
if (src->xmin < dst->xmin) dst->xmin = src->xmin;
168+
if (src->xmin < dst->xmin) {
169+
dst->xmin = src->xmin;
170+
ProcArrayInstallImportedXmin(src->xmin, DtmNextXid);
171+
//MyPgXact->xmin = TransactionXmin = src->xmin;
172+
}
167173
if (src->xmax < dst->xmax) dst->xmax = src->xmax;
168174

175+
169176
n = dst->xcnt;
170177
for (xid = dst->xmax; xid <= src->xmin; xid++) {
171178
dst->xip[n++] = xid;
@@ -186,9 +193,20 @@ static void DtmMergeSnapshots(Snapshot dst, Snapshot src)
186193
DumpSnapshot(dst, "merged");
187194
}
188195

196+
static TransactionId DtmGetOldestXmin(Relation rel, bool ignoreVacuum)
197+
{
198+
TransactionId xmin = GetOldestLocalXmin(rel, ignoreVacuum);
199+
#if 0
200+
if (TransactionIdIsValid(DtmSnapshot.xmin) && TransactionIdPrecedes(DtmSnapshot.xmin, xmin)) {
201+
xmin = DtmSnapshot.xmin;
202+
}
203+
#endif
204+
return xmin;
205+
}
206+
189207
static void DtmUpdateRecentXmin(void)
190208
{
191-
TransactionId xmin = DtmSnapshot.xmin;
209+
TransactionId xmin = DtmMinXid;//DtmSnapshot.xmin;
192210

193211
XTM_TRACE("XTM: DtmUpdateRecentXmin \n");
194212

@@ -462,7 +480,7 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
462480

463481
if (TransactionIdIsValid(DtmNextXid)) {
464482
if (!DtmHasGlobalSnapshot) {
465-
DtmGlobalGetSnapshot(DtmNextXid, &DtmSnapshot);
483+
DtmGlobalGetSnapshot(DtmNextXid, &DtmSnapshot, &DtmMinXid);
466484
}
467485
DtmMergeSnapshots(snapshot, &DtmSnapshot);
468486
if (!IsolationUsesXactSnapshot()) {
@@ -675,7 +693,7 @@ dtm_begin_transaction(PG_FUNCTION_ARGS)
675693
int nParticipants = PG_GETARG_INT32(0);
676694
Assert(!TransactionIdIsValid(DtmNextXid));
677695

678-
DtmNextXid = DtmGlobalStartTransaction(nParticipants, &DtmSnapshot);
696+
DtmNextXid = DtmGlobalStartTransaction(nParticipants, &DtmSnapshot, &DtmMinXid);
679697
Assert(TransactionIdIsValid(DtmNextXid));
680698
XTM_INFO("%d: Start global transaction %d\n", getpid(), DtmNextXid);
681699

src/backend/access/transam/clog.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
#include "miscadmin.h"
4545
#include "pg_trace.h"
4646

47-
TransactionManager DefaultTM = { CLOGTransactionIdGetStatus, CLOGTransactionIdSetTreeStatus, GetLocalSnapshotData, GetNewLocalTransactionId };
47+
TransactionManager DefaultTM = { CLOGTransactionIdGetStatus, CLOGTransactionIdSetTreeStatus, GetLocalSnapshotData, GetNewLocalTransactionId, GetOldestLocalXmin };
4848
TransactionManager* TM = &DefaultTM;
4949

5050
/*

src/backend/storage/ipc/procarray.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,12 @@ TransactionIdIsActive(TransactionId xid)
12621262
}
12631263

12641264

1265+
TransactionId
1266+
GetOldestXmin(Relation rel, bool ignoreVacuum)
1267+
{
1268+
return TM->GetOldestXmin(rel, ignoreVacuum);
1269+
}
1270+
12651271
/*
12661272
* GetOldestXmin -- returns oldest transaction that was running
12671273
* when any current transaction was started.
@@ -1311,7 +1317,7 @@ TransactionIdIsActive(TransactionId xid)
13111317
* GetOldestXmin() move backwards, with no consequences for data integrity.
13121318
*/
13131319
TransactionId
1314-
GetOldestXmin(Relation rel, bool ignoreVacuum)
1320+
GetOldestLocalXmin(Relation rel, bool ignoreVacuum)
13151321
{
13161322
ProcArrayStruct *arrayP = procArray;
13171323
TransactionId result;

src/include/access/xtm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313

1414
#include "access/clog.h"
1515
#include "utils/snapmgr.h"
16+
#include "utils/relcache.h"
1617

1718
typedef struct
1819
{
1920
XidStatus (*GetTransactionStatus)(TransactionId xid, XLogRecPtr *lsn);
2021
void (*SetTransactionStatus)(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
2122
Snapshot (*GetSnapshot)(Snapshot snapshot);
2223
TransactionId (*GetNewTransactionId)(bool isSubXact);
24+
TransactionId (*GetOldestXmin)(Relation rel, bool ignoreVacuum);
2325
} TransactionManager;
2426

2527
extern TransactionManager* TM;

src/include/storage/procarray.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ extern bool TransactionIdIsRunning(TransactionId xid);
5656
extern bool TransactionIdIsInProgress(TransactionId xid);
5757
extern bool TransactionIdIsActive(TransactionId xid);
5858
extern TransactionId GetOldestXmin(Relation rel, bool ignoreVacuum);
59+
extern TransactionId GetOldestLocalXmin(Relation rel, bool ignoreVacuum);
5960
extern TransactionId GetOldestActiveTransactionId(void);
6061
extern TransactionId GetOldestSafeDecodingTransactionId(void);
6162

0 commit comments

Comments
 (0)