Merge remote-tracking branch 'remotes/origin/ignite-3478' into ignite-5935
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishAndAckFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishAndAckFuture.java
index 36efe2f..140f57d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishAndAckFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishAndAckFuture.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.cache.distributed.near;
 
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.processors.cache.mvcc.MvccQueryTracker;
 import org.apache.ignite.internal.processors.cache.mvcc.TxMvccInfo;
@@ -41,6 +42,11 @@
     }
 
     /** {@inheritDoc} */
+    @Override public IgniteLogger logger() {
+        return finishFut.context().logger(GridNearTxFinishAndAckFuture.class);
+    }
+
+    /** {@inheritDoc} */
     @Override public boolean commit() {
         return finishFut.commit();
     }
@@ -52,6 +58,15 @@
 
             finishFut.listen(new IgniteInClosure<GridNearTxFinishFuture>() {
                 @Override public void apply(final GridNearTxFinishFuture fut) {
+                    try {
+                        fut.get();
+                    }
+                    catch (IgniteCheckedException e) {
+                        onDone(e);
+
+                        return;
+                    }
+
                     GridNearTxLocal tx = fut.tx();
 
                     IgniteInternalFuture<Void> ackFut = null;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java
index c88ca1c..31ca21d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java
@@ -147,6 +147,11 @@
         super(ctx);
     }
 
+    /** {@inheritDoc} */
+    @Override public void onKernalStop(boolean cancel) {
+        super.onKernalStop(cancel);
+    }
+
     /**
      * @param crdVer Mvcc coordinator version.
      * @param cntr Counter.
@@ -1342,6 +1347,7 @@
             return "CacheCoordinatorDiscoveryListener[]";
         }
     }
+
     /**
      *
      */
@@ -1396,6 +1402,7 @@
             return "CoordinatorMessageListener[]";
         }
     }
+
     /**
      *
      */
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java
index 6309523..e8fc281 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java
@@ -350,6 +350,59 @@
     }
 
     /**
+     * @throws Exception If failed.
+     */
+    public void testNearTxNodeFailureSimple() throws Exception {
+        testSpi = true;
+
+        final int SRVS = 3;
+
+        startGridsMultiThreaded(SRVS);
+
+        client = true;
+
+        Ignite client = startGrid(SRVS);
+
+        CacheConfiguration<Object, Object> ccfg = cacheConfiguration(PARTITIONED,
+            FULL_SYNC, 2, DFLT_PARTITION_COUNT);
+
+        final IgniteCache cache = client.createCache(ccfg);
+
+        TestRecordingCommunicationSpi spi = TestRecordingCommunicationSpi.spi(client);
+
+        spi.blockMessages(new IgniteBiPredicate<ClusterNode, Message>() {
+            @Override public boolean apply(ClusterNode node, Message msg) {
+                if (msg instanceof GridNearTxFinishRequest || msg instanceof CoordinatorAckRequestTx) {
+                    info("Block message [node=" + node.id() + ", msg=" + msg + ']');
+
+                    return true;
+                }
+
+                return false;
+            }
+        });
+
+        IgniteInternalFuture fut = GridTestUtils.runAsync(new Callable() {
+            @Override public Object call() throws Exception {
+                try {
+                    cache.put(primaryKey(jcache(1)), 1);
+                }
+                catch (Exception e) {
+                    info("Ignore error: " + e);
+                }
+
+                return null;
+            }
+        });
+
+        spi.waitForBlocked();
+
+        stopGrid(SRVS);
+
+        fut.get();
+    }
+
+    /**
      * @param tx If {@code true} tests reads inside transaction.
      * @throws Exception If failed.
      */