Skip to content

Commit 02f6b20

Browse files
committed
Fixes #2: add GetTransactionStateSize, SerializeTransactionState and DeserializeTransactionState to XTM API
1 parent 296a57a commit 02f6b20

File tree

6 files changed

+109
-6
lines changed

6 files changed

+109
-6
lines changed

contrib/mmts/multimaster.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ static TransactionId MtmAdjustOldestXid(TransactionId xid);
131131
static bool MtmDetectGlobalDeadLock(PGPROC* proc);
132132
static void MtmAddSubtransactions(MtmTransState* ts, TransactionId* subxids, int nSubxids);
133133
static char const* MtmGetName(void);
134+
static size_t MtmGetTransactionStateSize(void);
135+
static void MtmSerializeTransactionState(void* ctx);
136+
static void MtmDeserializeTransactionState(void* ctx);
137+
134138
static void MtmCheckClusterLock(void);
135139
static void MtmCheckSlots(void);
136140
static void MtmAddSubtransactions(MtmTransState* ts, TransactionId *subxids, int nSubxids);
@@ -164,7 +168,10 @@ static TransactionManager MtmTM = {
164168
PgGetGlobalTransactionId,
165169
MtmXidInMVCCSnapshot,
166170
MtmDetectGlobalDeadLock,
167-
MtmGetName
171+
MtmGetName,
172+
MtmGetTransactionStateSize,
173+
MtmSerializeTransactionState,
174+
MtmDeserializeTransactionState
168175
};
169176

170177
char const* const MtmNodeStatusMnem[] =
@@ -323,6 +330,26 @@ static char const* MtmGetName(void)
323330
return MULTIMASTER_NAME;
324331
}
325332

333+
static size_t
334+
MtmGetTransactionStateSize(void)
335+
{
336+
return sizeof(MtmTx);
337+
}
338+
339+
static void
340+
MtmSerializeTransactionState(void* ctx)
341+
{
342+
memcpy(ctx, &MtmTx, sizeof(MtmTx));
343+
}
344+
345+
static void
346+
MtmDeserializeTransactionState(void* ctx)
347+
{
348+
memcpy(&MtmTx, ctx, sizeof(MtmTx));
349+
}
350+
351+
352+
326353
/*
327354
* -------------------------------------------
328355
* Visibility&snapshots

contrib/pg_dtm/pg_dtm.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,10 @@ static TransactionManager DtmTM = {
119119
DtmGetGlobalTransactionId,
120120
PgXidInMVCCSnapshot,
121121
DtmDetectGlobalDeadLock,
122-
DtmGetName
122+
DtmGetName,
123+
PgGetTransactionStateSize,
124+
PgSerializeTransactionState,
125+
PgDeserializeTransactionState
123126
};
124127

125128
static char *Arbiters;

contrib/pg_tsdtm/pg_tsdtm.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ static bool DtmDetectGlobalDeadLock(PGPROC *proc);
102102
static cid_t DtmGetCsn(TransactionId xid);
103103
static void DtmAddSubtransactions(DtmTransStatus * ts, TransactionId *subxids, int nSubxids);
104104
static char const *DtmGetName(void);
105+
static size_t DtmGetTransactionStateSize(void);
106+
static void DtmSerializeTransactionState(void* ctx);
107+
static void DtmDeserializeTransactionState(void* ctx);
108+
105109

106110
static TransactionManager DtmTM = {
107111
PgTransactionIdGetStatus,
@@ -113,7 +117,10 @@ static TransactionManager DtmTM = {
113117
PgGetGlobalTransactionId,
114118
DtmXidInMVCCSnapshot,
115119
DtmDetectGlobalDeadLock,
116-
DtmGetName
120+
DtmGetName,
121+
DtmGetTransactionStateSize,
122+
DtmSerializeTransactionState,
123+
DtmDeserializeTransactionState
117124
};
118125

119126
void _PG_init(void);
@@ -949,6 +956,25 @@ DtmDetectGlobalDeadLock(PGPROC *proc)
949956
return true;
950957
}
951958

959+
static size_t
960+
DtmGetTransactionStateSize(void)
961+
{
962+
return sizeof(dtm_tx);
963+
}
964+
965+
static void
966+
DtmSerializeTransactionState(void* ctx)
967+
{
968+
memcpy(ctx, &dtm_tx, sizeof(dtm_tx));
969+
}
970+
971+
static void
972+
DtmDeserializeTransactionState(void* ctx)
973+
{
974+
memcpy(&dtm_tx, ctx, sizeof(dtm_tx));
975+
}
976+
977+
952978
static cid_t
953979
DtmGetCsn(TransactionId xid)
954980
{

src/backend/access/transam/xact.c

Lines changed: 7 additions & 2 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"
@@ -4826,8 +4827,9 @@ EstimateTransactionStateSpace(void)
48264827
nxids = add_size(nxids, s->nChildXids);
48274828
}
48284829

4829-
nxids = add_size(nxids, nParallelCurrentXids);
4830-
return mul_size(nxids, sizeof(TransactionId));
4830+
nxids = add_size(nxids, nParallelCurrentXids);
4831+
nxids = mul_size(nxids, sizeof(TransactionId));
4832+
return add_size(nxids, TM->GetTransactionStateSize());
48314833
}
48324834

48334835
/*
@@ -4873,6 +4875,7 @@ SerializeTransactionState(Size maxsize, char *start_address)
48734875
Assert(maxsize >= (nParallelCurrentXids + c) * sizeof(TransactionId));
48744876
memcpy(&result[c], ParallelCurrentXids,
48754877
nParallelCurrentXids * sizeof(TransactionId));
4878+
TM->SerializeTransactionState(&result[c + nParallelCurrentXids]);
48764879
return;
48774880
}
48784881

@@ -4906,6 +4909,7 @@ SerializeTransactionState(Size maxsize, char *start_address)
49064909
/* Copy data into output area. */
49074910
result[c++] = (TransactionId) nxids;
49084911
memcpy(&result[c], workspace, nxids * sizeof(TransactionId));
4912+
TM->SerializeTransactionState(&result[c + nxids]);
49094913
}
49104914

