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)
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