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