Skip to content

Commit 4599f99

Browse files
committed
Refectoring of XTM API
1 parent fe853ca commit 4599f99

File tree

12 files changed

+81
-80
lines changed

12 files changed

+81
-80
lines changed

contrib/pg_dtm/pg_dtm.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ static bool DtmGlobalXidAssigned;
8787
static int DtmLocalXidReserve;
8888
static int DtmCurcid;
8989
static Snapshot DtmLastSnapshot;
90-
static TransactionManager DtmTM = { DtmGetTransactionStatus, DtmSetTransactionStatus, DtmGetSnapshot, DtmGetNewTransactionId, DtmGetOldestXmin, TransactionIdIsRunning, DtmGetGlobalTransactionId };
90+
static TransactionManager DtmTM = { DtmGetTransactionStatus, DtmSetTransactionStatus, DtmGetSnapshot, DtmGetNewTransactionId, DtmGetOldestXmin, PgTransactionIdIsInProgress, DtmGetGlobalTransactionId, PgXidInMVCCSnapshot };
9191

9292

9393
#define XTM_TRACE(fmt, ...)
@@ -169,7 +169,7 @@ static void DtmMergeWithGlobalSnapshot(Snapshot dst)
169169
* Check that global and local snapshots are consistent: transactions marked as completed in global snapohsot
170170
* should be completed locally
171171
*/
172-
dst = GetLocalSnapshotData(dst);
172+
dst = PgGetSnapshotData(dst);
173173
for (i = 0; i < dst->xcnt; i++) {
174174
if (TransactionIdIsInDoubt(dst->xip[i])) {
175175
goto GetLocalSnapshot;
@@ -213,7 +213,7 @@ static void DtmMergeWithGlobalSnapshot(Snapshot dst)
213213
*/
214214
static TransactionId DtmGetOldestXmin(Relation rel, bool ignoreVacuum)
215215
{
216-
TransactionId localXmin = GetOldestLocalXmin(rel, ignoreVacuum);
216+
TransactionId localXmin = PgGetOldestXmin(rel, ignoreVacuum);
217217
TransactionId globalXmin = dtm->minXid;
218218
XTM_INFO("XTM: DtmGetOldestXmin localXmin=%d, globalXmin=%d\n", localXmin, globalXmin);
219219

@@ -526,7 +526,7 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
526526
* which PRECEDS actual transaction for which Xid is received.
527527
* This transaction doesn't need to take in accountn global snapshot
528528
*/
529-
return GetLocalSnapshotData(snapshot);
529+
return PgGetSnapshotData(snapshot);
530530
}
531531
if (TransactionIdIsValid(DtmNextXid) && snapshot != &CatalogSnapshotData) {
532532
if (!DtmHasGlobalSnapshot && (snapshot != DtmLastSnapshot || DtmCurcid != snapshot->curcid)) {
@@ -543,7 +543,7 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
543543
}
544544
} else {
545545
/* For local transactions and catalog snapshots use default GetSnapshotData implementation */
546-
snapshot = GetLocalSnapshotData(snapshot);
546+
snapshot = PgGetSnapshotData(snapshot);
547547
}
548548
DtmUpdateRecentXmin(snapshot);
549549
CurrentTransactionSnapshot = snapshot;
@@ -557,7 +557,7 @@ static XidStatus DtmGetTransactionStatus(TransactionId xid, XLogRecPtr *lsn)
557557
*/
558558
XidStatus status = xid >= ShmemVariableCache->nextXid
559559
? TRANSACTION_STATUS_IN_PROGRESS
560-
: CLOGTransactionIdGetStatus(xid, lsn);
560+
: PgTransactionIdGetStatus(xid, lsn);
561561
XTM_TRACE("XTM: DtmGetTransactionStatus\n");
562562
return status;
563563
}
@@ -569,7 +569,7 @@ static void DtmSetTransactionStatus(TransactionId xid, int nsubxids, Transaction
569569
if (!DtmGlobalXidAssigned && TransactionIdIsValid(DtmNextXid)) {
570570
CurrentTransactionSnapshot = NULL;
571571
if (status == TRANSACTION_STATUS_ABORTED) {
572-
CLOGTransactionIdSetTreeStatus(xid, nsubxids, subxids, status, lsn);
572+
PgTransactionIdSetTreeStatus(xid, nsubxids, subxids, status, lsn);
573573
DtmGlobalSetTransStatus(xid, status, false);
574574
XTM_INFO("Abort transaction %d\n", xid);
575575
return;
@@ -592,7 +592,7 @@ static void DtmSetTransactionStatus(TransactionId xid, int nsubxids, Transaction
592592
status = gs;
593593
}
594594
}
595-
CLOGTransactionIdSetTreeStatus(xid, nsubxids, subxids, status, lsn);
595+
PgTransactionIdSetTreeStatus(xid, nsubxids, subxids, status, lsn);
596596
}
597597

598598
static uint32 dtm_xid_hash_fn(const void *key, Size keysize)

src/backend/access/transam/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ include $(top_builddir)/src/Makefile.global
1515
OBJS = clog.o commit_ts.o multixact.o parallel.o rmgr.o slru.o subtrans.o \
1616
timeline.o transam.o twophase.o twophase_rmgr.o varsup.o \
1717
xact.o xlog.o xlogarchive.o xlogfuncs.o \
18-
xloginsert.o xlogreader.o xlogutils.o
18+
xloginsert.o xlogreader.o xlogutils.o xtm.o
1919

2020
include $(top_srcdir)/src/backend/common.mk
2121

src/backend/access/transam/clog.c

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,6 @@
4444
#include "miscadmin.h"
4545
#include "pg_trace.h"
4646

47-
static TransactionId GetGlobalTransactionId(void);
48-
49-
TransactionId GetGlobalTransactionId(void)
50-
{
51-
return InvalidTransactionId;
52-
}
53-
54-
TransactionManager DefaultTM = {
55-
CLOGTransactionIdGetStatus,
56-
CLOGTransactionIdSetTreeStatus,
57-
GetLocalSnapshotData,
58-
GetNewLocalTransactionId,
59-
GetOldestLocalXmin,
60-
TransactionIdIsRunning,
61-
GetGlobalTransactionId
62-
};
63-
64-
TransactionManager* TM = &DefaultTM;
65-
66-
TransactionManager* GetTransactionManager(void)
67-
{
68-
return TM;
69-
}
70-
7147
/*
7248
* Defines for CLOG page sizes. A page is the same BLCKSZ as is used
7349
* everywhere else in Postgres.
@@ -178,7 +154,7 @@ TransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
178154
* cache yet.
179155
*/
180156
void
181-
CLOGTransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
157+
PgTransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
182158
TransactionId *subxids, XidStatus status, XLogRecPtr lsn)
183159
{
184160
int pageno = TransactionIdToPage(xid); /* get page of parent */
@@ -428,7 +404,7 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
428404
}
429405

430406
XidStatus
431-
CLOGTransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
407+
PgTransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
432408
{
433409
int pageno = TransactionIdToPage(xid);
434410
int byteno = TransactionIdToByte(xid);

src/backend/access/transam/varsup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ GetNewTransactionId(bool isSubXact)
5151
* issue a warning about XID wrap.
5252
*/
5353
TransactionId
54-
GetNewLocalTransactionId(bool isSubXact)
54+
PgGetNewTransactionId(bool isSubXact)
5555
{
5656
TransactionId xid;
5757

src/backend/access/transam/xtm.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* xtm.c
4+
* PostgreSQL implementation of transaction manager protocol
5+
*
6+
* This module defines default iplementaiton of PostgreSQL transaction manager protocol
7+
*
8+
* Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
9+
* Portions Copyright (c) 1994, Regents of the University of California
10+
*
11+
* src/backend/access/transam/clog.c
12+
*
13+
*-------------------------------------------------------------------------
14+
*/
15+
16+
#include "postgres.h"
17+
18+
#include "access/transam.h"
19+
#include "access/xtm.h"
20+
21+
TransactionId PgGetGlobalTransactionId(void)
22+
{
23+
return InvalidTransactionId;
24+
}
25+
26+
TransactionManager PgTM = {
27+
PgTransactionIdGetStatus,
28+
PgTransactionIdSetTreeStatus,
29+
PgGetSnapshotData,
30+
PgGetNewTransactionId,
31+
PgGetOldestXmin,
32+
PgTransactionIdIsInProgress,
33+
PgGetGlobalTransactionId,
34+
PgXidInMVCCSnapshot
35+
};
36+
37+
TransactionManager* TM = &PgTM;
38+
39+
TransactionManager* GetTransactionManager(void)
40+
{
41+
return TM;
42+
}

src/backend/storage/ipc/procarray.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,7 @@ TransactionIdIsInProgress(TransactionId xid)
995995
* PGXACT again anyway; see GetNewTransactionId).
996996
*/
997997
bool
998-
TransactionIdIsRunning(TransactionId xid)
998+
PgTransactionIdIsInProgress(TransactionId xid)
999999
{
10001000
static TransactionId *xids = NULL;
10011001
int nxids = 0;
@@ -1311,7 +1311,7 @@ GetOldestXmin(Relation rel, bool ignoreVacuum)
13111311
* GetOldestXmin() move backwards, with no consequences for data integrity.
13121312
*/
13131313
TransactionId
1314-
GetOldestLocalXmin(Relation rel, bool ignoreVacuum)
1314+
PgGetOldestXmin(Relation rel, bool ignoreVacuum)
13151315
{
13161316
ProcArrayStruct *arrayP = procArray;
13171317
TransactionId result;
@@ -1515,7 +1515,7 @@ GetSnapshotData(Snapshot snapshot)
15151515
* not statically allocated (see xip allocation below).
15161516
*/
15171517
Snapshot
1518-
GetLocalSnapshotData(Snapshot snapshot)
1518+
PgGetSnapshotData(Snapshot snapshot)
15191519
{
15201520
ProcArrayStruct *arrayP = procArray;
15211521
TransactionId xmin;

src/backend/utils/time/tqual.c

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
#include "access/subtrans.h"
6767
#include "access/transam.h"
6868
#include "access/xact.h"
69+
#include "access/xtm.h"
6970
#include "access/xlog.h"
7071
#include "storage/bufmgr.h"
7172
#include "storage/procarray.h"
@@ -83,15 +84,6 @@ SnapshotData SnapshotToastData = {HeapTupleSatisfiesToast};
8384
/* local functions */
8485
static bool XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot);
8586

86-
TransactionVisibilityCallback VisibilityCallback;
87-
88-
TransactionVisibilityCallback RegisterTransactionVisibilityCallback(TransactionVisibilityCallback callback)
89-
{
90-
TransactionVisibilityCallback old = VisibilityCallback;
91-
VisibilityCallback = callback;
92-
return old;
93-
}
94-
9587
/*
9688
* SetHintBits()
9789
*
@@ -1485,15 +1477,6 @@ PgXidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
14851477
{
14861478
uint32 i;
14871479

1488-
if (VisibilityCallback)
1489-
{
1490-
VisibilityCheckResult result = (*VisibilityCallback)(xid);
1491-
if (result != XID_IN_DOUBT)
1492-
{
1493-
return result == XID_INVISIBLE;
1494-
}
1495-
}
1496-
14971480
/*
14981481
* Make a quick range check to eliminate most XIDs without looking at the
14991482
* xip arrays. Note that this is OK even if we convert a subxact XID to

src/include/access/clog.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ extern void TransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
3434
TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
3535
extern XidStatus TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn);
3636

37-
extern void CLOGTransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
38-
TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
39-
extern XidStatus CLOGTransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn);
40-
4137
extern Size CLOGShmemBuffers(void);
4238
extern Size CLOGShmemSize(void);
4339
extern void CLOGShmemInit(void);

src/include/access/transam.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ extern TransactionId TransactionIdLatest(TransactionId mainxid,
169169
extern XLogRecPtr TransactionIdGetCommitLSN(TransactionId xid);
170170

171171
/* in transam/varsup.c */
172-
extern TransactionId GetNewLocalTransactionId(bool isSubXact);
173172
extern TransactionId GetNewTransactionId(bool isSubXact);
174173
extern TransactionId ReadNewTransactionId(void);
175174
extern void SetTransactionIdLimit(TransactionId oldest_datfrozenxid,

src/include/access/xtm.h

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,32 @@ typedef struct
3737

3838
/* Get global transaction XID: returns XID of current transaction if it is global, InvalidTransactionId otherwise */
3939
TransactionId (*GetGlobalTransactionId)(void);
40-
} TransactionManager;
4140

41+
/* Is the given XID still-in-progress according to the snapshot (encapsulation of XidInMVCCSnapshot in tqual.c) */
42+
bool (*IsInSnapshot)(TransactionId xid, Snapshot snapshot);
43+
} TransactionManager;
4244

45+
/* Get pointer to transaction manager: actually returns content of TM variable */
4346
TransactionManager* GetTransactionManager(void);
4447

45-
extern TransactionManager* TM;
46-
extern TransactionManager DefaultTM;
48+
extern TransactionManager* TM; /* Current transaction manager (can be substituted by extensions) */
49+
extern TransactionManager PgTM; /* Standard PostgreSQL transaction manager */
50+
51+
/* Standard PostgreSQL function implementing TM interface */
52+
extern bool PgXidInMVCCSnapshot(TransactionId xid, Snapshot snapshot);
53+
54+
extern void PgTransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
55+
TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
56+
extern XidStatus PgTransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn);
57+
58+
extern Snapshot PgGetSnapshotData(Snapshot snapshot);
59+
60+
extern TransactionId PgGetOldestXmin(Relation rel, bool ignoreVacuum);
61+
62+
extern bool PgTransactionIdIsInProgress(TransactionId xid);
63+
64+
extern TransactionId PgGetGlobalTransactionId(void);
65+
66+
extern TransactionId PgGetNewTransactionId(bool isSubXact);
4767

4868
#endif

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