@@ -103,6 +103,7 @@ static void MtmBeginTransaction(MtmCurrentTrans* x);
103
103
static void MtmPrecommitTransaction (MtmCurrentTrans * x );
104
104
static bool MtmCommitTransaction (TransactionId xid , int nsubxids , TransactionId * subxids );
105
105
static void MtmPrepareTransaction (MtmCurrentTrans * x );
106
+ static void MtmCommitPreparedTransaction (MtmCurrentTrans * x );
106
107
static void MtmEndTransaction (MtmCurrentTrans * x , bool commit );
107
108
static TransactionId MtmGetOldestXmin (Relation rel , bool ignoreVacuum );
108
109
static bool MtmXidInMVCCSnapshot (TransactionId xid , Snapshot snapshot );
@@ -494,6 +495,9 @@ MtmXactCallback(XactEvent event, void *arg)
494
495
case XACT_EVENT_PREPARE :
495
496
MtmPrepareTransaction (& dtmTx );
496
497
break ;
498
+ case XACT_EVENT_COMMIT_PREPARED :
499
+ MtmCommitPreparedTransaction (& dtmTx );
500
+ break ;
497
501
case XACT_EVENT_COMMIT :
498
502
MtmEndTransaction (& dtmTx , true);
499
503
break ;
@@ -652,10 +656,15 @@ static void MtmPrecommitTransaction(MtmCurrentTrans* x)
652
656
static void
653
657
MtmPrepareTransaction (MtmCurrentTrans * x )
654
658
{
655
- TransactionId * subxids ;
656
- int nSubxids ;
657
659
MtmPrecommitTransaction (x );
658
660
x -> isPrepared = true;
661
+ }
662
+
663
+ static void
664
+ MtmCommitPreparedTransaction (MtmCurrentTrans * x )
665
+ {
666
+ TransactionId * subxids ;
667
+ int nSubxids ;
659
668
nSubxids = xactGetCommittedChildren (& subxids );
660
669
if (!MtmCommitTransaction (x -> xid , nSubxids , subxids ))
661
670
{
@@ -1536,12 +1545,15 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
1536
1545
char * gid = MtmGenerateGid ();
1537
1546
if (!PrepareTransactionBlock (gid ))
1538
1547
{
1548
+ elog (WARNING , "Failed to prepare transaction %s" , gid );
1539
1549
/* report unsuccessful commit in completionTag */
1540
1550
if (completionTag ) {
1541
1551
strcpy (completionTag , "ROLLBACK" );
1542
1552
}
1543
1553
/* ??? Should we do explicit rollback */
1544
1554
} else {
1555
+ CommitTransactionCommand ();
1556
+ StartTransactionCommand ();
1545
1557
FinishPreparedTransaction (gid , true);
1546
1558
}
1547
1559
return ;
0 commit comments