49114915
/*
@@ -4928,6 +4932,7 @@ StartParallelWorkerTransaction(char *tstatespace)
49284932
currentCommandId = tstate[4];
49294933
nParallelCurrentXids = (int) tstate[5];
49304934
ParallelCurrentXids = &tstate[6];
4935+
TM->DeserializeTransactionState(&tstate[nParallelCurrentXids + 6]);
49314936

49324937
CurrentTransactionState->blockState = TBLOCK_PARALLEL_INPROGRESS;
49334938
}

src/backend/access/transam/xtm.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,23 @@ PgGetTransactionManagerName(void)
3636
return "postgres";
3737
}
3838

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+
3956
TransactionManager PgTM = {
4057
PgTransactionIdGetStatus,
4158
PgTransactionIdSetTreeStatus,
@@ -46,7 +63,10 @@ TransactionManager PgTM = {
4663
PgGetGlobalTransactionId,
4764
PgXidInMVCCSnapshot,
4865
PgDetectGlobalDeadLock,
49-
PgGetTransactionManagerName
66+
PgGetTransactionManagerName,
67+
PgGetTransactionStateSize,
68+
PgSerializeTransactionState,
69+
PgDeserializeTransactionState
5070
};
5171

5272
TransactionManager *TM = &PgTM;

src/include/access/xtm.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,23 @@ typedef struct
7171

7272
/* Get transaction manager name */
7373
char const *(*GetName) (void);
74+
75+
/*
76+
* Calculate transaction state size. This method is invoked by EstimateTransactionStateSpace to copy transaction
77+
* state to parallel workers
78+
*/
79+
size_t (*GetTransactionStateSize)(void);
80+
81+
/*
82+
* Serialize transaction state
83+
*/
84+
void (*SerializeTransactionState)(void* ctx);
85+
86+
/*
87+
* Deserialize transaction state
88+
*/
89+
void (*DeserializeTransactionState)(void* ctx);
90+
7491
} TransactionManager;
7592

7693
/* Get pointer to transaction manager: actually returns content of TM variable */
@@ -101,4 +118,9 @@ extern bool PgDetectGlobalDeadLock(PGPROC *proc);
101118

102119
extern char const *PgGetTransactionManagerName(void);
103120

121+
extern size_t PgGetTransactionStateSize(void);
122+
extern void PgSerializeTransactionState(void* ctx);
123+
extern void PgDeserializeTransactionState(void* ctx);
124+
125+
104126
#endif

0 commit comments

Comments
 (0)