Skip to content

Commit b4da6f1

Browse files
committed
port xtm to 11-current
1 parent 3f80895 commit b4da6f1

File tree

15 files changed

+336
-26
lines changed

15 files changed

+336
-26
lines changed

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 generic_xlog.o multixact.o parallel.o rmgr.o slru.o \
1616
subtrans.o 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: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "access/xlog.h"
3939
#include "access/xloginsert.h"
4040
#include "access/xlogutils.h"
41+
#include "access/xtm.h"
4142
#include "miscadmin.h"
4243
#include "pg_trace.h"
4344

@@ -79,6 +80,12 @@ static SlruCtlData ClogCtlData;
7980

8081
#define ClogCtl (&ClogCtlData)
8182

83+
void
84+
TransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
85+
TransactionId *subxids, XidStatus status, XLogRecPtr lsn)
86+
{
87+
return TM->SetTransactionStatus(xid, nsubxids, subxids, status, lsn);
88+
}
8289

8390
static int ZeroCLOGPage(int pageno, bool writeXlog);
8491
static bool CLOGPagePrecedes(int page1, int page2);
@@ -146,7 +153,7 @@ static void set_status_by_pages(int nsubxids, TransactionId *subxids,
146153
* cache yet.
147154
*/
148155
void
149-
TransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
156+
PgTransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
150157
TransactionId *subxids, XidStatus status, XLogRecPtr lsn)
151158
{
152159
int pageno = TransactionIdToPage(xid); /* get page of parent */
@@ -352,10 +359,10 @@ TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, i
352359
* Current state change should be from 0 or subcommitted to target state
353360
* or we should already be there when replaying changes during recovery.
354361
*/
355-
Assert(curval == 0 ||
356-
(curval == TRANSACTION_STATUS_SUB_COMMITTED &&
357-
status != TRANSACTION_STATUS_IN_PROGRESS) ||
358-
curval == status);
362+
/* Assert(curval == 0 || */
363+
/* (curval == TRANSACTION_STATUS_SUB_COMMITTED && */
364+
/* status != TRANSACTION_STATUS_IN_PROGRESS) || */
365+
/* curval == status); */
359366

360367
/* note this assumes exclusive access to the clog page */
361368
byteval = *byteptr;
@@ -397,6 +404,12 @@ TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, i
397404
*/
398405
XidStatus
399406
TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
407+
{
408+
return TM->GetTransactionStatus(xid, lsn);
409+
}
410+
411+
XidStatus
412+
PgTransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
400413
{
401414
int pageno = TransactionIdToPage(xid);
402415
int byteno = TransactionIdToByte(xid);

src/backend/access/transam/subtrans.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ SubTransGetParent(TransactionId xid)
115115
TransactionId parent;
116116

117117
/* Can't ask about stuff that might not be around anymore */
118-
Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin));
118+
//Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin));
119119

120120
/* Bootstrap and frozen XIDs have no parent */
121121
if (!TransactionIdIsNormal(xid))
@@ -153,7 +153,10 @@ SubTransGetTopmostTransaction(TransactionId xid)
153153
previousXid = xid;
154154

155155
/* Can't ask about stuff that might not be around anymore */
156-
Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin));
156+
if (!TransactionIdFollowsOrEquals(xid, TransactionXmin))
157+
{
158+
return xid;
159+
}
157160

