Skip to content

Commit ae47bde

Browse files
committed
Add IsInProgress method to XTM API
1 parent 54d4ee6 commit ae47bde

File tree

5 files changed

+21
-46
lines changed

5 files changed

+21
-46
lines changed

contrib/pg_xtm/pg_dtm.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ static void DtmSetTransactionStatus(TransactionId xid, int nsubxids, Transaction
4444
static XidStatus DtmGetGloabalTransStatus(TransactionId xid);
4545
static void DtmUpdateRecentXmin(void);
4646
static bool IsInDtmSnapshot(TransactionId xid);
47+
static bool DtmTransactionIsInProgress(TransactionId xid);
4748

4849
static NodeId DtmNodeId;
4950
static DTMConn DtmConn;
5051
static SnapshotData DtmSnapshot = {HeapTupleSatisfiesMVCC};
5152
static bool DtmHasSnapshot = false;
52-
static TransactionManager DtmTM = { DtmGetTransactionStatus, DtmSetTransactionStatus, DtmGetSnapshot };
53+
static TransactionManager DtmTM = { DtmGetTransactionStatus, DtmSetTransactionStatus, DtmGetSnapshot, DtmTransactionIsInProgress };
5354
static DTMConn DtmConn;
5455

5556
static void DtmEnsureConnection(void)
@@ -78,7 +79,7 @@ static void DtmUpdateRecentXmin(void)
7879
{
7980
TransactionId xmin = DtmSnapshot.xmin;
8081
if (xmin != InvalidTransactionId) {
81-
xmin -= vacuum_defer_cleanup_age;
82+
xmin -= vacuum_defer_cleanup_age;
8283
if (!TransactionIdIsNormal(xmin)) {
8384
xmin = FirstNormalTransactionId;
8485
}
@@ -107,17 +108,22 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
107108
static bool IsInDtmSnapshot(TransactionId xid)
108109
{
109110
return DtmHasSnapshot
110-
&& (xid > DtmSnapshot.xmax
111-
|| bsearch(&xid, DtmSnapshot.xip, DtmSnapshot.xcnt, sizeof(TransactionId), xidComparator) != NULL);
111+
&& (/*xid > DtmSnapshot.xmax
112+
|| */bsearch(&xid, DtmSnapshot.xip, DtmSnapshot.xcnt, sizeof(TransactionId), xidComparator) != NULL);
112113
}
113114

115+
static bool DtmTransactionIsInProgress(TransactionId xid)
116+
{
117+
return IsInDtmSnapshot(xid) || TransactionIdIsRunning(xid);
118+
}
114119

115120
static XidStatus DtmGetGloabalTransStatus(TransactionId xid)
116121
{
117122
unsigned delay = 1000;
118123
while (true) {
124+
XidStatus status;
119125
DtmEnsureConnection();
120-
XidStatus status = DtmGlobalGetTransStatus(DtmConn, DtmNodeId, xid);
126+
status = DtmGlobalGetTransStatus(DtmConn, DtmNodeId, xid);
121127
if (status == TRANSACTION_STATUS_IN_PROGRESS) {
122128
pg_usleep(delay);
123129
if (delay < 100000) {

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 };
47+
TransactionManager DefaultTM = { CLOGTransactionIdGetStatus, CLOGTransactionIdSetTreeStatus, GetLocalSnapshotData, TransactionIdIsRunning };
4848
TransactionManager* TM = &DefaultTM;
4949

5050
/*

src/backend/storage/ipc/procarray.c

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,12 @@ ProcArrayApplyXidAssignment(TransactionId topxid,
945945
LWLockRelease(ProcArrayLock);
946946
}
947947

948+
bool
949+
TransactionIdIsInProgress(TransactionId xid)
950+
{
951+
TM->IsInProgress(xid);
952+
}
953+
948954
/*
949955
* TransactionIdIsInProgress -- is given transaction running in some backend
950956
*
@@ -972,7 +978,7 @@ ProcArrayApplyXidAssignment(TransactionId topxid,
972978
* PGXACT again anyway; see GetNewTransactionId).
973979
*/
974980
bool
975-
TransactionIdIsInProgress(TransactionId xid)
981+
TransactionIdIsRunning(TransactionId xid)
976982
{
977983
static TransactionId *xids = NULL;
978984
int nxids = 0;
@@ -3867,42 +3873,3 @@ KnownAssignedXidsReset(void)
38673873
LWLockRelease(ProcArrayLock);
38683874
}
38693875

3870-
static bool TransactionIsStillInProgress(TransactionId xid, Snapshot snapshot)
3871-
{
3872-
return (xid > snapshot->xmax) || (bsearch(&xid, snapshot->xip, snapshot->xcnt, sizeof(TransactionId), xidComparator) != NULL);
3873-
}
3874-
3875-
3876-
void VacuumProcArray(Snapshot snapshot)
3877-
{
3878-
int i;
3879-
int nInProgress = 0;
3880-
int nCompleted = 0;
3881-
ProcArrayStruct *arrayP = procArray;
3882-
3883-
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
3884-
for (i = arrayP->numProcs; --i >= 0;)
3885-
{
3886-
int pgprocno = arrayP->pgprocnos[i];
3887-
PGXACT *pgxact = &allPgXact[pgprocno];
3888-
TransactionId pxid = pgxact->xid;
3889-
3890-
if (!TransactionIdIsValid(pxid)) {
3891-
continue;
3892-
}
3893-
if (TransactionIsStillInProgress(pxid, snapshot)) {
3894-
//elog(WARNING, "procArray[%d]=%d is in progress\n", i, pxid);
3895-
nInProgress += 1;
3896-
continue;
3897-
}
3898-
if (RemoveGXid(pxid)) {
3899-
nCompleted += 1;
3900-
memmove(&arrayP->pgprocnos[i], &arrayP->pgprocnos[i + 1],
3901-
(arrayP->numProcs - i - 1) * sizeof(int));
3902-
arrayP->pgprocnos[arrayP->numProcs - 1] = -1; /* for debugging */
3903-
arrayP->numProcs--;
3904-
}
3905-
}
3906-
LWLockRelease(ProcArrayLock);
3907-
elog(WARNING, "VacuumProcArray: %d in progress, %d completed, %d total\n", nInProgress, nCompleted, arrayP->numProcs);
3908-
}

src/include/access/xtm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ typedef struct
1919
XidStatus (*GetTransactionStatus)(TransactionId xid, XLogRecPtr *lsn);
2020
void (*SetTransactionStatus)(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
2121
Snapshot (*GetSnapshot)(Snapshot snapshot);
22+
bool (*IsInProgress)(TransactionId xid);
2223
} TransactionManager;
2324

2425
extern TransactionManager* TM;

src/include/storage/procarray.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ extern bool ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc);
5252

5353
extern RunningTransactions GetRunningTransactionData(void);
5454

55+
extern bool TransactionIdIsRunning(TransactionId xid);
5556
extern bool TransactionIdIsInProgress(TransactionId xid);
5657
extern bool TransactionIdIsActive(TransactionId xid);
5758
extern TransactionId GetOldestXmin(Relation rel, bool ignoreVacuum);

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