You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dg...@apache.org on 2019/06/19 08:49:07 UTC

[ignite] branch master updated: IGNITE-11934 Bugs & tests fixes - Fixes #6619

This is an automated email from the ASF dual-hosted git repository.

dgovorukhin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 48a38de  IGNITE-11934 Bugs & tests fixes - Fixes #6619
48a38de is described below

commit 48a38dedb8b21ae34611a1a1f38474f305ba8a1e
Author: Dmitriy Govorukhin <dm...@gmail.com>
AuthorDate: Wed Jun 19 11:48:23 2019 +0300

    IGNITE-11934 Bugs & tests fixes - Fixes #6619
    
    Co-authored-by: Vladislav Pyatkov <vl...@gmail.com>
    Co-authored-by: Ivan Bessonov <be...@gmail.com>
    Co-authored-by: Anton Kalashnikov <ka...@yandex.ru>
    Co-authored-by: Dmitriy Govorukhin <dm...@gmail.com>
    Co-authored-by: Igor Seliverstov <gv...@gmail.com>
---
 modules/compress/pom.xml                           |   7 +
 modules/core/pom.xml                               |   2 +-
 .../apache/ignite/internal/IgniteVersionUtils.java |  15 +-
 .../commandline/diagnostic/DiagnosticCommand.java  |  19 +-
 .../commandline/diagnostic/PageLocksCommand.java   | 219 ++++++++++++---------
 .../atomic/GridNearAtomicAbstractUpdateFuture.java |   6 +
 .../pagelocktracker/PageLockTrackerManager.java    |  11 +-
 .../wal/filehandle/FileHandleManagerImpl.java      |   4 +
 .../processors/diagnostic/DiagnosticProcessor.java |   2 +-
 .../internal/visor/diagnostic/Operation.java       |  28 +++
 .../visor/diagnostic/VisorPageLocksResult.java     |  22 +--
 .../visor/diagnostic/VisorPageLocksTask.java       |  33 ++--
 .../diagnostic/VisorPageLocksTrackerArgs.java      |  93 ++-------
 .../apache/ignite/lang/IgniteProductVersion.java   |   2 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java       |  83 +++++---
 .../messages/TcpDiscoveryAuthFailedMessage.java    |  14 +-
 ...ClientConnectAfterCommunicationFailureTest.java |  41 +---
 .../FailBackupOnAtomicOperationTest.java           | 165 ++++++++++++++++
 .../db/checkpoint/CheckpointFreeListTest.java      |  12 +-
 .../pagelocktracker/AbstractPageLockTest.java      |   2 +
 .../pagelocktracker/SharedPageLockTrackerTest.java |  46 +++--
 .../pagelocktracker/log/PageLockLogTest.java       |  84 +-------
 .../pagelocktracker/stack/PageLockStackTest.java   |   3 +-
 .../wal/reader/FilteredWalIteratorTest.java        |   3 +-
 .../persistence/wal/scanner/WalScannerTest.java    |  54 +++--
 .../tcp/TcpCommunicationSpiFreezingClientTest.java |   4 +
 .../ignite/testsuites/IgniteCacheTestSuite9.java   |   3 +
 .../ignite/testsuites/IgnitePdsMvccTestSuite4.java |  16 ++
 .../apache/ignite/util/GridCommandHandlerTest.java | 149 ++++++++++++--
 29 files changed, 727 insertions(+), 415 deletions(-)