158161
while (TransactionIdIsValid(parentXid))
159162
{

src/backend/access/transam/varsup.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "access/transam.h"
2020
#include "access/xact.h"
2121
#include "access/xlog.h"
22+
#include "access/xtm.h"
2223
#include "commands/dbcommands.h"
2324
#include "miscadmin.h"
2425
#include "postmaster/autovacuum.h"
@@ -33,6 +34,11 @@
3334
/* pointer to "variable cache" in shared memory (set up by shmem.c) */
3435
VariableCache ShmemVariableCache = NULL;
3536

37+
TransactionId
38+
GetNewTransactionId(bool isSubXact)
39+
{
40+
return TM->GetNewTransactionId(isSubXact);
41+
}
3642

3743
/*
3844
* Allocate the next XID for a new transaction or subtransaction.
@@ -45,7 +51,7 @@ VariableCache ShmemVariableCache = NULL;
4551
* issue a warning about XID wrap.
4652
*/
4753
TransactionId
48-
GetNewTransactionId(bool isSubXact)
54+
PgGetNewTransactionId(bool isSubXact)
4955
{
5056
TransactionId xid;
5157

src/backend/access/transam/xact.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "access/transam.h"
2828
#include "access/twophase.h"
2929
#include "access/xact.h"
30+
#include "access/xtm.h"
3031
#include "access/xlog.h"
3132
#include "access/xloginsert.h"
3233
#include "access/xlogutils.h"
@@ -4897,6 +4898,7 @@ SerializeTransactionState(Size maxsize, char *start_address)
48974898
Assert(maxsize >= (nParallelCurrentXids + c) * sizeof(TransactionId));
48984899
memcpy(&result[c], ParallelCurrentXids,
48994900
nParallelCurrentXids * sizeof(TransactionId));
4901+
TM->SerializeTransactionState(&result[c + nParallelCurrentXids]);
49004902
return;
49014903
}
49024904

@@ -4930,6 +4932,7 @@ SerializeTransactionState(Size maxsize, char *start_address)
49304932
/* Copy data into output area. */
49314933
result[c++] = (TransactionId) nxids;
49324934
memcpy(&result[c], workspace, nxids * sizeof(TransactionId));
4935+
TM->SerializeTransactionState(&result[c + nxids]);
49334936
}
49344937

49354938
/*
@@ -4952,6 +4955,7 @@ StartParallelWorkerTransaction(char *tstatespace)
49524955
currentCommandId = tstate[4];
49534956
nParallelCurrentXids = (int) tstate[5];
49544957
ParallelCurrentXids = &tstate[6];
4958+
TM->DeserializeTransactionState(&tstate[nParallelCurrentXids + 6]);
49554959

49564960
CurrentTransactionState->blockState = TBLOCK_PARALLEL_INPROGRESS;
49574961
}

src/backend/access/transam/xtm.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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/xtm.c
12+
*
13+
*-------------------------------------------------------------------------
14+
*/
15+
16+
#include "postgres.h"
17+
18+
#include "access/transam.h"
19+
#include "access/xtm.h"
20+
21+
TransactionId
22+
PgGetGlobalTransactionId(void)
23+
{
24+
return InvalidTransactionId;
25+
}
26+
27+
bool
28+
PgDetectGlobalDeadLock(PGPROC *proc)
29+
{
30+
return false;
31+
}
32+
33+
char const *
34+
PgGetTransactionManagerName(void)
35+
{
36+
return "postgres";
37+
}
38+
39+
size_t
40+
PgGetTransactionStateSize(void)
41+
{
42+
return 0;
43+
}
44+
45+
void
46+
PgSerializeTransactionState(void* ctx)
47+
{
48+
}
49+
50+
void
51+
PgDeserializeTransactionState(void* ctx)
52+
{
53+
}
54+
55+
void PgInitializeSequence(int64* init, int64* step)
56+
{
57+
*init = 1;
58+
*step = 1;
59+
}
60+
61+
62+
TransactionManager PgTM = {
63+
PgTransactionIdGetStatus,
64+
PgTransactionIdSetTreeStatus,
65+
PgGetSnapshotData,
66+
PgGetNewTransactionId,
67+
PgGetOldestXmin,
68+
PgTransactionIdIsInProgress,
69+
PgGetGlobalTransactionId,
70+
PgXidInMVCCSnapshot,
71+
PgDetectGlobalDeadLock,
72+
PgGetTransactionManagerName,
73+
PgGetTransactionStateSize,
74+
PgSerializeTransactionState,
75+
PgDeserializeTransactionState,
76+
PgInitializeSequence
77+
};
78+
79+
TransactionManager *TM = &PgTM;
80+
81+
TransactionManager *
82+
GetTransactionManager(void)
83+
{
84+
return TM;
85+
}

src/backend/storage/ipc/procarray.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include "access/twophase.h"
5252
#include "access/xact.h"
5353
#include "access/xlog.h"
54+
#include "access/xtm.h"
5455
#include "catalog/catalog.h"
5556
#include "miscadmin.h"
5657
#include "pgstat.h"
@@ -969,6 +970,12 @@ ProcArrayApplyXidAssignment(TransactionId topxid,
969970
LWLockRelease(ProcArrayLock);
970971
}
971972

973+
bool
974+
TransactionIdIsInProgress(TransactionId xid)
975+
{
976+
return TM->IsInProgress(xid);
977+
}
978+
972979
/*
973980
* TransactionIdIsInProgress -- is given transaction running in some backend
974981
*
@@ -996,7 +1003,7 @@ ProcArrayApplyXidAssignment(TransactionId topxid,
9961003
* PGXACT again anyway; see GetNewTransactionId).
9971004
*/
9981005
bool
999-
TransactionIdIsInProgress(TransactionId xid)
1006+
PgTransactionIdIsInProgress(TransactionId xid)
10001007
{
10011008
static TransactionId *xids = NULL;
10021009
int nxids = 0;
@@ -1256,6 +1263,11 @@ TransactionIdIsActive(TransactionId xid)
12561263
return result;
12571264
}
12581265

1266+
TransactionId
1267+
GetOldestXmin(Relation rel, int flags)
1268+
{
1269+
return TM->GetOldestXmin(rel, flags);
1270+
}
12591271

12601272
/*
12611273
* GetOldestXmin -- returns oldest transaction that was running
@@ -1312,7 +1324,7 @@ TransactionIdIsActive(TransactionId xid)
13121324
* GetOldestXmin() move backwards, with no consequences for data integrity.
13131325
*/
13141326
TransactionId
1315-
GetOldestXmin(Relation rel, int flags)
1327+
PgGetOldestXmin(Relation rel, int flags)
13161328
{
13171329
ProcArrayStruct *arrayP = procArray;
13181330
TransactionId result;
@@ -1469,6 +1481,12 @@ GetMaxSnapshotSubxidCount(void)
14691481
return TOTAL_MAX_CACHED_SUBXIDS;
14701482
}
14711483

1484+
Snapshot
1485+
GetSnapshotData(Snapshot snapshot)
1486+
{
1487+
return TM->GetSnapshot(snapshot);
1488+
}
1489+
14721490
/*
14731491
* GetSnapshotData -- returns information about running transactions.
14741492
*
@@ -1506,7 +1524,7 @@ GetMaxSnapshotSubxidCount(void)
15061524
* not statically allocated (see xip allocation below).
15071525
*/
15081526
Snapshot
1509-
GetSnapshotData(Snapshot snapshot)
1527+
PgGetSnapshotData(Snapshot snapshot)
15101528
{
15111529
ProcArrayStruct *arrayP = procArray;
15121530
TransactionId xmin;

src/backend/storage/lmgr/deadlock.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "pgstat.h"
3131
#include "storage/lmgr.h"
3232
#include "storage/proc.h"
33+
#include "access/xtm.h"
3334
#include "utils/memutils.h"
3435

3536

@@ -281,7 +282,7 @@ DeadLockCheck(PGPROC *proc)
281282
else if (blocking_autovacuum_proc != NULL)
282283
return DS_BLOCKED_BY_AUTOVACUUM;
283284
else
284-
return DS_NO_DEADLOCK;
285+
return TM->DetectGlobalDeadLock(proc) ? DS_DISTRIBUTED_DEADLOCK : DS_NO_DEADLOCK;
285286
}
286287

287288
/*

src/backend/storage/lmgr/lock.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3849,6 +3849,20 @@ GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
38493849
return LockMethods[lockmethodid]->lockModeNames[mode];
38503850
}
38513851

3852+
void
3853+
EnumerateLocks(LockIterator iterator, void* arg)
3854+
{
3855+
PROCLOCK *proclock;
3856+
HASH_SEQ_STATUS status;
3857+
3858+
hash_seq_init(&status, LockMethodProcLockHash);
3859+
3860+
while ((proclock = (PROCLOCK *) hash_seq_search(&status)) != NULL)
3861+
{
3862+
iterator(proclock, arg);
3863+
}
3864+
}
3865+
38523866
#ifdef LOCK_DEBUG
38533867
/*
38543868
* Dump all locks in the given proc's myProcLocks lists.

src/backend/storage/lmgr/predicate.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4011,7 +4011,7 @@ CheckForSerializableConflictOut(bool visible, Relation relation,
40114011
xid = InvalidTransactionId;
40124012
}
40134013
Assert(TransactionIdIsValid(xid));
4014-
Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin));
4014+
//Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin));
40154015

40164016
/*
40174017
* Find top level xid. Bail out if xid is too early to be a conflict, or

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