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

Commit5824947

Browse files
committed
Add create/restore/release savepoint context methods to XTM
1 parenteb90a7d commit5824947

File tree

4 files changed

+67
-6
lines changed

4 files changed

+67
-6
lines changed

‎contrib/mmts/multimaster.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,12 @@ static bool MtmDetectGlobalDeadLock(PGPROC* proc);
146146
staticvoidMtmAddSubtransactions(MtmTransState*ts,TransactionId*subxids,intnSubxids);
147147
staticcharconst*MtmGetName(void);
148148
staticsize_tMtmGetTransactionStateSize(void);
149-
staticvoidMtmSerializeTransactionState(void*ctx);
150-
staticvoidMtmDeserializeTransactionState(void*ctx);
151-
staticvoidMtmInitializeSequence(int64*start,int64*step);
149+
staticvoidMtmSerializeTransactionState(void*ctx);
150+
staticvoidMtmDeserializeTransactionState(void*ctx);
151+
staticvoidMtmInitializeSequence(int64*start,int64*step);
152+
staticvoid*MtmCreateSavepointContext(void);
153+
staticvoidMtmRestoreSavepointContext(void*ctx);
154+
staticvoidMtmReleaseSavepointContext(void*ctx);
152155

153156
staticvoidMtmCheckClusterLock(void);
154157
staticvoidMtmCheckSlots(void);
@@ -197,7 +200,10 @@ static TransactionManager MtmTM =
197200
MtmGetTransactionStateSize,
198201
MtmSerializeTransactionState,
199202
MtmDeserializeTransactionState,
200-
MtmInitializeSequence
203+
MtmInitializeSequence,
204+
MtmCreateSavepointContext,
205+
MtmRestoreSavepointContext,
206+
MtmReleaseSavepointContext
201207
};
202208

203209
charconst*constMtmNodeStatusMnem[]=
@@ -466,6 +472,20 @@ MtmInitializeSequence(int64* start, int64* step)
466472
}
467473
}
468474

475+
staticvoid*MtmCreateSavepointContext(void)
476+
{
477+
return (void*)(size_t)MtmTx.containsDML;
478+
}
479+
480+
staticvoidMtmRestoreSavepointContext(void*ctx)
481+
{
482+
MtmTx.containsDML=ctx!=NULL;
483+
}
484+
485+
staticvoidMtmReleaseSavepointContext(void*ctx)
486+
{
487+
}
488+
469489

470490
/*
471491
* -------------------------------------------

‎src/backend/access/transam/xact.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ typedef struct TransactionStateData
176176
SubTransactionIdsubTransactionId;/* my subxact ID */
177177
char*name;/* savepoint name, if any */
178178
intsavepointLevel;/* savepoint level */
179+
void*savepointContext;/* savepoint XTM context */
179180
TransStatestate;/* low-level state */
180181
TBlockStateblockState;/* high-level state */
181182
intnestingLevel;/* transaction nesting depth */
@@ -4095,6 +4096,7 @@ DefineSavepoint(char *name)
40954096
*/
40964097
if (name)
40974098
s->name=MemoryContextStrdup(TopTransactionContext,name);
4099+
s->savepointContext=TM->CreateSavepointContext();
40984100
break;
40994101

41004102
/* These cases are invalid. */
@@ -4227,6 +4229,7 @@ ReleaseSavepoint(List *options)
42274229
{
42284230
Assert(xact->blockState==TBLOCK_SUBINPROGRESS);
42294231
xact->blockState=TBLOCK_SUBRELEASE;
4232+
TM->ReleaseSavepointContext(xact->savepointContext);
42304233
if (xact==target)
42314234
break;
42324235
xact=xact->parent;
@@ -4346,9 +4349,11 @@ RollbackToSavepoint(List *options)
43464349
else
43474350
elog(FATAL,"RollbackToSavepoint: unexpected state %s",
43484351
BlockStateAsString(xact->blockState));
4352+
TM->ReleaseSavepointContext(xact->savepointContext);
43494353
xact=xact->parent;
43504354
Assert(PointerIsValid(xact));
43514355
}
4356+
TM->RestoreSavepointContext(xact->savepointContext);
43524357

43534358
/* And mark the target as "restart pending" */
43544359
if (xact->blockState==TBLOCK_SUBINPROGRESS)

‎src/backend/access/transam/xtm.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,27 @@ PgDeserializeTransactionState(void* ctx)
5252
{
5353
}
5454

55-
voidPgInitializeSequence(int64*init,int64*step)
55+
void
56+
PgInitializeSequence(int64*init,int64*step)
5657
{
5758
*init=1;
5859
*step=1;
5960
}
6061

6162

63+
void*PgCreateSavepointContext(void)
64+
{
65+
returnNULL;
66+
}
67+
68+
voidPgRestoreSavepointContext(void*ctx)
69+
{
70+
}
71+
72+
voidPgReleaseSavepointContext(void*ctx)
73+
{
74+
}
75+
6276
TransactionManagerPgTM= {
6377
PgTransactionIdGetStatus,
6478
PgTransactionIdSetTreeStatus,
@@ -73,7 +87,10 @@ TransactionManager PgTM = {
7387
PgGetTransactionStateSize,
7488
PgSerializeTransactionState,
7589
PgDeserializeTransactionState,
76-
PgInitializeSequence
90+
PgInitializeSequence,
91+
PgCreateSavepointContext,
92+
PgRestoreSavepointContext,
93+
PgReleaseSavepointContext
7794
};
7895

7996
TransactionManager*TM=&PgTM;

‎src/include/access/xtm.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,22 @@ typedef struct
9494
*/
9595
void (*InitializeSequence)(int64*start,int64*step);
9696

97+
/*
98+
* Create custom savepoint context.
99+
* This function can be used to accociate any data with savepoint which will be used by RestoreSavepointContext function to restore context
100+
*/
101+
void* (*CreateSavepointContext)(void);
102+
103+
/*
104+
* Restore context saved by CreateSavepointContext
105+
*/
106+
void (*RestoreSavepointContext)(void*ctx);
107+
108+
/*
109+
* Release context saved by CreateSavepointContext
110+
*/
111+
void (*ReleaseSavepointContext)(void*ctx);
112+
97113
}TransactionManager;
98114

99115
/* Get pointer to transaction manager: actually returns content of TM variable */
@@ -128,6 +144,9 @@ extern size_t PgGetTransactionStateSize(void);
128144
externvoidPgSerializeTransactionState(void*ctx);
129145
externvoidPgDeserializeTransactionState(void*ctx);
130146
externvoidPgInitializeSequence(int64*start,int64*step);
147+
externvoid*PgCreateSavepointContext(void);
148+
externvoidPgRestoreSavepointContext(void*);
149+
externvoidPgReleaseSavepointContext(void*);
131150

132151

133152
#endif

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp