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

Commit592364c

Browse files
knizhnikkelvich
authored andcommitted
Add commit_command hook
1 parent84f81cb commit592364c

File tree

1 file changed

+31
-29
lines changed

1 file changed

+31
-29
lines changed

‎multimaster.c

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ static void MtmPrePrepareTransaction(MtmCurrentTrans* x);
111111
staticvoidMtmPostPrepareTransaction(MtmCurrentTrans*x);
112112
staticvoidMtmAbortPreparedTransaction(MtmCurrentTrans*x);
113113
staticvoidMtmEndTransaction(MtmCurrentTrans*x,boolcommit);
114+
staticboolMtmTwoPhaseCommit(MtmCurrentTrans*x);
114115
staticTransactionIdMtmGetOldestXmin(Relationrel,boolignoreVacuum);
115116
staticboolMtmXidInMVCCSnapshot(TransactionIdxid,Snapshotsnapshot);
116117
staticTransactionIdMtmAdjustOldestXid(TransactionIdxid);
@@ -588,6 +589,11 @@ MtmXactCallback(XactEvent event, void *arg)
588589
caseXACT_EVENT_ABORT:
589590
MtmEndTransaction(&MtmTx, false);
590591
break;
592+
caseXACT_EVENT_COMMIT_COMMAND:
593+
if (!IsTransactionBlock()) {
594+
MtmTwoPhaseCommit(&MtmTx);
595+
}
596+
break;
591597
default:
592598
break;
593599
}
@@ -1922,33 +1928,33 @@ MtmGenerateGid(char* gid)
19221928
sprintf(gid,"MTM-%d-%d-%d",MtmNodeId,MyProcPid,++localCount);
19231929
}
19241930

1925-
staticvoidMtmTwoPhaseCommit(char*completionTag)
1931+
staticboolMtmTwoPhaseCommit(MtmCurrentTrans*x)
19261932
{
1927-
MtmGenerateGid(MtmTx.gid);
1928-
if (!IsTransactionBlock()) {
1929-
elog(WARNING,"Start transaction block for %d",MtmTx.xid);
1930-
BeginTransactionBlock();
1931-
CommitTransactionCommand();
1932-
StartTransactionCommand();
1933-
}
1934-
if (!PrepareTransactionBlock(MtmTx.gid))
1935-
{
1936-
elog(WARNING,"Failed to prepare transaction %s",MtmTx.gid);
1937-
/* report unsuccessful commit in completionTag */
1938-
if (completionTag) {
1939-
strcpy(completionTag,"ROLLBACK");
1933+
if (x->isDistributed&&x->containsDML) {
1934+
MtmGenerateGid(x->gid);
1935+
if (!IsTransactionBlock()) {
1936+
elog(WARNING,"Start transaction block for %d",x->xid);
1937+
BeginTransactionBlock();
1938+
CommitTransactionCommand();
1939+
StartTransactionCommand();
19401940
}
1941-
/* ??? Should we do explicit rollback */
1942-
}else {
1943-
CommitTransactionCommand();
1944-
StartTransactionCommand();
1945-
if (MtmGetCurrentTransactionStatus()==TRANSACTION_STATUS_ABORTED) {
1946-
FinishPreparedTransaction(MtmTx.gid, false);
1947-
elog(ERROR,"Transaction %s is aborted by DTM",MtmTx.gid);
1948-
}else {
1949-
FinishPreparedTransaction(MtmTx.gid, true);
1941+
if (!PrepareTransactionBlock(x->gid))
1942+
{
1943+
elog(WARNING,"Failed to prepare transaction %s",x->gid);
1944+
/* ??? Should we do explicit rollback */
1945+
}else {
1946+
CommitTransactionCommand();
1947+
StartTransactionCommand();
1948+
if (MtmGetCurrentTransactionStatus()==TRANSACTION_STATUS_ABORTED) {
1949+
FinishPreparedTransaction(x->gid, false);
1950+
elog(ERROR,"Transaction %s is aborted by DTM",x->gid);
1951+
}else {
1952+
FinishPreparedTransaction(x->gid, true);
1953+
}
19501954
}
1955+
return true;
19511956
}
1957+
return false;
19521958
}
19531959

19541960
staticvoidMtmProcessUtility(Node*parsetree,constchar*queryString,
@@ -1965,8 +1971,7 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
19651971
switch (stmt->kind)
19661972
{
19671973
caseTRANS_STMT_COMMIT:
1968-
if (MtmTx.isDistributed&&MtmTx.containsDML) {
1969-
MtmTwoPhaseCommit(completionTag);
1974+
if (MtmTwoPhaseCommit(&MtmTx)) {
19701975
return;
19711976
}
19721977
break;
@@ -2002,9 +2007,6 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
20022007
if (MtmProcessDDLCommand(queryString)) {
20032008
return;
20042009
}
2005-
if (MtmTx.isDistributed&&MtmTx.containsDML&& !IsTransactionBlock()) {
2006-
MtmTwoPhaseCommit(completionTag);
2007-
}
20082010
}
20092011
if (PreviousProcessUtilityHook!=NULL)
20102012
{
@@ -2035,7 +2037,7 @@ MtmExecutorFinish(QueryDesc *queryDesc)
20352037
}
20362038
}
20372039
if (MtmTx.isDistributed&&MtmTx.containsDML&& !IsTransactionBlock()) {
2038-
MtmTwoPhaseCommit(NULL);
2040+
MtmTwoPhaseCommit(&MtmTx);
20392041
}
20402042
}
20412043
if (PreviousExecutorFinishHook!=NULL)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp