Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit02f6b20

Browse files
committed
Fixes#2: add GetTransactionStateSize, SerializeTransactionState and DeserializeTransactionState to XTM API
1 parent296a57a commit02f6b20

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
staticboolMtmDetectGlobalDeadLock(PGPROC*proc);
132132
staticvoidMtmAddSubtransactions(MtmTransState*ts,TransactionId*subxids,intnSubxids);
133133
staticcharconst*MtmGetName(void);
134+
staticsize_tMtmGetTransactionStateSize(void);
135+
staticvoidMtmSerializeTransactionState(void*ctx);
136+
staticvoidMtmDeserializeTransactionState(void*ctx);
137+
134138
staticvoidMtmCheckClusterLock(void);
135139
staticvoidMtmCheckSlots(void);
136140
staticvoidMtmAddSubtransactions(MtmTransState*ts,TransactionId*subxids,intnSubxids);
@@ -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
charconst*constMtmNodeStatusMnem[]=
@@ -323,6 +330,26 @@ static char const* MtmGetName(void)
323330
returnMULTIMASTER_NAME;
324331
}
325332

333+
staticsize_t
334+
MtmGetTransactionStateSize(void)
335+
{
336+
returnsizeof(MtmTx);
337+
}
338+
339+
staticvoid
340+
MtmSerializeTransactionState(void*ctx)
341+
{
342+
memcpy(ctx,&MtmTx,sizeof(MtmTx));
343+
}
344+
345+
staticvoid
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
staticchar*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
staticcid_tDtmGetCsn(TransactionIdxid);
103103
staticvoidDtmAddSubtransactions(DtmTransStatus*ts,TransactionId*subxids,intnSubxids);
104104
staticcharconst*DtmGetName(void);
105+
staticsize_tDtmGetTransactionStateSize(void);
106+
staticvoidDtmSerializeTransactionState(void*ctx);
107+
staticvoidDtmDeserializeTransactionState(void*ctx);
108+
105109

106110
staticTransactionManagerDtmTM= {
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+
staticsize_t
960+
DtmGetTransactionStateSize(void)
961+
{
962+
returnsizeof(dtm_tx);
963+
}
964+
965+
staticvoid
966+
DtmSerializeTransactionState(void*ctx)
967+
{
968+
memcpy(ctx,&dtm_tx,sizeof(dtm_tx));
969+
}
970+
971+
staticvoid
972+
DtmDeserializeTransactionState(void*ctx)
973+
{
974+
memcpy(&dtm_tx,ctx,sizeof(dtm_tx));
975+
}
976+
977+
952978
staticcid_t
953979
DtmGetCsn(TransactionIdxid)
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-
returnmul_size(nxids,sizeof(TransactionId));
4830+
nxids=add_size(nxids,nParallelCurrentXids);
4831+
nxids=mul_size(nxids,sizeof(TransactionId));
4832+
returnadd_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+
return0;
43+
}
44+
45+
void
46+
PgSerializeTransactionState(void*ctx)
47+
{
48+
}
49+
50+
void
51+
PgDeserializeTransactionState(void*ctx)
52+
{
53+
}
54+
55+
3956
TransactionManagerPgTM= {
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
charconst*(*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
externcharconst*PgGetTransactionManagerName(void);
103120

121+
externsize_tPgGetTransactionStateSize(void);
122+
externvoidPgSerializeTransactionState(void*ctx);
123+
externvoidPgDeserializeTransactionState(void*ctx);
124+
125+
104126
#endif

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp