Index: incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java (date 1444954695000) +++ incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java (revision ) @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicReference; import javax.cache.expiry.ExpiryPolicy; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; @@ -71,6 +72,7 @@ import org.jsr166.ConcurrentHashMap8; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.PRIMARY_SYNC; import static org.apache.ignite.transactions.TransactionState.COMMITTED; import static org.apache.ignite.transactions.TransactionState.COMMITTING; import static org.apache.ignite.transactions.TransactionState.PREPARING; @@ -284,7 +286,9 @@ return true; for (int cacheId : activeCacheIds()) { - if (cctx.cacheContext(cacheId).config().getWriteSynchronizationMode() == FULL_SYNC) + CacheWriteSynchronizationMode mode = cctx.cacheContext(cacheId).config().getWriteSynchronizationMode(); + + if (mode == FULL_SYNC || mode == PRIMARY_SYNC) return true; } Index: incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java (date 1444954695000) +++ incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java (revision ) @@ -276,13 +276,6 @@ } /** - * @return {@code True} if commit is synchronous. - */ - private boolean syncCommit() { - return tx != null && tx.syncCommit(); - } - - /** * @return {@code True} if rollback is synchronous. */ private boolean syncRollback() { Index: incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java (date 1444954695000) +++ incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java (revision ) @@ -413,7 +413,7 @@ req.last(), req.lastBackups()); - if (tx.isRollbackOnly()) { + if (tx.isRollbackOnly() && !tx.commitOnPrepare()) { try { tx.rollback(); } @@ -714,6 +714,10 @@ } } catch (Throwable e) { + tx.commitError(e); + + tx.systemInvalidate(true); + U.error(log, "Failed completing transaction [commit=" + req.commit() + ", tx=" + tx + ']', e); IgniteInternalFuture res = null; \ No newline at end of file Index: incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java (date 1444954695000) +++ incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java (revision ) @@ -57,6 +57,7 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.dr.GridDrType; +import org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException; import org.apache.ignite.internal.util.F0; import org.apache.ignite.internal.util.GridConcurrentHashSet; import org.apache.ignite.internal.util.GridLeanSet; @@ -575,10 +576,7 @@ if (tx.commitOnPrepare()) { if (tx.markFinalizing(IgniteInternalTx.FinalizationStatus.USER_FINISH)) { - IgniteInternalFuture fut = this.err.get() == null ? - tx.commitAsync() : tx.rollbackAsync(); - - fut.listen(new CIX1>() { + CIX1> responseClo = new CIX1>() { @Override public void applyx(IgniteInternalFuture fut) { try { if (replied.compareAndSet(false, true)) @@ -588,7 +586,33 @@ U.error(log, "Failed to send prepare response for transaction: " + tx, e); } } - }); + }; + + IgniteInternalFuture fut; + + if (this.err.get() == null) { + try { + fut = tx.commitAsync(); + } + catch (RuntimeException | Error e) { + Exception hEx = new IgniteTxHeuristicCheckedException("Commit produced a runtime " + + "exception: " + CU.txString(tx), e); + + res.error(hEx); + + tx.systemInvalidate(true); + + fut = tx.rollbackAsync(); + + fut.listen(responseClo); + + throw e; + } + } + else + fut = tx.rollbackAsync(); + + fut.listen(responseClo); } } else { Index: incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocalAdapter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocalAdapter.java (date 1444954695000) +++ incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocalAdapter.java (revision ) @@ -889,7 +889,7 @@ /** * @return {@code True} if transaction is finished on prepare step. */ - protected final boolean commitOnPrepare() { + public final boolean commitOnPrepare() { return onePhaseCommit() && !near() && !nearOnOriginatingNode; } Index: incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java (date 1444954695000) +++ incubator-ignite/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java (revision ) @@ -19,7 +19,6 @@ import java.util.Collection; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; import org.apache.ignite.IgniteCheckedException; @@ -222,6 +221,9 @@ this.tx.tmFinish(err == null); Throwable e = this.err.get(); + + if (e == null) + e = this.tx.commitError(); if (super.onDone(tx, e != null ? e : err)) { // Always send finish reply.