diff --git a/modules/compress/pom.xml b/modules/compress/pom.xml
index a87269f..efcf18f 100644
--- a/modules/compress/pom.xml
+++ b/modules/compress/pom.xml
@@ -108,6 +108,13 @@
             <version>1.4.8</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index 3642eb4..ca0d4b5 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -126,7 +126,7 @@
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
-            <version>1.9.5</version>
+            <version>${mockito.version}</version>
             <scope>test</scope>
         </dependency>
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
index 9fe0043..cd17078 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
@@ -33,7 +33,7 @@ public class IgniteVersionUtils {
     public static final IgniteProductVersion VER;
 
     /** UTC build date formatter. */
-    public static final SimpleDateFormat BUILD_TSTAMP_DATE_FORMATTER;
+    private static final SimpleDateFormat BUILD_TSTAMP_DATE_FORMATTER;
 
     /** Formatted build date. */
     public static final String BUILD_TSTAMP_STR;
@@ -75,7 +75,7 @@ public class IgniteVersionUtils {
 
         BUILD_TSTAMP_DATE_FORMATTER.setTimeZone(TimeZone.getTimeZone("UTC"));
 
-        BUILD_TSTAMP_STR = BUILD_TSTAMP_DATE_FORMATTER.format(new Date(BUILD_TSTAMP * 1000));
+        BUILD_TSTAMP_STR = formatBuildTimeStamp(BUILD_TSTAMP * 1000);
 
         COPYRIGHT = BUILD_TSTAMP_STR.substring(0, 4) + " Copyright(C) Apache Software Foundation";
 
@@ -91,6 +91,17 @@ public class IgniteVersionUtils {
     }
 
     /**
+     * Builds string date representation in "yyyyMMdd" format.
+     * "synchronized" because it uses {@link SimpleDateFormat} which is not threadsafe.
+     *
+     * @param ts Timestamp.
+     * @return Timestamp date in UTC timezone.
+     */
+    public static synchronized String formatBuildTimeStamp(long ts) {
+        return BUILD_TSTAMP_DATE_FORMATTER.format(new Date(ts));
+    }
+
+    /**
      * Private constructor.
      */
     private IgniteVersionUtils() {
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java
index c985c20..4d4ba89 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.commandline.diagnostic;
 
+import java.util.Arrays;
 import org.apache.ignite.internal.client.GridClientConfiguration;
 import org.apache.ignite.internal.commandline.Command;
 import org.apache.ignite.internal.commandline.CommandArgIterator;
@@ -32,9 +33,7 @@ import static org.apache.ignite.internal.commandline.diagnostic.DiagnosticSubCom
  *
  */
 public class DiagnosticCommand implements Command<DiagnosticSubCommand> {
-    /**
-     *
-     */
+    /** */
     private DiagnosticSubCommand subcommand;
 
     /**
@@ -107,9 +106,19 @@ public class DiagnosticCommand implements Command<DiagnosticSubCommand> {
     }
 
     /**
-     *
+     * Print diagnostic command help.
      */
     private void printDiagnosticHelp() {
-        logger.log(join(" ", UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS + " - dump page locks info."));
+        logger.logWithIndent(join(" ", UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS + " - dump page locks info."));
+
+        logger.nl();
+
+        logger.logWithIndent("Subcommands:");
+
+        Arrays.stream(DiagnosticSubCommand.values()).forEach(c -> {
+            if (c.subcommand() != null) c.subcommand().printUsage(logger);
+        });
+
+        logger.nl();
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java
index c89c8c2..5c32d76 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java
@@ -18,9 +18,10 @@
 package org.apache.ignite.internal.commandline.diagnostic;
 
 import java.io.File;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeSet;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.client.GridClient;
 import org.apache.ignite.internal.client.GridClientConfiguration;
@@ -28,71 +29,56 @@ import org.apache.ignite.internal.commandline.Command;
 import org.apache.ignite.internal.commandline.CommandArgIterator;
 import org.apache.ignite.internal.commandline.CommandLogger;
 import org.apache.ignite.internal.commandline.TaskExecutor;
+import org.apache.ignite.internal.commandline.argument.CommandArg;
+import org.apache.ignite.internal.commandline.argument.CommandArgUtils;
+import org.apache.ignite.internal.visor.diagnostic.Operation;
 import org.apache.ignite.internal.visor.diagnostic.VisorPageLocksResult;
 import org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTask;
 import org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTrackerArgs;
 
 import static org.apache.ignite.internal.commandline.CommandHandler.UTILITY_NAME;
 import static org.apache.ignite.internal.commandline.CommandList.DIAGNOSTIC;
+import static org.apache.ignite.internal.commandline.CommandLogger.join;
+import static org.apache.ignite.internal.commandline.CommandLogger.optional;
 import static org.apache.ignite.internal.commandline.diagnostic.DiagnosticSubCommand.PAGE_LOCKS;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.ALL;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.DUMP;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.DUMP_LOG;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.NODES;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.PATH;
+import static org.apache.ignite.internal.processors.diagnostic.DiagnosticProcessor.DEFAULT_TARGET_FOLDER;
 
 /**
  *
  */
-public class PageLocksCommand implements Command<PageLocksCommand.Args> {
-    /**
-     *
-     */
-    public static final String DUMP = "dump";
-
-    /**
-     *
-     */
-    public static final String DUMP_LOG = "dump_log";
-
-    /**
-     *
-     */
-    private Args args;
+public class PageLocksCommand implements Command<PageLocksCommand.Arguments> {
+    /** */
+    private Arguments arguments;
 
     /**
      *
      */
     private CommandLogger logger;
 
-    /**
-     *
-     */
-    private boolean help;
 
     /** {@inheritDoc} */
     @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception {
         this.logger = logger;
 
-        if (help) {
-            help = false;
-
-            printUsage(logger);
+        Set<String> nodeIds = arguments.nodeIds;
 
-            return null;
-        }
-
-        Set<String> nodeIds = args.nodeIds;
+        Map<ClusterNode, VisorPageLocksResult> res;
 
         try (GridClient client = Command.startClient(clientCfg)) {
-            if (args.allNodes) {
+            if (arguments.allNodes) {
                 client.compute().nodes().forEach(n -> {
                     nodeIds.add(String.valueOf(n.consistentId()));
                     nodeIds.add(n.nodeId().toString());
                 });
             }
-        }
 
-        VisorPageLocksTrackerArgs taskArg = new VisorPageLocksTrackerArgs(args.op, args.type, args.filePath, nodeIds);
+            VisorPageLocksTrackerArgs taskArg = new VisorPageLocksTrackerArgs(arguments.op, arguments.filePath, nodeIds);
 
-        Map<ClusterNode, VisorPageLocksResult> res;
-
-        try (GridClient client = Command.startClient(clientCfg)) {
             res = TaskExecutor.executeTask(
                 client,
                 VisorPageLocksTask.class,
@@ -107,56 +93,73 @@ public class PageLocksCommand implements Command<PageLocksCommand.Args> {
     }
 
     /** {@inheritDoc} */
-    @Override public Args arg() {
-        return args;
+    @Override public Arguments arg() {
+        return arguments;
     }
 
     /** {@inheritDoc} */
     @Override public void parseArguments(CommandArgIterator argIter) {
-        if (argIter.hasNextSubArg()) {
-            String cmd = argIter.nextArg("").toLowerCase();
-
-            if (DUMP.equals(cmd) || DUMP_LOG.equals(cmd)) {
-                boolean allNodes = false;
-                String filePath = null;
-
-                Set<String> nodeIds = new TreeSet<>();
-
-                while (argIter.hasNextArg()){
-                    String nextArg = argIter.nextArg("").toLowerCase();
-
-                    if ("--all".equals(nextArg))
-                        allNodes = true;
-                    else if ("--nodes".equals(nextArg)) {
-                        while (argIter.hasNextArg()){
-                            nextArg = argIter.nextArg("").toLowerCase();
-
-                            nodeIds.add(nextArg);
-                        }
-                    }
-                    else {
-                        if (new File(nextArg).isDirectory())
-                            filePath = nextArg;
-                    }
-                }
-
-                args = new Args(DUMP, cmd, filePath, allNodes, nodeIds);
+        Operation op = Operation.DUMP_LOG;
+
+        String path = null;
+        boolean allNodes = false;
+        Set<String> nodeIds = new HashSet<>();
+
+        while (argIter.hasNextArg()) {
+            String nextArg = argIter.nextArg("");
+
+            PageLocksCommandArg arg = CommandArgUtils.of(nextArg, PageLocksCommandArg.class);
+
+            if (arg == null)
+                break;
+
+            switch (arg) {
+                case DUMP:
+                    op = Operation.DUMP_FILE;
+
+                    break;
+                case DUMP_LOG:
+                    op = Operation.DUMP_LOG;
+
+                    break;
+                case ALL:
+                    allNodes = true;
+
+                    break;
+                case NODES:
+                    nodeIds.addAll(argIter.nextStringSet(""));
+
+                    break;
+                case PATH:
+                    path = argIter.nextArg("");
+
+                    break;
+                default:
+                    throw new IllegalArgumentException(
+                        "Unexpected argumetn:" + arg + ", supported:" + Arrays.toString(PageLocksCommandArg.values())
+                    );
             }
-            else
-                help = true;
         }
+
+        arguments = new Arguments(op, path, allNodes, nodeIds);
     }
 
     /** {@inheritDoc} */
     @Override public void printUsage(CommandLogger logger) {
         logger.log("View pages locks state information on the node or nodes.");
-        logger.log(CommandLogger.join(" ",
+        logger.log(join(" ",
             UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS, DUMP,
-            "[--path path_to_directory] [--all|--nodes nodeId1,nodeId2,..|--nodes consistentId1,consistentId2,..]",
-            "// Save page locks dump to file generated in IGNITE_HOME/work directory."));
-        logger.log(CommandLogger.join(" ",
+            optional(PATH, "path_to_directory"),
+            optional(ALL),
+            optional(CommandLogger.or(NODES, "nodeId1,nodeId2,..")),
+            optional(CommandLogger.or(NODES, "consistentId1,consistentId2,..")),
+            "// Save page locks dump to file generated in IGNITE_HOME" +
+                File.separatorChar + "work" + File.separatorChar + DEFAULT_TARGET_FOLDER + " directory."));
+        logger.log(join(" ",
             UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS, DUMP_LOG,
-            "[--all|--nodes nodeId1,nodeId2,..|--nodes consistentId1,consistentId2,..]",
+            optional(ALL),
+            optional(CommandLogger.or(NODES, "nodeId1,nodeId2,..")),
+            optional(CommandLogger.or(NODES, "consistentId1,consistentId2,..")),
             "// Pring page locks dump to console on the node or nodes."));
         logger.nl();
     }
@@ -170,47 +173,71 @@ public class PageLocksCommand implements Command<PageLocksCommand.Args> {
         });
     }
 
-    /**
-     *
-     */
-    public static class Args {
-        /**
-         *
-         */
-        private final String op;
+    /** */
+    public static class Arguments {
+        /** */
+        private final Operation op;
 
-        /**
-         *
-         */
-        private final String type;
-
-        /**
-         *
-         */
+        /** */
         private final String filePath;
 
-        /**
-         *
-         */
+        /** */
         private final boolean allNodes;
 
-        /**
-         *
-         */
+        /** */
         private final Set<String> nodeIds;
 
         /**
          * @param op Operation.
-         * @param type Type.
          * @param filePath File path.
+         * @param allNodes If {@code True} include all available nodes for command. If {@code False} include only subset.
          * @param nodeIds Node ids.
          */
-        public Args(String op, String type, String filePath, boolean allNodes, Set<String> nodeIds) {
+        public Arguments(
+            Operation op,
+            String filePath,
+            boolean allNodes,
+            Set<String> nodeIds
+        ) {
             this.op = op;
-            this.type = type;
             this.filePath = filePath;
             this.allNodes = allNodes;
             this.nodeIds = nodeIds;
         }
     }
+
+    enum PageLocksCommandArg implements CommandArg {
+        /** */
+        DUMP("dump"),
+
+        /** */
+        DUMP_LOG("dump_log"),
+
+        /** */
+        PATH("--path"),
+
+        /** */
+        NODES("--nodes"),
+
+        /** */
+        ALL("--all");
+
+        /** Option name. */
+        private final String name;
+
+        /** */
+        PageLocksCommandArg(String name) {
+            this.name = name;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String argName() {
+            return name;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return name;
+        }
+    }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
index 983b094..e388ba2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
@@ -809,6 +809,12 @@ public abstract class GridNearAtomicAbstractUpdateFuture extends GridCacheFuture
          * @param cctx Context.
          */
         private void initMapping(List<UUID> nodeIds, GridCacheContext cctx) {
+            if (nodeIds.isEmpty() && req.initMappingLocally()) {
+                mappedNodes = U.newHashMap(nodeIds.size());
+
+                rcvdCnt = 0;
+            }
+
             assert rcvdCnt <= nodeIds.size();
 
             expCnt = nodeIds.size();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java
index ff2faa5..09f49b1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java
@@ -33,9 +33,11 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lifecycle.LifecycleAware;
 import org.jetbrains.annotations.NotNull;
 
+import static java.io.File.separatorChar;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_PAGE_LOCK_TRACKER_TYPE;
 import static org.apache.ignite.IgniteSystemProperties.getInteger;
 import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.HEAP_LOG;
+import static org.apache.ignite.internal.processors.diagnostic.DiagnosticProcessor.DEFAULT_TARGET_FOLDER;
 
 /**
  * Page lock manager.
@@ -121,10 +123,11 @@ public class PageLockTrackerManager implements LifecycleAware {
 
             try {
                 // Write dump to file.
-                ToFileDumpProcessor.toFileDump(dump, new File(U.defaultWorkDirectory()), managerNameId);
+                ToFileDumpProcessor.toFileDump(dump, new File(U.defaultWorkDirectory() +
+                    separatorChar + DEFAULT_TARGET_FOLDER +  separatorChar), managerNameId);
             }
             catch (IgniteCheckedException e) {
-                log.warning("Faile to save locks dump file.", e);
+                log.warning("Failed to save locks dump file.", e);
             }
         }
     }
@@ -167,7 +170,9 @@ public class PageLockTrackerManager implements LifecycleAware {
         ThreadPageLocksDumpLock dump = sharedPageLockTracker.dump();
 
         try {
-            return ToFileDumpProcessor.toFileDump(dump, new File(U.defaultWorkDirectory()), managerNameId);
+            return ToFileDumpProcessor.toFileDump(dump,
+                new File(U.defaultWorkDirectory() +
+                    File.separatorChar + DEFAULT_TARGET_FOLDER +  File.separatorChar), managerNameId);
         }
         catch (IgniteCheckedException e) {
             throw U.convertException(e);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java
index 657eee6..b02d5f4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java
@@ -398,6 +398,8 @@ public class FileHandleManagerImpl implements FileHandleManager {
                 err = t;
             }
             finally {
+                this.err = err;
+
                 unparkWaiters(Long.MAX_VALUE);
 
                 if (err == null && !isCancelled)
@@ -564,6 +566,8 @@ public class FileHandleManagerImpl implements FileHandleManager {
                 assert hdl.written == hdl.fileIO.position();
             }
             catch (IOException e) {
+                err = e;
+
                 StorageException se = new StorageException("Failed to write buffer.", e);
 
                 cctx.kernalContext().failure().process(new FailureContext(CRITICAL_ERROR, se));
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java
index c8d143b..cfc75ed 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java
@@ -51,7 +51,7 @@ public class DiagnosticProcessor extends GridProcessorAdapter {
     private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss_SSS");
 
     /** Folder name for store diagnostic info. **/
-    static final String DEFAULT_TARGET_FOLDER = "diagnostic";
+    public static final String DEFAULT_TARGET_FOLDER = "diagnostic";
 
     /** File format. */
     static final String FILE_FORMAT = ".txt";
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/Operation.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/Operation.java
new file mode 100644
index 0000000..1738913
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/Operation.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.diagnostic;
+
+/**
+ * Operation type for {@link VisorPageLocksTask}
+ */
+public enum Operation {
+    /** Dump page locks to file operation. */
+    DUMP_FILE,
+    /** Dump page locks to log. */
+    DUMP_LOG
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java
index 26dc754..8a6253c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import org.apache.ignite.internal.dto.IgniteDataTransferObject;
+import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  *
@@ -48,30 +49,13 @@ public class VisorPageLocksResult extends IgniteDataTransferObject {
 
     /** {@inheritDoc} */
     @Override protected void writeExternalData(ObjectOutput out) throws IOException {
-        if (payload == null) {
-            out.writeInt(0);
-        }
-        else {
-            byte[] bytes = payload.getBytes();
-            int length = bytes.length;
-
-            out.writeInt(length);
-            out.write(bytes);
-        }
+        U.writeString(out, payload);
     }
 
     /** {@inheritDoc} */
     @Override protected void readExternalData(byte protoVer, ObjectInput in)
         throws IOException, ClassNotFoundException {
-        int length = in.readInt();
-
-        if (length != 0) {
-            byte[] bytes = new byte[length];
-
-            in.read(bytes);
-
-            payload = new String(bytes);
-        }
+        payload = U.readString(in);
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java
index a155eef..59f3a83 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java
@@ -30,6 +30,7 @@ import java.util.UUID;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.compute.ComputeJobResult;
+import org.apache.ignite.internal.cluster.NodeOrderComparator;
 import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.PageLockTrackerManager;
 import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToStringDumpProcessor;
 import org.apache.ignite.internal.processors.task.GridInternal;
@@ -74,7 +75,7 @@ public class VisorPageLocksTask
     @Nullable @Override protected Map<ClusterNode, VisorPageLocksResult> reduce0(
         List<ComputeJobResult> results
     ) throws IgniteException {
-        Map<ClusterNode, VisorPageLocksResult> mapRes = new TreeMap<>();
+        Map<ClusterNode, VisorPageLocksResult> mapRes = new TreeMap<>(NodeOrderComparator.getInstance());
 
         results.forEach(j -> {
             if (j.getException() == null)
@@ -111,25 +112,27 @@ public class VisorPageLocksTask
         @Override protected VisorPageLocksResult run(VisorPageLocksTrackerArgs arg) {
             PageLockTrackerManager lockTrackerMgr = ignite.context().cache().context().diagnostic().pageLockTracker();
 
-            String op = arg.type();
-
             String result;
 
-            if ("dump".equals(op)) {
-                String filePath = arg.filePath() != null ?
-                    lockTrackerMgr.dumpLocksToFile(arg.filePath()) :
-                    lockTrackerMgr.dumpLocksToFile();
+            switch (arg.operation()) {
+                case DUMP_LOG:
+                    lockTrackerMgr.dumpLocksToLog();
 
-                result = "Page locks dump was writtern to file " + filePath;
-            }
-            else if ("dump_log".equals(op)) {
-                lockTrackerMgr.dumpLocksToLog();
+                    result = "Page locks dump was printed to console " +
+                        ToStringDumpProcessor.DATE_FMT.format(new Date(System.currentTimeMillis()));
+
+                    break;
+                case DUMP_FILE:
+                    String filePath = arg.filePath() != null ?
+                        lockTrackerMgr.dumpLocksToFile(arg.filePath()) :
+                        lockTrackerMgr.dumpLocksToFile();
+
+                    result = "Page locks dump was writtern to file " + filePath;
 
-                result = "Page locks dump was printed to console " +
-                    ToStringDumpProcessor.DATE_FMT.format(new Date(System.currentTimeMillis()));
+                    break;
+                default:
+                    result = "Unsupported operation: " + arg.operation();
             }
-            else
-                result = "Unsupported operation: " + op;
 
             return new VisorPageLocksResult(result);
         }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java
index 9478291..28f8ef0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java
@@ -34,115 +34,60 @@ public class VisorPageLocksTrackerArgs extends IgniteDataTransferObject {
     private static final long serialVersionUID = 0L;
 
     /** */
-    private String op;
-
-    /** */
-    private String type;
+    private Operation op;
 
     /** */
     private String filePath;
 
     /** */
-    @Nullable private Set<String> consistentIds;
+    @Nullable private Set<String> nodeIds;
 
-    /**
-     * Default constructor.
-     */
+    /** */
     public VisorPageLocksTrackerArgs() {
 
     }
 
     /**
      * @param op Operation.
-     * @param type Type.
      * @param filePath File path.
-     * @param consistentIds Consistend id.
+     * @param nodeIds Set of ids.
      */
-    public VisorPageLocksTrackerArgs(String op, String type, String filePath, Set<String> consistentIds) {
+    public VisorPageLocksTrackerArgs(Operation op, String filePath, Set<String> nodeIds) {
         this.op = op;
-        this.type = type;
         this.filePath = filePath;
-        this.consistentIds = consistentIds;
+        this.nodeIds = nodeIds;
     }
 
     /** {@inheritDoc} */
     @Override protected void writeExternalData(ObjectOutput out) throws IOException {
-        if (op == null)
-            out.writeInt(0);
-        else {
-            byte[] bytes = op.getBytes();
-            out.writeInt(bytes.length);
-            out.write(bytes);
-        }
-
-        if (type == null)
-            out.writeInt(0);
-        else {
-            byte[] bytes = type.getBytes();
-            out.writeInt(bytes.length);
-            out.write(bytes);
-        }
-
-        if (filePath == null)
-            out.writeInt(0);
-        else {
-            byte[] bytes = filePath.getBytes();
-            out.writeInt(bytes.length);
-            out.write(bytes);
-        }
-
-        if (consistentIds != null)
-            U.writeCollection(out, consistentIds);
+        out.writeObject(op);
+
+        U.writeString(out,filePath);
+
+        U.writeCollection(out, nodeIds);
     }
 
     /** {@inheritDoc} */
     @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
-        int opLenght = in.readInt();
-
-        if (opLenght != 0) {
-            byte[] bytes = new byte[opLenght];
-
-            in.read(bytes);
-
-            op = new String(bytes);
-        }
-
-        int typeLenght = in.readInt();
+        op = (Operation)in.readObject();
 
-        if (typeLenght != 0) {
-            byte[] bytes = new byte[typeLenght];
+        filePath = U.readString(in);
 
-            in.read(bytes);
-
-            type = new String(bytes);
-        }
-
-        int filePathLenght = in.readInt();
-
-        if (filePathLenght != 0) {
-            byte[] bytes = new byte[filePathLenght];
-
-            in.read(bytes);
-
-            filePath = new String(bytes);
-        }
-
-        consistentIds = U.readSet(in);
+        nodeIds = U.readSet(in);
     }
 
-    public String operation() {
+    /** */
+    public Operation operation() {
         return op;
     }
 
-    public String type() {
-        return type;
-    }
-
+    /** */
     public String filePath() {
         return filePath;
     }
 
+    /** */
     public Set<String> nodeIds(){
-        return Collections.unmodifiableSet(consistentIds);
+        return Collections.unmodifiableSet(nodeIds);
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
index 4af513b..737816c 100644
--- a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
+++ b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
@@ -259,7 +259,7 @@ public class IgniteProductVersion implements Comparable<IgniteProductVersion>, E
 
     /** {@inheritDoc} */
     @Override public String toString() {
-        String revTsStr = IgniteVersionUtils.BUILD_TSTAMP_DATE_FORMATTER.format(new Date(revTs * 1000));
+        String revTsStr = IgniteVersionUtils.formatBuildTimeStamp(revTs * 1000);
 
         String hash = U.byteArray2HexString(revHash).toLowerCase();
 
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
index bb2fec0..bdd1b6d 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
@@ -2990,6 +2990,8 @@ class ServerImpl extends TcpDiscoveryImpl {
             else if (msg instanceof TcpDiscoveryRingLatencyCheckMessage)
                 processRingLatencyCheckMessage((TcpDiscoveryRingLatencyCheckMessage)msg);
 
+            else if (msg instanceof TcpDiscoveryAuthFailedMessage)
+                processAuthFailedMessage((TcpDiscoveryAuthFailedMessage)msg);
             else
                 assert false : "Unknown message type: " + msg.getClass().getSimpleName();
 
@@ -3013,6 +3015,23 @@ class ServerImpl extends TcpDiscoveryImpl {
             spi.stats.onMessageProcessingFinished(msg);
         }
 
+        /**
+         * Processes authentication failed message.
+         *
+         * @param authFailedMsg Authentication failed message.
+         */
+        private void processAuthFailedMessage(TcpDiscoveryAuthFailedMessage authFailedMsg) {
+            try {
+                sendDirectlyToClient(authFailedMsg.getTargetNodeId(), authFailedMsg);
+            }
+            catch (IgniteSpiException ex) {
+                log.warning(
+                    "Skipping send auth failed message to client due to some trouble with connection detected: "
+                    + ex.getMessage()
+                );
+            }
+        }
+
         /** {@inheritDoc} */
         @Override protected void noMessageLoop() {
             if (locNode == null)
@@ -3935,8 +3954,10 @@ class ServerImpl extends TcpDiscoveryImpl {
                                     U.addressesAsString(node));
 
                             try {
-                                trySendMessageDirectly(node, new TcpDiscoveryAuthFailedMessage(locNodeId,
-                                    spi.locHost));
+                                trySendMessageDirectly(
+                                    node,
+                                    new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id())
+                                );
                             }
                             catch (IgniteSpiException e) {
                                 if (log.isDebugEnabled())
@@ -3971,8 +3992,10 @@ class ServerImpl extends TcpDiscoveryImpl {
                                         ", addrs=" + U.addressesAsString(node));
 
                                 try {
-                                    trySendMessageDirectly(node, new TcpDiscoveryAuthFailedMessage(locNodeId,
-                                        spi.locHost));
+                                    trySendMessageDirectly(
+                                        node,
+                                        new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id())
+                                    );
                                 }
                                 catch (IgniteSpiException e) {
                                     if (log.isDebugEnabled())
@@ -4387,14 +4410,7 @@ class ServerImpl extends TcpDiscoveryImpl {
                     throw new IgniteSpiException("Router node is a client node: " + node);
 
                 if (routerNode.id().equals(getLocalNodeId())) {
-                    ClientMessageWorker worker = clientMsgWorkers.get(node.id());
-
-                    if (worker == null)
-                        throw new IgniteSpiException("Client node already disconnected: " + node);
-
-                    msg.verify(getLocalNodeId()); // Client worker require verified messages.
-
-                    worker.addMessage(msg);
+                    sendDirectlyToClient(node.id(), msg);
 
                     return;
                 }
@@ -4428,6 +4444,22 @@ class ServerImpl extends TcpDiscoveryImpl {
         }
 
         /**
+         * @param clientNodeId Client node id.
+         * @param msg Message to send.
+         * @throws IgniteSpiException Last failure if all attempts failed.
+         */
+        private void sendDirectlyToClient(UUID clientNodeId, TcpDiscoveryAbstractMessage msg) {
+            ClientMessageWorker worker = clientMsgWorkers.get(clientNodeId);
+
+            if (worker == null)
+                throw new IgniteSpiException("Client node already disconnected: " + clientNodeId);
+
+            msg.verify(getLocalNodeId()); // Client worker require verified messages.
+
+            worker.addMessage(msg);
+        }
+
+        /**
          * Processes node added message.
          *
          * For coordinator node method marks the messages as verified for rest of nodes to apply the
@@ -4579,8 +4611,10 @@ class ServerImpl extends TcpDiscoveryImpl {
                     finally {
                         if (authFailed) {
                             try {
-                                trySendMessageDirectly(node, new TcpDiscoveryAuthFailedMessage(locNodeId,
-                                    spi.locHost));
+                                trySendMessageDirectly(
+                                    node,
+                                    new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id())
+                                );
                             }
                             catch (IgniteSpiException e) {
                                 if (log.isDebugEnabled())
@@ -4644,7 +4678,7 @@ class ServerImpl extends TcpDiscoveryImpl {
 
                             if (spi.nodeAuth != null && spi.nodeAuth.isGlobalNodeAuthentication()) {
                                 TcpDiscoveryAbstractMessage authFail =
-                                    new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost);
+                                    new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id());
 
                                 try {
                                     ClassLoader ldr = U.resolveClassLoader(spi.ignite().configuration());
@@ -6621,10 +6655,6 @@ class ServerImpl extends TcpDiscoveryImpl {
                             // Send receipt back.
                             spi.writeToSocket(msg, sock, RES_OK, sockTimeout);
 
-                            boolean ignored = false;
-
-                            TcpDiscoverySpiState state = null;
-
                             synchronized (mux) {
                                 if (spiState == CONNECTING) {
                                     joinRes.set(msg);
@@ -6634,16 +6664,19 @@ class ServerImpl extends TcpDiscoveryImpl {
                                     mux.notifyAll();
                                 }
                                 else {
-                                    ignored = true;
+                                    UUID targetNode = ((TcpDiscoveryAuthFailedMessage)msg).getTargetNodeId();
 
-                                    state = spiState;
+                                    if (targetNode == null || targetNode.equals(locNodeId)) {
+                                        if (log.isDebugEnabled())
+                                            log.debug("Auth failed message has been ignored [msg=" + msg +
+                                                ", spiState=" + spiState + ']');
+                                    }
+                                    else
+                                        //It can happen when current node is router node and target node is client.
+                                        msgWorker.addMessage(msg);
                                 }
                             }
 
-                            if (ignored && log.isDebugEnabled())
-                                log.debug("Auth failed message has been ignored [msg=" + msg +
-                                    ", spiState=" + state + ']');
-
                             continue;
                         }
                         else if (msg instanceof TcpDiscoveryCheckFailedMessage) {
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java
index d563fbe..6136461 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java
@@ -35,16 +35,28 @@ public class TcpDiscoveryAuthFailedMessage extends TcpDiscoveryAbstractMessage {
     /** Coordinator address. */
     private transient InetAddress addr;
 
+    /** Node id for which authentication was failed. */
+    private UUID targetNodeId;
+
     /**
      * Constructor.
      *
      * @param creatorNodeId Creator node ID.
      * @param addr Coordinator address.
+     * @param targetNodeId Node for which authentication was failed.
      */
-    public TcpDiscoveryAuthFailedMessage(UUID creatorNodeId, InetAddress addr) {
+    public TcpDiscoveryAuthFailedMessage(UUID creatorNodeId, InetAddress addr, UUID targetNodeId) {
         super(creatorNodeId);
 
         this.addr = addr;
+        this.targetNodeId = targetNodeId;
+    }
+
+    /**
+     * @return Node for which authentication was failed.
+     */
+    public UUID getTargetNodeId() {
+        return targetNodeId;
     }
 
     /**
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
index 358faf20..bc1ef6d 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
@@ -18,15 +18,13 @@
 package org.apache.ignite.internal;
 
 import java.util.Arrays;
-import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.util.nio.GridCommunicationClient;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 
@@ -34,7 +32,6 @@ import org.junit.Test;
  * Tests client to be able restore connection to cluster on subsequent attempts after communication problems.
  */
 public class IgniteClientConnectAfterCommunicationFailureTest extends GridCommonAbstractTest {
-
     /** {@inheritDoc} */
     @Override protected void afterTest() throws Exception {
         stopAllGrids();
@@ -42,18 +39,10 @@ public class IgniteClientConnectAfterCommunicationFailureTest extends GridCommon
 
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(gridName);
-
-        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(new TcpDiscoveryMulticastIpFinder());
-
-        cfg.setNetworkTimeout(500);
-        cfg.setCommunicationSpi(new TcpCommunicationSpi(gridName.contains("block")));
-
-        if (gridName.contains("client")) {
-            cfg.setClientMode(true);
-        }
-
-        return cfg;
+        return super.getConfiguration(gridName)
+            .setNetworkTimeout(500)
+            .setCommunicationSpi(new TcpCommunicationSpi(gridName.contains("block")))
+            .setClientMode(gridName.contains("client"));
     }
 
     /**
@@ -126,38 +115,28 @@ public class IgniteClientConnectAfterCommunicationFailureTest extends GridCommon
         /**
          * Whether this instance should actually block.
          */
-        private final boolean isBlocking;
-
-        /**
-         * Local node ID that is prevented from creating connections.
-         */
-        private volatile UUID blockedNodeId = null;
+        private final AtomicBoolean isBlocking;
 
         /**
          *
          * @param isBlocking Whether this instance should actually block.
          */
         public TcpCommunicationSpi(boolean isBlocking) {
-            this.isBlocking = isBlocking;
+            this.isBlocking = new AtomicBoolean(isBlocking);
         }
 
         /** {@inheritDoc} */
         @Override protected GridCommunicationClient createTcpClient(ClusterNode node, int connIdx)
             throws IgniteCheckedException {
-            if (blockHandshakeOnce(getLocalNode().id())) {
+            if (blockHandshakeOnce())
                 throw new IgniteCheckedException("Node is blocked");
-            }
 
             return super.createTcpClient(node, connIdx);
         }
 
         /** Check if this connection is blocked. */
-        private boolean blockHandshakeOnce(UUID nodeId) {
-            if (isBlocking && (blockedNodeId == null || blockedNodeId.equals(nodeId))) {
-                blockedNodeId = nodeId;
-                return true;
-            }
-            return false;
+        private boolean blockHandshakeOnce() {
+            return isBlocking.compareAndSet(true, false);
         }
     }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/FailBackupOnAtomicOperationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/FailBackupOnAtomicOperationTest.java
new file mode 100644
index 0000000..b835033
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/FailBackupOnAtomicOperationTest.java
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed;
+
+import java.util.List;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.TestRecordingCommunicationSpi;
+import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateResponse;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+
+/**
+ * Fail backup node on not entry modified operation.
+ * It shold to lead mapping issue on FULL_SYNC cache only, bacause in this case cliwnt try to map operation to nodes locally.
+ */
+public class FailBackupOnAtomicOperationTest extends GridCommonAbstractTest {
+    /** Persistence. */
+    private boolean persistence = false;
+
+    /** Client. */
+    private static boolean client = false;
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        return super.getConfiguration(igniteInstanceName)
+            .setClientMode(client)
+            .setConsistentId(igniteInstanceName)
+            .setCommunicationSpi(new TestRecordingCommunicationSpi())
+            .setDataStorageConfiguration(new DataStorageConfiguration()
+                .setDefaultDataRegionConfiguration(new DataRegionConfiguration()
+                    .setMaxSize(200L * 1024 * 1024)
+                    .setPersistenceEnabled(persistence)))
+            .setCacheConfiguration(new CacheConfiguration(DEFAULT_CACHE_NAME)
+                .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC)
+                .setBackups(2)
+                .setAtomicityMode(CacheAtomicityMode.ATOMIC));
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        persistence = false;
+        client = false;
+
+        cleanPersistenceDir();
+
+        super.afterTest();
+    }
+
+    /**
+     * @throws Exception If fail.
+     */
+    @Test
+    public void testNodeFailOnCacheReadWithPersistent() throws Exception {
+        persistence = true;
+        nodeFailOnCacheOp();
+    }
+
+    /**
+     * @throws Exception If fail.
+     */
+    @Test
+    public void testNodeFailOnCacheReadWithoutPersistent() throws Exception {
+        nodeFailOnCacheOp();
+    }
+
+    /**
+     *
+     */
+    public void nodeFailOnCacheOp() throws Exception {
+        Ignite ignite0 = startGrids(3);
+
+        ignite0.cluster().active(true);
+
+        client = true;
+
+        Ignite igniteClient = startGrid("client");
+
+        client = false;
+
+        awaitPartitionMapExchange();
+
+        IgniteCache cache = igniteClient.cache(DEFAULT_CACHE_NAME);
+
+        List<Integer> keys = primaryKeys(ignite(1).cache(cache.getName()), 3, 0);
+
+        for (Integer key : keys) {
+            IgniteInternalFuture fut = GridTestUtils.runAsync(new Runnable() {
+                @Override public void run() {
+                    int i = keys.indexOf(key);
+
+                    switch (keys.indexOf(key)) {
+                        case 0:
+                            info("Cmd: getAndReplace");
+
+                            cache.getAndReplace(key, key);
+
+                            break;
+                        case 1:
+                            info("Cmd: invoke");
+
+                            cache.invoke(key, (entry, arguments) -> 0);
+
+                            break;
+                        case 2:
+                            info("Cmd: remove");
+
+                            cache.remove(key);
+
+                            break;
+                        default:
+                            fail("The op: " + i + " is not implemented");
+                    }
+                }
+            });
+
+            TestRecordingCommunicationSpi communicationSpi = (TestRecordingCommunicationSpi)ignite(1).configuration().getCommunicationSpi();
+
+            communicationSpi.blockMessages(GridNearAtomicUpdateResponse.class, "client");
+
+            communicationSpi.waitForBlocked();
+
+            ignite0.close();
+
+            communicationSpi.stopBlock();
+
+            try {
+                fut.get(10_000);
+            }
+            catch (IgniteCheckedException e) {
+                fail("Atomic update hangs. " + e.getMessage());
+            }
+
+            startGrid(0);
+
+            awaitPartitionMapExchange();
+        }
+    }
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java
index fe244b4..5074329 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java
@@ -32,8 +32,6 @@ import java.util.Random;
 import java.util.concurrent.BrokenBarrierException;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -236,7 +234,9 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
         Collections.shuffle(cachedEntry);
 
         //Remove half of entries.
-        Collection<T2<Integer, byte[]>> entriesToRemove = cachedEntry.stream().limit(cachedEntry.size() / 2).collect(Collectors.toCollection(ConcurrentLinkedQueue::new));
+        Collection<T2<Integer, byte[]>> entriesToRemove = cachedEntry.stream()
+            .limit(cachedEntry.size() / 2)
+            .collect(Collectors.toCollection(ConcurrentLinkedQueue::new));
 
         entriesToRemove.forEach(t2 -> cache.remove(t2.get1()));
 
@@ -276,7 +276,7 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
                 break;
 
             //Notify put thread that node successfully started.
-            nodeStartBarrier.await(20000, TimeUnit.MILLISECONDS);
+            nodeStartBarrier.await();
             nodeStartBarrier.reset();
 
             int awaitSize = entriesToRemove.size() - iterationDataCount;
@@ -304,7 +304,7 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
         GridTestUtils.runAsync(() -> {
             while (true) {
                 try {
-                    nodeStartBarrier.await(10000, TimeUnit.MILLISECONDS);
+                    nodeStartBarrier.await();
 
                     Ignite ignite = ignite(0);
 
@@ -320,7 +320,7 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
                         iter.remove();
                     }
                 }
-                catch (TimeoutException | InterruptedException | BrokenBarrierException e) {
+                catch (InterruptedException | BrokenBarrierException e) {
                     return;
                 }
                 catch (Exception e) {
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java
index 0f7579d..4ac9c82 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java
@@ -43,12 +43,14 @@ public abstract class AbstractPageLockTest {
         }
     }
 
+    /** */
     protected int nextRandomWaitTimeout(int bound) {
         ThreadLocalRandom rnd = ThreadLocalRandom.current();
 
         return rnd.nextInt(bound);
     }
 
+    /** */
     protected void checkNextOp(PageLockLogSnapshot lockLog, long nextOpPageId, long nextOp, int nextOpStructureId) {
         assertEquals(nextOpStructureId, lockLog.nextOpStructureId);
         assertEquals(nextOp, lockLog.nextOp);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java
index 49869f7..1afebe9 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java
@@ -33,6 +33,7 @@ import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelo
 import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageLockListener;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.GridTestUtils.SF;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -40,7 +41,6 @@ import static org.apache.ignite.internal.processors.cache.persistence.diagnostic
 import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.HEAP_STACK;
 import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.OFF_HEAP_LOG;
 import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.OFF_HEAP_STACK;
-import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToStringDumpProcessor.toStringDump;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
@@ -62,13 +62,15 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
         for (int i = 0; i < trackerTypes.length; i++) {
             LockTrackerFactory.DEFAULT_TYPE = trackerTypes[i];
 
-            doTestTakeDumpByCount(5, 1, 10, 1);
+            int dumps = SF.apply(30, 10, 40);
 
-            doTestTakeDumpByCount(5, 2, 10, 2);
+            doTestTakeDumpByCount(5, 1, dumps, 1);
 
-            doTestTakeDumpByCount(10, 3, 20, 4);
+            doTestTakeDumpByCount(5, 2, dumps, 2);
 
-            doTestTakeDumpByCount(20, 6, 40, 8);
+            doTestTakeDumpByCount(10, 3, dumps, 4);
+
+            doTestTakeDumpByCount(20, 6, dumps, 8);
         }
     }
 
@@ -84,13 +86,15 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
         for (int i = 0; i < trackerTypes.length; i++) {
             LockTrackerFactory.DEFAULT_TYPE = trackerTypes[i];
 
-            doTestTakeDumpByTime(5, 1, 40_000, 1);
+            int time = SF.apply(30_000, 5_000, 40_000);
+
+            doTestTakeDumpByTime(5, 1, time, 1);
 
-            doTestTakeDumpByTime(5, 2, 20_000, 2);
+            doTestTakeDumpByTime(5, 2, time, 2);
 
-            doTestTakeDumpByTime(10, 3, 10_000, 4);
+            doTestTakeDumpByTime(10, 3, time, 4);
 
-            doTestTakeDumpByTime(20, 6, 10_000, 8);
+            doTestTakeDumpByTime(20, 6, time, 8);
         }
     }
 
@@ -127,6 +131,8 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
 
             pages.addAll(pageMetas);
 
+            boolean latchDown = false;
+
             while (!stop.get()) {
                 Collections.shuffle(locks);
                 Collections.shuffle(pages);
@@ -156,8 +162,11 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
                     }
                 }
 
-                if (awaitThreadStartLatch.getCount() > 0)
+                if (!latchDown) {
                     awaitThreadStartLatch.countDown();
+
+                    latchDown = true;
+                }
             }
         }, threads, "PageLocker");
 
@@ -168,8 +177,6 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
 
             ThreadPageLocksDumpLock dump = sharedPageLockTracker.dump();
 
-            System.out.println(toStringDump(dump));
-
             assertEquals(threads, dump.threadStates.size());
             assertEquals(0, dump.threadStates.stream().filter(e -> e.invalidContext != null).count());
         }
@@ -212,17 +219,19 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
 
             pages.addAll(pageMetas);
 
+            boolean latchDown = false;
+
             while (!stop.get()) {
                 Collections.shuffle(locks);
                 Collections.shuffle(pages);
 
                 for (PageLockListener lsnr : locks) {
                     for (PageMeta pageMeta : pages) {
-                        //awaitRandom(5);
+                        awaitRandom(5);
 
                         lsnr.onBeforeReadLock(pageMeta.structureId, pageMeta.pageId, pageMeta.page);
 
-                        //awaitRandom(5);
+                        awaitRandom(5);
 
                         lsnr.onReadLock(pageMeta.structureId, pageMeta.pageId, pageMeta.page, pageMeta.pageAddr);
                     }
@@ -233,14 +242,17 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
 
                 for (PageLockListener lsnr : locks) {
                     for (PageMeta pageMeta : pages) {
-                        // awaitRandom(5);
+                        awaitRandom(5);
 
                         lsnr.onReadUnlock(pageMeta.structureId, pageMeta.pageId, pageMeta.page, pageMeta.pageAddr);
                     }
                 }
 
-                if (awaitThreadStartLatch.getCount() > 0)
+                if (!latchDown) {
                     awaitThreadStartLatch.countDown();
+
+                    latchDown = true;
+                }
             }
         }, threads, "PageLocker");
 
@@ -258,8 +270,6 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
 
                 ThreadPageLocksDumpLock dump = sharedPageLockTracker.dump();
 
-                System.out.println(toStringDump(dump));
-
                 assertEquals(threads, dump.threadStates.size());
                 assertEquals(0, dump.threadStates.stream().filter(e -> e.invalidContext != null).count());
             }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java
index 19ca152..9ffd46b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java
@@ -23,6 +23,7 @@ import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.AbstractPageLockTest;
 import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.log.PageLockLogSnapshot.LogEntry;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.GridTestUtils.SF;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -67,8 +68,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, pageId, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -77,8 +76,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, 0, 0, 0);
@@ -87,8 +84,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, 0, 0, 0);
     }
@@ -111,8 +106,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -121,8 +114,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, 0, 0, 0);
@@ -131,8 +122,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -141,8 +130,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(2, logDump.locklog.size());
 
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
@@ -153,8 +140,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(3, logDump.locklog.size());
 
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
@@ -165,9 +150,7 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
         lockLog.onReadUnlock(STRUCTURE_ID, pageId1, page1, pageAddr1);
 
         logDump = lockLog.dump();
-
-        out.println(logDump);
-
+        
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, 0, 0, 0);
     }
@@ -193,8 +176,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -203,8 +184,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, 0, 0, 0);
@@ -213,8 +192,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -223,8 +200,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(2, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -234,8 +209,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(2, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -245,8 +218,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(3, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -257,8 +228,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(4, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -270,8 +239,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(5, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -284,8 +251,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, 0, 0, 0);
@@ -312,8 +277,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -322,8 +285,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, 0, 0, 0);
@@ -332,8 +293,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -342,8 +301,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(2, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -353,8 +310,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(3, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -365,8 +320,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(3, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -377,8 +330,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(4, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -390,8 +341,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(5, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -404,8 +353,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, 0, 0, 0);
@@ -432,8 +379,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -442,8 +387,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, 0, 0, 0);
@@ -452,8 +395,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(1, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -462,8 +403,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(2, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -473,8 +412,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(2, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -484,8 +421,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(3, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -496,8 +431,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(4, logDump.headIdx);
         checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
         checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -507,8 +440,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         lockLog.onReadUnlock(STRUCTURE_ID, pageId3, page3, pageAddr3);
 
-        out.println(lockLog);
-
         logDump = lockLog.dump();
 
         assertEquals(5, logDump.headIdx);
@@ -523,8 +454,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
 
         logDump = lockLog.dump();
 
-        out.println(logDump);
-
         assertEquals(0, logDump.headIdx);
         assertTrue(logDump.locklog.isEmpty());
         checkNextOp(logDump, 0, 0, 0);
@@ -547,8 +476,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
             lockLog.onReadLock(STRUCTURE_ID, pageId, page, pageAddr);
         });
 
-        out.println(lockLog);
-
         log = lockLog.dump();
 
         Assert.assertTrue(lockLog.isInvalid());
@@ -567,7 +494,7 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
         long page = 2;
         long pageAddr = 3;
 
-        int cntlogs = 5_000;
+        int cntlogs = SF.applyLB(5_000, 1_000);
 
         AtomicBoolean done = new AtomicBoolean();
 
@@ -618,9 +545,8 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
             Assert.assertNotNull(logDump.name);
 
             if (logDump.headIdx > 0) {
-                //TODO
-               /* for (int j = 0; j < log.headIdx; j++)
-                    Assert.assertTrue(String.valueOf(log.headIdx), log.pageIdLocksStack[j] != 0);*/
+                for (int j = 0; j < logDump.headIdx; j++)
+                    Assert.assertNotNull(String.valueOf(logDump.headIdx), logDump.locklog.get(j));
             }
 
             Assert.assertNotNull(logDump);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java
index 397cfaa..43a4421 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java
@@ -24,6 +24,7 @@ import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelo
 import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory;
 import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.PageLockTracker;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.GridTestUtils.SF;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -673,7 +674,7 @@ public abstract class PageLockStackTest extends AbstractPageLockTest {
         long page = 2;
         long pageAddr = 3;
 
-        int cntDumps = 5_000;
+        int cntDumps = SF.applyLB(5_000, 1_000);
 
         AtomicBoolean done = new AtomicBoolean();
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java
index dd40f81..aede022 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java
@@ -46,6 +46,7 @@ import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType
 import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.PAGE_RECORD;
 import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.PART_META_UPDATE_STATE;
 import static org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState.OWNING;
+import static org.apache.ignite.internal.processors.cache.persistence.wal.scanner.WalScannerTest.dummyPage;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.mockito.Mockito.when;
@@ -181,7 +182,7 @@ public class FilteredWalIteratorTest {
             case 1:
                 return new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0)));
             case 2:
-                return new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(1, 1), new byte[0], 10));
+                return new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(1, 1), dummyPage(1024, 1), 1024));
             case 3:
                 return new IgniteBiTuple<>(ZERO_POINTER, new PartitionMetaStateRecord(1, 1, OWNING, 1));
             case 4:
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java
index 469b102..0081d3a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.cache.persistence.wal.scanner;
 
 import java.io.File;
+import java.nio.ByteBuffer;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -35,9 +36,11 @@ import org.apache.ignite.internal.pagemem.wal.record.PageSnapshot;
 import org.apache.ignite.internal.pagemem.wal.record.WALRecord;
 import org.apache.ignite.internal.pagemem.wal.record.delta.FixCountRecord;
 import org.apache.ignite.internal.pagemem.wal.record.delta.PartitionMetaStateRecord;
+import org.apache.ignite.internal.processors.cache.persistence.DummyPageIO;
 import org.apache.ignite.internal.processors.cache.persistence.wal.FileWALPointer;
 import org.apache.ignite.internal.processors.cache.persistence.wal.reader.IgniteWalIteratorFactory;
 import org.apache.ignite.internal.processors.cache.persistence.wal.reader.IgniteWalIteratorFactory.IteratorParametersBuilder;
+import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
@@ -75,13 +78,13 @@ public class WalScannerTest {
         long expPageId = 984;
         int grpId = 123;
 
-        PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId, grpId), new byte[0], 10);
+        PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId, grpId), dummyPage(1024, expPageId), 1024);
         CheckpointRecord expCheckpoint = new CheckpointRecord(new FileWALPointer(5738, 0, 0));
         FixCountRecord expDeltaPage = new FixCountRecord(grpId, expPageId, 4);
 
         WALIterator mockedIter = mockWalIterator(
             new IgniteBiTuple<>(ZERO_POINTER, expPageSnapshot),
-            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), new byte[0], 10)),
+            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), dummyPage(4096, 455), 1024)),
             new IgniteBiTuple<>(ZERO_POINTER, expCheckpoint),
             new IgniteBiTuple<>(ZERO_POINTER, new MetastoreDataRecord("key", new byte[0])),
             new IgniteBiTuple<>(ZERO_POINTER, new PartitionMetaStateRecord(grpId, 1, OWNING, 1)),
@@ -125,14 +128,14 @@ public class WalScannerTest {
 
         int grpId = 123;
 
-        PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId1, grpId), new byte[0], 10);
+        PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId1, grpId), dummyPage(1024, expPageId1), 1024);
         CheckpointRecord expCheckpoint = new CheckpointRecord(new FileWALPointer(5738, 0, 0));
         FixCountRecord expDeltaPage1 = new FixCountRecord(grpId, expPageId2, 4);
         FixCountRecord expDeltaPage2 = new FixCountRecord(grpId, expPageId3, 4);
 
         WALIterator mockedIter = mockWalIterator(
             new IgniteBiTuple<>(ZERO_POINTER, expPageSnapshot),
-            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), new byte[0], 10)),
+            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), dummyPage(1024, 455), 1024)),
             new IgniteBiTuple<>(ZERO_POINTER, expCheckpoint),
             new IgniteBiTuple<>(ZERO_POINTER, new MetastoreDataRecord("key", new byte[0])),
             new IgniteBiTuple<>(ZERO_POINTER, new PartitionMetaStateRecord(grpId, 1, OWNING, 1)),
@@ -183,7 +186,7 @@ public class WalScannerTest {
         doNothing().when(log).info(valCapture.capture());
 
         WALIterator mockedIter = mockWalIterator(
-            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), new byte[0], 10)),
+            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), dummyPage(1024, expPageId), 1024)),
             new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0))),
             new IgniteBiTuple<>(ZERO_POINTER, new FixCountRecord(grpId, expPageId, 4))
         );
