@@ -103,6 +103,7 @@ static void MtmBeginTransaction(MtmCurrentTrans* x);
103103static void MtmPrecommitTransaction (MtmCurrentTrans * x );
104104static bool MtmCommitTransaction (TransactionId xid ,int nsubxids ,TransactionId * subxids );
105105static void MtmPrepareTransaction (MtmCurrentTrans * x );
106+ static void MtmCommitPreparedTransaction (MtmCurrentTrans * x );
106107static void MtmEndTransaction (MtmCurrentTrans * x ,bool commit );
107108static TransactionId MtmGetOldestXmin (Relation rel ,bool ignoreVacuum );
108109static bool MtmXidInMVCCSnapshot (TransactionId xid ,Snapshot snapshot );
@@ -494,6 +495,9 @@ MtmXactCallback(XactEvent event, void *arg)
494495case XACT_EVENT_PREPARE :
495496MtmPrepareTransaction (& dtmTx );
496497break ;
498+ case XACT_EVENT_COMMIT_PREPARED :
499+ MtmCommitPreparedTransaction (& dtmTx );
500+ break ;
497501case XACT_EVENT_COMMIT :
498502MtmEndTransaction (& dtmTx , true);
499503break ;
@@ -652,10 +656,15 @@ static void MtmPrecommitTransaction(MtmCurrentTrans* x)
652656static void
653657MtmPrepareTransaction (MtmCurrentTrans * x )
654658{
655- TransactionId * subxids ;
656- int nSubxids ;
657659MtmPrecommitTransaction (x );
658660x -> isPrepared = true;
661+ }
662+
663+ static void
664+ MtmCommitPreparedTransaction (MtmCurrentTrans * x )
665+ {
666+ TransactionId * subxids ;
667+ int nSubxids ;
659668nSubxids = xactGetCommittedChildren (& subxids );
660669if (!MtmCommitTransaction (x -> xid ,nSubxids ,subxids ))
661670{
@@ -1536,12 +1545,15 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
15361545char * gid = MtmGenerateGid ();
15371546if (!PrepareTransactionBlock (gid ))
15381547{
1548+ elog (WARNING ,"Failed to prepare transaction %s" ,gid );
15391549/* report unsuccessful commit in completionTag */
15401550if (completionTag ) {
15411551strcpy (completionTag ,"ROLLBACK" );
15421552}
15431553/* ??? Should we do explicit rollback */
15441554}else {
1555+ CommitTransactionCommand ();
1556+ StartTransactionCommand ();
15451557FinishPreparedTransaction (gid , true);
15461558}
15471559return ;