@@ -230,7 +233,7 @@ public class WalScannerTest {
         int grpId = 123;
 
         WALIterator mockedIter = mockWalIterator(
-            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expectedPageId, grpId), new byte[0], 10)),
+            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expectedPageId, grpId), dummyPage(1024, expectedPageId), 1024)),
             new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0))),
             new IgniteBiTuple<>(ZERO_POINTER, new FixCountRecord(grpId, expectedPageId, 4))
         );
@@ -256,12 +259,12 @@ public class WalScannerTest {
             targetFile.delete();
         }
 
-        // then: Should be find only expected value from file.
-        assertEquals(actualRecords.size(), 3);
+        // then: Should be find only expected value from file. PageSnapshot string representation is 11 lines long.
+        assertEquals(13, actualRecords.size());
 
-        assertRecord(actualRecords.get(0), "PageSnapshot [", "PAGE_RECORD");
-        assertRecord(actualRecords.get(1), "CheckpointRecord [", "CHECKPOINT_RECORD");
-        assertRecord(actualRecords.get(2), "FixCountRecord [", "BTREE_FIX_COUNT");
+        assertTrue(actualRecords.get(0), actualRecords.get(0).contains("PageSnapshot ["));
+        assertTrue(actualRecords.get(11), actualRecords.get(11).contains("CheckpointRecord ["));
+        assertTrue(actualRecords.get(12), actualRecords.get(12).contains("FixCountRecord ["));
     }
 
     /**
@@ -281,7 +284,7 @@ public class WalScannerTest {
         doNothing().when(log).info(valCapture.capture());
 
         WALIterator mockedIter = mockWalIterator(
-            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), new byte[0], 10)),
+            new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), dummyPage(1024, expPageId), 1024)),
             new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0))),
             new IgniteBiTuple<>(ZERO_POINTER, new FixCountRecord(grpId, expPageId, 4))
         );
@@ -310,18 +313,18 @@ public class WalScannerTest {
         // then: Should be find only expected value from file.
         assertEquals(actualFileRecords.size(), 3);
 
-        assertRecord(actualFileRecords.get(0), "PageSnapshot [", "PAGE_RECORD");
-        assertRecord(actualFileRecords.get(1), "CheckpointRecord [", "CHECKPOINT_RECORD");
-        assertRecord(actualFileRecords.get(2), "FixCountRecord [", "BTREE_FIX_COUNT");
+        assertTrue(actualFileRecords.get(0), actualFileRecords.get(0).contains("PageSnapshot ["));
+        assertTrue(actualFileRecords.get(1), actualFileRecords.get(1).contains("CheckpointRecord ["));
+        assertTrue(actualFileRecords.get(2), actualFileRecords.get(2).contains("FixCountRecord ["));
 
         // then: Should be find only expected value from log.
         List<String> actualLogRecords = valCapture.getAllValues();
 
         assertEquals(actualLogRecords.size(), 1);
 
-        assertRecord(actualLogRecords.get(0), "PageSnapshot [", "PAGE_RECORD");
-        assertRecord(actualLogRecords.get(0), "CheckpointRecord [", "CHECKPOINT_RECORD");
-        assertRecord(actualLogRecords.get(0), "FixCountRecord [", "BTREE_FIX_COUNT");
+        assertTrue(actualLogRecords.get(0), actualLogRecords.get(0).contains("PageSnapshot ["));
+        assertTrue(actualLogRecords.get(0), actualLogRecords.get(0).contains("CheckpointRecord ["));
+        assertTrue(actualLogRecords.get(0), actualLogRecords.get(0).contains("FixCountRecord ["));
     }
 
     /**
@@ -344,4 +347,19 @@ public class WalScannerTest {
 
         return mockedIter;
     }
+
+    /** */
+    public static byte[] dummyPage(int pageSize, long pageId) {
+        ByteBuffer pageBuf = ByteBuffer.allocateDirect(pageSize);
+
+        DummyPageIO.VERSIONS.latest().initNewPage(GridUnsafe.bufferAddress(pageBuf), pageId, pageSize);
+
+        byte[] pageData = new byte[pageSize];
+
+        pageBuf.get(pageData);
+
+        GridUnsafe.cleanDirectBuffer(pageBuf);
+
+        return pageData;
+    }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java b/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java
index 926a056..8fc920b 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java
@@ -123,6 +123,10 @@ public class TcpCommunicationSpiFreezingClientTest extends GridCommonAbstractTes
         }
         catch (ClusterTopologyException e) {
             // Expected.
+
+            e.printStackTrace();
+
+            System.out.println(e);
         }
         finally {
             stopAllGrids();
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java
index d9f15c3..4263f9d 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java
@@ -34,6 +34,7 @@ import org.apache.ignite.internal.processors.cache.IgniteCacheGetCustomCollectio
 import org.apache.ignite.internal.processors.cache.IgniteCacheLoadRebalanceEvictionSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.CacheAtomicPrimarySyncBackPressureTest;
 import org.apache.ignite.internal.processors.cache.distributed.CacheOperationsInterruptTest;
+import org.apache.ignite.internal.processors.cache.distributed.FailBackupOnAtomicOperationTest;
 import org.apache.ignite.internal.processors.cache.distributed.IgniteCachePrimarySyncTest;
 import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCachePrimarySyncTest;
 import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCacheWriteSynchronizationModesMultithreadedTest;
@@ -115,6 +116,8 @@ public class IgniteCacheTestSuite9 {
 
         GridTestUtils.addTestIfNeeded(suite, GridCacheLongRunningTransactionDiagnosticsTest.class, ignoredTests);
 
+        GridTestUtils.addTestIfNeeded(suite, FailBackupOnAtomicOperationTest.class, ignoredTests);
+
         return suite;
     }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java
index 239372c..78c9480 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java
@@ -22,6 +22,13 @@ import java.util.Set;
 import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsTaskCancelingTest;
 import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsPartitionPreloadTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.PageLockTrackerManagerTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.SharedPageLockTrackerTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToFileDumpProcessorTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.log.HeapArrayLockLogTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.log.OffHeapLockLogTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.stack.HeapArrayLockStackTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.stack.OffHeapLockStackTest;
 import org.apache.ignite.internal.processors.cache.persistence.file.FileDownloaderTest;
 import org.apache.ignite.testframework.junits.DynamicSuite;
 import org.junit.runner.RunWith;
@@ -46,6 +53,15 @@ public class IgnitePdsMvccTestSuite4 {
         ignoredTests.add(FileDownloaderTest.class);
         ignoredTests.add(IgnitePdsTaskCancelingTest.class);
 
+        // Skip page lock tracker tests for MVCC suite.
+        ignoredTests.add(PageLockTrackerManagerTest.class);
+        ignoredTests.add(SharedPageLockTrackerTest.class);
+        ignoredTests.add(ToFileDumpProcessorTest.class);
+        ignoredTests.add(HeapArrayLockLogTest.class);
+        ignoredTests.add(HeapArrayLockStackTest.class);
+        ignoredTests.add(OffHeapLockLogTest.class);
+        ignoredTests.add(OffHeapLockStackTest.class);
+
         return IgnitePdsTestSuite4.suite(ignoredTests);
     }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index 2b0bb1d..eb0e82c 100644
--- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -87,6 +87,7 @@ import org.apache.ignite.internal.processors.cache.distributed.near.GridNearLock
 import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishRequest;
 import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
 import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToFileDumpProcessor;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager;
@@ -115,6 +116,7 @@ import org.apache.ignite.transactions.TransactionTimeoutException;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
+import static java.io.File.separatorChar;
 import static java.nio.file.Files.delete;
 import static java.nio.file.Files.newDirectoryStream;
 import static java.util.Arrays.asList;
@@ -129,6 +131,7 @@ import static org.apache.ignite.internal.commandline.OutputFormat.MULTI_LINE;
 import static org.apache.ignite.internal.commandline.OutputFormat.SINGLE_LINE;
 import static org.apache.ignite.internal.commandline.cache.CacheSubcommands.HELP;
 import static org.apache.ignite.internal.processors.cache.verify.VerifyBackupPartitionsDumpTask.IDLE_DUMP_FILE_PREFIX;
+import static org.apache.ignite.internal.processors.diagnostic.DiagnosticProcessor.DEFAULT_TARGET_FOLDER;
 import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
 import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
 import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
@@ -153,6 +156,12 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     /** Additional data region configuration. */
     private DataRegionConfiguration dataRegionConfiguration;
 
+    /** */
+    private File defaultDiagnosticDir;
+
+    /** */
+    private File customDiagnosticDir;
+
     /**
      * @return Folder in work directory.
      * @throws IgniteCheckedException If failed to resolve folder name.
@@ -185,6 +194,10 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
 
         stopAllGrids();
 
+        initDiagnosticDir();
+
+        cleanDiagnosticDir();
+
         sysOut = System.out;
 
         testOut = new ByteArrayOutputStream(1024 * 1024);
@@ -206,6 +219,8 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
                 delete(path);
         }
 
+        cleanDiagnosticDir();
+
         System.clearProperty(IGNITE_ENABLE_EXPERIMENTAL_COMMAND);
 
         System.setOut(sysOut);
@@ -216,6 +231,25 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     }
 
     /**
+     * @throws IgniteCheckedException If failed.
+     */
+    private void initDiagnosticDir() throws IgniteCheckedException {
+        defaultDiagnosticDir = new File(U.defaultWorkDirectory()
+            + separatorChar + DEFAULT_TARGET_FOLDER + separatorChar);
+
+        customDiagnosticDir = new File(U.defaultWorkDirectory()
+            + separatorChar + "diagnostic_test_dir" + separatorChar);
+    }
+
+    /**
+     * Clean diagnostic directories.
+     */
+    private void cleanDiagnosticDir() {
+        U.delete(defaultDiagnosticDir);
+        U.delete(customDiagnosticDir);
+    }
+
+    /**
      *
      */
     protected void injectTestSystemOut() {
@@ -2702,29 +2736,108 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
 
         ignite.cluster().active(true);
 
-        String dir = U.defaultWorkDirectory() + "/diagnostic/";
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic")
+        );
+
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "help")
+        );
+
+        // Dump locks only on connected node to default path.
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump")
+        );
+
+        // Check file dump in default path.
+        checkNumberFiles(defaultDiagnosticDir, 1);
+
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump_log")
+        );
+
+        // Dump locks only on connected node to specific path.
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump", "--path", customDiagnosticDir.getAbsolutePath())
+        );
+
+        // Check file dump in specific path.
+        checkNumberFiles(customDiagnosticDir, 1);
+
+        // Dump locks only all nodes.
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump", "--all")
+        );
+
+        // Current cluster 4 nodes -> 4 files + 1 from previous operation.
+        checkNumberFiles(defaultDiagnosticDir, 5);
+
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump_log", "--all")
+        );
+
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump",
+                "--path", customDiagnosticDir.getAbsolutePath(), "--all")
+        );
 
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic"));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "help"));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "help"));
+        // Current cluster 4 nodes -> 4 files + 1 from previous operation.
+        checkNumberFiles(customDiagnosticDir, 5);
 
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump"));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump_log"));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", dir));
+        // Dump locks only 2 nodes use nodeIds as arg.
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump",
+                "--nodes", node0.id().toString() + "," + node2.id().toString())
+        );
 
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", "--all"));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump_log", "--all"));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", dir, "--all"));
+        // Dump locks only for 2 nodes -> 2 files + 5 from previous operation.
+        checkNumberFiles(defaultDiagnosticDir, 7);
+
+        // Dump locks only for 2 nodes use constIds as arg.
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump",
+                "--nodes", node0.consistentId().toString() + "," + node2.consistentId().toString())
+        );
+
+        assertEquals(
+            EXIT_CODE_OK,
+            execute("--diagnostic", "pageLocks", "dump_log",
+                "--nodes", node1.id().toString() + "," + node3.id().toString())
+        );
+
+        assertEquals(
+            EXIT_CODE_OK,
+            execute(
+                "--diagnostic", "pageLocks", "dump",
+                "--path", customDiagnosticDir.getAbsolutePath(),
+                "--nodes", node1.consistentId().toString() + "," + node3.consistentId().toString())
+        );
+
+        // Dump locks only for 2 nodes -> 2 files + 5 from previous operation.
+        checkNumberFiles(customDiagnosticDir, 7);
+    }
+
+    /**
+     * @param dir Directory.
+     * @param numberFiles Number of files.
+     */
+    private void checkNumberFiles(File dir, int numberFiles) {
+        File[] files = dir.listFiles((d, name) -> name.startsWith(ToFileDumpProcessor.PREFIX_NAME));
 
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", "--nodes",
-            node0.id().toString(), node2.id().toString()));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", "--nodes",
-            node0.consistentId().toString(), node2.consistentId().toString()));
+        assertEquals(numberFiles, files.length);
 
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump_log", "--nodes",
-            node1.id().toString(), node3.id().toString()));
-        assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", dir, "--nodes",
-            node1.consistentId().toString(), node3.consistentId().toString()));
+        for (int i = 0; i < files.length; i++)
+            assertTrue(files[i].length() > 0);
     }
 
     /**