You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/04/26 12:45:09 UTC

[2/3] ignite git commit: ignite-4799 TcpDiscoverySpi: removed missedHeartbeats properties, heartbeatFrequency (instead use IgiteConfiguration.metricsUpdateFrequency). Added IgiteConfiguration.clientFailureDetectionTimeout.

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryHeartbeatMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryHeartbeatMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryHeartbeatMessage.java
deleted file mode 100644
index 0ae253a..0000000
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryHeartbeatMessage.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * 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.spi.discovery.tcp.messages;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.cache.CacheMetrics;
-import org.apache.ignite.cluster.ClusterMetrics;
-import org.apache.ignite.internal.ClusterMetricsSnapshot;
-import org.apache.ignite.internal.util.tostring.GridToStringExclude;
-import org.apache.ignite.internal.util.typedef.C1;
-import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.T2;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
-
-/**
- * Heartbeat message.
- * <p>
- * It is sent by coordinator node across the ring once a configured period.
- * Message makes two passes:
- * <ol>
- *      <li>During first pass, all nodes add their metrics to the message and
- *          update local metrics with metrics currently present in the message.</li>
- *      <li>During second pass, all nodes update all metrics present in the message
- *          and remove their own metrics from the message.</li>
- * </ol>
- * When message reaches coordinator second time it is discarded (it finishes the
- * second pass).
- */
-@TcpDiscoveryRedirectToClient
-public class TcpDiscoveryHeartbeatMessage extends TcpDiscoveryAbstractMessage {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Map to store nodes metrics. */
-    @GridToStringExclude
-    private final Map<UUID, MetricsSet> metrics = new HashMap<>();
-
-    /** Client node IDs. */
-    private final Collection<UUID> clientNodeIds = new HashSet<>();
-
-    /** Cahce metrics by node. */
-    @GridToStringExclude
-    private final Map<UUID, Map<Integer, CacheMetrics>> cacheMetrics = new HashMap<>();
-
-    /**
-     * Constructor.
-     *
-     * @param creatorNodeId Creator node.
-     */
-    public TcpDiscoveryHeartbeatMessage(UUID creatorNodeId) {
-        super(creatorNodeId);
-    }
-
-    /**
-     * Sets metrics for particular node.
-     *
-     * @param nodeId Node ID.
-     * @param metrics Node metrics.
-     */
-    public void setMetrics(UUID nodeId, ClusterMetrics metrics) {
-        assert nodeId != null;
-        assert metrics != null;
-        assert !this.metrics.containsKey(nodeId);
-
-        this.metrics.put(nodeId, new MetricsSet(metrics));
-    }
-
-    /**
-     * Sets cache metrics for particular node.
-     *
-     * @param nodeId Node ID.
-     * @param metrics Node cache metrics.
-     */
-    public void setCacheMetrics(UUID nodeId, Map<Integer, CacheMetrics> metrics) {
-        assert nodeId != null;
-        assert metrics != null;
-        assert !this.cacheMetrics.containsKey(nodeId);
-
-        if (!F.isEmpty(metrics))
-            this.cacheMetrics.put(nodeId, metrics);
-    }
-
-    /**
-     * Sets metrics for a client node.
-     *
-     * @param nodeId Server node ID.
-     * @param clientNodeId Client node ID.
-     * @param metrics Node metrics.
-     */
-    public void setClientMetrics(UUID nodeId, UUID clientNodeId, ClusterMetrics metrics) {
-        assert nodeId != null;
-        assert clientNodeId != null;
-        assert metrics != null;
-        assert this.metrics.containsKey(nodeId);
-
-        this.metrics.get(nodeId).addClientMetrics(clientNodeId, metrics);
-    }
-
-    /**
-     * Removes metrics for particular node from the message.
-     *
-     * @param nodeId Node ID.
-     */
-    public void removeMetrics(UUID nodeId) {
-        assert nodeId != null;
-
-        metrics.remove(nodeId);
-    }
-
-    /**
-     * Removes cache metrics for particular node from the message.
-     *
-     * @param nodeId Node ID.
-     */
-    public void removeCacheMetrics(UUID nodeId) {
-        assert nodeId != null;
-
-        cacheMetrics.remove(nodeId);
-    }
-
-    /**
-     * Gets metrics map.
-     *
-     * @return Metrics map.
-     */
-    public Map<UUID, MetricsSet> metrics() {
-        return metrics;
-    }
-
-    /**
-     * Gets cache metrics map.
-     *
-     * @return Cache metrics map.
-     */
-    public Map<UUID, Map<Integer, CacheMetrics>> cacheMetrics() {
-        return cacheMetrics;
-    }
-
-    /**
-     * @return {@code True} if this message contains metrics.
-     */
-    public boolean hasMetrics() {
-        return !metrics.isEmpty();
-    }
-
-    /**
-     * @return {@code True} this message contains cache metrics.
-     */
-    public boolean hasCacheMetrics() {
-        return !cacheMetrics.isEmpty();
-    }
-
-    /**
-     * @return {@code True} if this message contains metrics.
-     */
-    public boolean hasMetrics(UUID nodeId) {
-        assert nodeId != null;
-
-        return metrics.get(nodeId) != null;
-    }
-
-    /**
-     * @param nodeId Node ID.
-     *
-     * @return {@code True} if this message contains cache metrics for particular node.
-     */
-    public boolean hasCacheMetrics(UUID nodeId) {
-        assert nodeId != null;
-
-        return cacheMetrics.get(nodeId) != null;
-    }
-
-    /**
-     * Gets client node IDs for  particular node.
-     *
-     * @return Client node IDs.
-     */
-    public Collection<UUID> clientNodeIds() {
-        return clientNodeIds;
-    }
-
-    /**
-     * Adds client node ID.
-     *
-     * @param clientNodeId Client node ID.
-     */
-    public void addClientNodeId(UUID clientNodeId) {
-        clientNodeIds.add(clientNodeId);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean traceLogLevel() {
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean highPriority() {
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(TcpDiscoveryHeartbeatMessage.class, this, "super", super.toString());
-    }
-
-    /**
-     * @param nodeId Node ID.
-     * @param metrics Metrics.
-     * @return Serialized metrics.
-     */
-    private static byte[] serializeMetrics(UUID nodeId, ClusterMetrics metrics) {
-        assert nodeId != null;
-        assert metrics != null;
-
-        byte[] buf = new byte[16 + ClusterMetricsSnapshot.METRICS_SIZE];
-
-        U.longToBytes(nodeId.getMostSignificantBits(), buf, 0);
-        U.longToBytes(nodeId.getLeastSignificantBits(), buf, 8);
-
-        ClusterMetricsSnapshot.serialize(buf, 16, metrics);
-
-        return buf;
-    }
-
-    /**
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class MetricsSet implements Externalizable {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /** Metrics. */
-        private byte[] metrics;
-
-        /** Client metrics. */
-        private Collection<byte[]> clientMetrics;
-
-        /**
-         */
-        public MetricsSet() {
-            // No-op.
-        }
-
-        /**
-         * @param metrics Metrics.
-         */
-        public MetricsSet(ClusterMetrics metrics) {
-            assert metrics != null;
-
-            this.metrics = ClusterMetricsSnapshot.serialize(metrics);
-        }
-
-        /**
-         * @return Deserialized metrics.
-         */
-        public ClusterMetrics metrics() {
-            return ClusterMetricsSnapshot.deserialize(metrics, 0);
-        }
-
-        /**
-         * @return Client metrics.
-         */
-        public Collection<T2<UUID, ClusterMetrics>> clientMetrics() {
-            return F.viewReadOnly(clientMetrics, new C1<byte[], T2<UUID, ClusterMetrics>>() {
-                @Override public T2<UUID, ClusterMetrics> apply(byte[] bytes) {
-                    UUID nodeId = new UUID(U.bytesToLong(bytes, 0), U.bytesToLong(bytes, 8));
-
-                    return new T2<>(nodeId, ClusterMetricsSnapshot.deserialize(bytes, 16));
-                }
-            });
-        }
-
-        /**
-         * @param nodeId Client node ID.
-         * @param metrics Client metrics.
-         */
-        private void addClientMetrics(UUID nodeId, ClusterMetrics metrics) {
-            assert nodeId != null;
-            assert metrics != null;
-
-            if (clientMetrics == null)
-                clientMetrics = new ArrayList<>();
-
-            clientMetrics.add(serializeMetrics(nodeId, metrics));
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeExternal(ObjectOutput out) throws IOException {
-            U.writeByteArray(out, metrics);
-
-            out.writeInt(clientMetrics != null ? clientMetrics.size() : -1);
-
-            if (clientMetrics != null) {
-                for (byte[] arr : clientMetrics)
-                    U.writeByteArray(out, arr);
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            metrics = U.readByteArray(in);
-
-            int clientMetricsSize = in.readInt();
-
-            if (clientMetricsSize >= 0) {
-                clientMetrics = new ArrayList<>(clientMetricsSize);
-
-                for (int i = 0; i < clientMetricsSize; i++)
-                    clientMetrics.add(U.readByteArray(in));
-            }
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryMetricsUpdateMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryMetricsUpdateMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryMetricsUpdateMessage.java
new file mode 100644
index 0000000..9bf33cf
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryMetricsUpdateMessage.java
@@ -0,0 +1,338 @@
+/*
+ * 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.spi.discovery.tcp.messages;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.ignite.cache.CacheMetrics;
+import org.apache.ignite.cluster.ClusterMetrics;
+import org.apache.ignite.internal.ClusterMetricsSnapshot;
+import org.apache.ignite.internal.util.tostring.GridToStringExclude;
+import org.apache.ignite.internal.util.typedef.C1;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.T2;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+
+/**
+ * Metrics update message.
+ * <p>
+ * It is sent by coordinator node across the ring once a configured period.
+ * Message makes two passes:
+ * <ol>
+ *      <li>During first pass, all nodes add their metrics to the message and
+ *          update local metrics with metrics currently present in the message.</li>
+ *      <li>During second pass, all nodes update all metrics present in the message
+ *          and remove their own metrics from the message.</li>
+ * </ol>
+ * When message reaches coordinator second time it is discarded (it finishes the
+ * second pass).
+ */
+@TcpDiscoveryRedirectToClient
+public class TcpDiscoveryMetricsUpdateMessage extends TcpDiscoveryAbstractMessage {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Map to store nodes metrics. */
+    @GridToStringExclude
+    private final Map<UUID, MetricsSet> metrics = new HashMap<>();
+
+    /** Client node IDs. */
+    private final Collection<UUID> clientNodeIds = new HashSet<>();
+
+    /** Cahce metrics by node. */
+    @GridToStringExclude
+    private final Map<UUID, Map<Integer, CacheMetrics>> cacheMetrics = new HashMap<>();
+
+    /**
+     * Constructor.
+     *
+     * @param creatorNodeId Creator node.
+     */
+    public TcpDiscoveryMetricsUpdateMessage(UUID creatorNodeId) {
+        super(creatorNodeId);
+    }
+
+    /**
+     * Sets metrics for particular node.
+     *
+     * @param nodeId Node ID.
+     * @param metrics Node metrics.
+     */
+    public void setMetrics(UUID nodeId, ClusterMetrics metrics) {
+        assert nodeId != null;
+        assert metrics != null;
+        assert !this.metrics.containsKey(nodeId);
+
+        this.metrics.put(nodeId, new MetricsSet(metrics));
+    }
+
+    /**
+     * Sets cache metrics for particular node.
+     *
+     * @param nodeId Node ID.
+     * @param metrics Node cache metrics.
+     */
+    public void setCacheMetrics(UUID nodeId, Map<Integer, CacheMetrics> metrics) {
+        assert nodeId != null;
+        assert metrics != null;
+        assert !this.cacheMetrics.containsKey(nodeId);
+
+        if (!F.isEmpty(metrics))
+            this.cacheMetrics.put(nodeId, metrics);
+    }
+
+    /**
+     * Sets metrics for a client node.
+     *
+     * @param nodeId Server node ID.
+     * @param clientNodeId Client node ID.
+     * @param metrics Node metrics.
+     */
+    public void setClientMetrics(UUID nodeId, UUID clientNodeId, ClusterMetrics metrics) {
+        assert nodeId != null;
+        assert clientNodeId != null;
+        assert metrics != null;
+        assert this.metrics.containsKey(nodeId);
+
+        this.metrics.get(nodeId).addClientMetrics(clientNodeId, metrics);
+    }
+
+    /**
+     * Removes metrics for particular node from the message.
+     *
+     * @param nodeId Node ID.
+     */
+    public void removeMetrics(UUID nodeId) {
+        assert nodeId != null;
+
+        metrics.remove(nodeId);
+    }
+
+    /**
+     * Removes cache metrics for particular node from the message.
+     *
+     * @param nodeId Node ID.
+     */
+    public void removeCacheMetrics(UUID nodeId) {
+        assert nodeId != null;
+
+        cacheMetrics.remove(nodeId);
+    }
+
+    /**
+     * Gets metrics map.
+     *
+     * @return Metrics map.
+     */
+    public Map<UUID, MetricsSet> metrics() {
+        return metrics;
+    }
+
+    /**
+     * Gets cache metrics map.
+     *
+     * @return Cache metrics map.
+     */
+    public Map<UUID, Map<Integer, CacheMetrics>> cacheMetrics() {
+        return cacheMetrics;
+    }
+
+    /**
+     * @return {@code True} if this message contains metrics.
+     */
+    public boolean hasMetrics() {
+        return !metrics.isEmpty();
+    }
+
+    /**
+     * @return {@code True} this message contains cache metrics.
+     */
+    public boolean hasCacheMetrics() {
+        return !cacheMetrics.isEmpty();
+    }
+
+    /**
+     * @return {@code True} if this message contains metrics.
+     */
+    public boolean hasMetrics(UUID nodeId) {
+        assert nodeId != null;
+
+        return metrics.get(nodeId) != null;
+    }
+
+    /**
+     * @param nodeId Node ID.
+     *
+     * @return {@code True} if this message contains cache metrics for particular node.
+     */
+    public boolean hasCacheMetrics(UUID nodeId) {
+        assert nodeId != null;
+
+        return cacheMetrics.get(nodeId) != null;
+    }
+
+    /**
+     * Gets client node IDs for  particular node.
+     *
+     * @return Client node IDs.
+     */
+    public Collection<UUID> clientNodeIds() {
+        return clientNodeIds;
+    }
+
+    /**
+     * Adds client node ID.
+     *
+     * @param clientNodeId Client node ID.
+     */
+    public void addClientNodeId(UUID clientNodeId) {
+        clientNodeIds.add(clientNodeId);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean traceLogLevel() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean highPriority() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(TcpDiscoveryMetricsUpdateMessage.class, this, "super", super.toString());
+    }
+
+    /**
+     * @param nodeId Node ID.
+     * @param metrics Metrics.
+     * @return Serialized metrics.
+     */
+    private static byte[] serializeMetrics(UUID nodeId, ClusterMetrics metrics) {
+        assert nodeId != null;
+        assert metrics != null;
+
+        byte[] buf = new byte[16 + ClusterMetricsSnapshot.METRICS_SIZE];
+
+        U.longToBytes(nodeId.getMostSignificantBits(), buf, 0);
+        U.longToBytes(nodeId.getLeastSignificantBits(), buf, 8);
+
+        ClusterMetricsSnapshot.serialize(buf, 16, metrics);
+
+        return buf;
+    }
+
+    /**
+     */
+    @SuppressWarnings("PublicInnerClass")
+    public static class MetricsSet implements Externalizable {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /** Metrics. */
+        private byte[] metrics;
+
+        /** Client metrics. */
+        private Collection<byte[]> clientMetrics;
+
+        /**
+         */
+        public MetricsSet() {
+            // No-op.
+        }
+
+        /**
+         * @param metrics Metrics.
+         */
+        public MetricsSet(ClusterMetrics metrics) {
+            assert metrics != null;
+
+            this.metrics = ClusterMetricsSnapshot.serialize(metrics);
+        }
+
+        /**
+         * @return Deserialized metrics.
+         */
+        public ClusterMetrics metrics() {
+            return ClusterMetricsSnapshot.deserialize(metrics, 0);
+        }
+
+        /**
+         * @return Client metrics.
+         */
+        public Collection<T2<UUID, ClusterMetrics>> clientMetrics() {
+            return F.viewReadOnly(clientMetrics, new C1<byte[], T2<UUID, ClusterMetrics>>() {
+                @Override public T2<UUID, ClusterMetrics> apply(byte[] bytes) {
+                    UUID nodeId = new UUID(U.bytesToLong(bytes, 0), U.bytesToLong(bytes, 8));
+
+                    return new T2<>(nodeId, ClusterMetricsSnapshot.deserialize(bytes, 16));
+                }
+            });
+        }
+
+        /**
+         * @param nodeId Client node ID.
+         * @param metrics Client metrics.
+         */
+        private void addClientMetrics(UUID nodeId, ClusterMetrics metrics) {
+            assert nodeId != null;
+            assert metrics != null;
+
+            if (clientMetrics == null)
+                clientMetrics = new ArrayList<>();
+
+            clientMetrics.add(serializeMetrics(nodeId, metrics));
+        }
+
+        /** {@inheritDoc} */
+        @Override public void writeExternal(ObjectOutput out) throws IOException {
+            U.writeByteArray(out, metrics);
+
+            out.writeInt(clientMetrics != null ? clientMetrics.size() : -1);
+
+            if (clientMetrics != null) {
+                for (byte[] arr : clientMetrics)
+                    U.writeByteArray(out, arr);
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            metrics = U.readByteArray(in);
+
+            int clientMetricsSize = in.readInt();
+
+            if (clientMetricsSize >= 0) {
+                clientMetrics = new ArrayList<>(clientMetricsSize);
+
+                for (int i = 0; i < clientMetricsSize; i++)
+                    clientMetrics.add(U.readByteArray(in));
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/main/java/org/apache/ignite/spi/loadbalancing/adaptive/AdaptiveLoadBalancingSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/loadbalancing/adaptive/AdaptiveLoadBalancingSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/loadbalancing/adaptive/AdaptiveLoadBalancingSpi.java
index cfd4fc7..1a3a7fe 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/loadbalancing/adaptive/AdaptiveLoadBalancingSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/loadbalancing/adaptive/AdaptiveLoadBalancingSpi.java
@@ -97,13 +97,13 @@ import static org.apache.ignite.events.EventType.EVT_TASK_FINISHED;
  * You should tune these values based on the level of accuracy needed vs. the additional memory
  * that would be required for storing metrics.
  * <p>
- * You should also keep in mind that metrics for remote nodes are delayed (usually by the
- * heartbeat frequency). So if it is acceptable in your environment, set the heartbeat frequency
- * to be more inline with job execution time. Generally, the more often heartbeats between nodes
+ * You should also keep in mind that metrics for remote nodes are delayed (usually by the metrics
+ * update frequency). So if it is acceptable in your environment, set the metrics update frequency
+ * to be more inline with job execution time. Generally, the more often metrics update between nodes
  * are exchanged, the more precise the metrics are. However, you should keep in mind that if
- * heartbeats are exchanged too often then it may create unnecessary traffic in the network.
- * Heartbeats (or metrics update frequency) can be configured via underlying
- * {@link org.apache.ignite.spi.discovery.DiscoverySpi} used in your grid.
+ * metrics update are exchanged too often then it may create unnecessary traffic in the network.
+ * Metrics update frequency can be configured via underlying
+ * {@link org.apache.ignite.configuration.IgniteConfiguration} used in your grid.
  * <p>
  * Here is an example of how probing can be implemented to use
  * number of active and waiting jobs as probing mechanism:

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/main/resources/META-INF/classnames.properties
----------------------------------------------------------------------
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties
index 2cc83a4..bc1e534 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -1962,7 +1962,7 @@ org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAbstractMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAuthFailedMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCheckFailedMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientAckResponse
-org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientHeartbeatMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientMetricsUpdateMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientPingRequest
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientPingResponse
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientReconnectMessage
@@ -1972,9 +1972,9 @@ org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDiscardMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDuplicateIdMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHandshakeRequest
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHandshakeResponse
-org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHeartbeatMessage
-org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHeartbeatMessage$MetricsSet
-org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHeartbeatMessage$MetricsSet$1
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryMetricsUpdateMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryMetricsUpdateMessage$MetricsSet
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryMetricsUpdateMessage$MetricsSet$1
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryJoinRequestMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryLoopbackProblemMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddFinishedMessage

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/config/load/dsi-load-base.xml
----------------------------------------------------------------------
diff --git a/modules/core/src/test/config/load/dsi-load-base.xml b/modules/core/src/test/config/load/dsi-load-base.xml
index c57b5e0..7d7f2ba 100644
--- a/modules/core/src/test/config/load/dsi-load-base.xml
+++ b/modules/core/src/test/config/load/dsi-load-base.xml
@@ -48,10 +48,11 @@
 
                 <property name="ackTimeout" value="4000"/>
                 <property name="socketTimeout" value="4000"/>
-                <property name="heartbeatFrequency" value="6000"/>
             </bean>
         </property>
 
+        <property name="metricsUpdateFrequency" value="6000"/>
+
         <property name="lifecycleBeans" ref="lifecycleBeans"/>
 
         <property name="peerClassLoadingEnabled" value="false"/>

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/config/load/merge-sort-base.xml
----------------------------------------------------------------------
diff --git a/modules/core/src/test/config/load/merge-sort-base.xml b/modules/core/src/test/config/load/merge-sort-base.xml
index aba0108..44b26bb 100644
--- a/modules/core/src/test/config/load/merge-sort-base.xml
+++ b/modules/core/src/test/config/load/merge-sort-base.xml
@@ -68,6 +68,10 @@
 
         <property name="peerClassLoadingThreadPoolSize" value="100"/>
 
+        <property name="metricsUpdateFrequency" value="10000"/>
+
+        <property name="failureDetectionTimeout" value="60000"/>
+
         <!-- Discovery SPI configuration. -->
         <property name="discoverySpi">
             <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
@@ -75,9 +79,6 @@
                 <property name="socketTimeout" value="5000"/>
                 <property name="ackTimeout" value="5000"/>
 
-                <property name="heartbeatFrequency" value="10000"/>
-                <property name="maxMissedHeartbeats" value="6"/>
-
                 <property name="statisticsPrintFrequency" value="60000"/>
 
                 <property name="ipFinder">

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/config/streamer/spring-streamer-base.xml
----------------------------------------------------------------------
diff --git a/modules/core/src/test/config/streamer/spring-streamer-base.xml b/modules/core/src/test/config/streamer/spring-streamer-base.xml
index 746dd95..ddb96a7 100644
--- a/modules/core/src/test/config/streamer/spring-streamer-base.xml
+++ b/modules/core/src/test/config/streamer/spring-streamer-base.xml
@@ -66,12 +66,13 @@
             <constructor-arg value="127.0.0.1"/>
         </bean>
 
+        <property name="failureDetectionTimeout" value="45000"/>
+        <property name="metricsUpdateFrequency" value="15000"/>
+
         <bean id="discoSpi" class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
             <property name="ackTimeout" value="5000"/>
             <property name="socketTimeout" value="5000"/>
             <property name="reconnectCount" value="5"/>
-            <property name="heartbeatFrequency" value="15000"/>
-            <property name="maxMissedHeartbeats" value="3"/>
 
             <property name="ipFinder">
                 <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/GridTestJob.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/GridTestJob.java b/modules/core/src/test/java/org/apache/ignite/GridTestJob.java
index a4dbe53..3750585 100644
--- a/modules/core/src/test/java/org/apache/ignite/GridTestJob.java
+++ b/modules/core/src/test/java/org/apache/ignite/GridTestJob.java
@@ -20,6 +20,8 @@ package org.apache.ignite;
 import org.apache.ignite.compute.ComputeJobAdapter;
 import org.apache.ignite.resources.LoggerResource;
 
+import java.util.concurrent.CountDownLatch;
+
 /**
  * Test job.
  */
@@ -28,6 +30,8 @@ public class GridTestJob extends ComputeJobAdapter {
     @LoggerResource
     private IgniteLogger log;
 
+    CountDownLatch latch;
+
     /** */
     public GridTestJob() {
         // No-op.
@@ -40,10 +44,25 @@ public class GridTestJob extends ComputeJobAdapter {
         super(arg);
     }
 
+    /**
+     * @param arg Job argument.
+     */
+    public GridTestJob(String arg, CountDownLatch latch) {
+        super(arg);
+        this.latch = latch;
+    }
+
     /** {@inheritDoc} */
     @Override public String execute() {
         if (log.isDebugEnabled())
             log.debug("Executing job [job=" + this + ", arg=" + argument(0) + ']');
+        if (latch != null) {
+            try {
+                latch.await();
+            } catch (InterruptedException e) {
+                // Nothing to do
+            }
+        }
 
         return argument(0);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/GridTestTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/GridTestTask.java b/modules/core/src/test/java/org/apache/ignite/GridTestTask.java
index dbe34c6..8dc0569 100644
--- a/modules/core/src/test/java/org/apache/ignite/GridTestTask.java
+++ b/modules/core/src/test/java/org/apache/ignite/GridTestTask.java
@@ -20,6 +20,8 @@ package org.apache.ignite;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
 import org.apache.ignite.compute.ComputeJob;
 import org.apache.ignite.compute.ComputeJobResult;
 import org.apache.ignite.compute.ComputeTaskSplitAdapter;
@@ -33,6 +35,20 @@ public class GridTestTask extends ComputeTaskSplitAdapter<Object, Object> {
     @LoggerResource
     private IgniteLogger log;
 
+    /**
+     * Optional latch to wait for
+     */
+    CountDownLatch latch;
+
+    public GridTestTask (CountDownLatch latch) {
+        super();
+        this.latch = latch;
+    }
+
+    public GridTestTask() {
+        super();
+    }
+
     /** {@inheritDoc} */
     @Override public Collection<? extends ComputeJob> split(int gridSize, Object arg) {
         if (log.isDebugEnabled())
@@ -41,7 +57,7 @@ public class GridTestTask extends ComputeTaskSplitAdapter<Object, Object> {
         Collection<ComputeJob> refs = new ArrayList<>(gridSize);
 
         for (int i = 0; i < gridSize; i++)
-            refs.add(new GridTestJob(arg.toString() + i + 1));
+            refs.add(new GridTestJob(arg.toString() + i + 1, latch));
 
         return refs;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
index dafc41f..d204a39 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
@@ -87,7 +87,7 @@ public class ClusterNodeMetricsSelfTest extends GridCommonAbstractTest {
         cfg.setDiscoverySpi(spi);
 
         cfg.setCacheConfiguration();
-        cfg.setMetricsUpdateFrequency(0);
+        cfg.setMetricsUpdateFrequency(500);
 
         CacheConfiguration<Integer, Object> ccfg = defaultCacheConfiguration();
         ccfg.setName(CACHE_NAME);
@@ -173,16 +173,18 @@ public class ClusterNodeMetricsSelfTest extends GridCommonAbstractTest {
     public void testSingleTaskMetrics() throws Exception {
         Ignite ignite = grid();
 
-        ignite.compute().execute(new GridTestTask(), "testArg");
+        final CountDownLatch taskLatch = new CountDownLatch(2);
+        ignite.compute().executeAsync(new GridTestTask(taskLatch), "testArg");
 
         // Let metrics update twice.
-        final CountDownLatch latch = new CountDownLatch(2);
 
+        final CountDownLatch latch = new CountDownLatch(3);
         ignite.events().localListen(new IgnitePredicate<Event>() {
             @Override public boolean apply(Event evt) {
                 assert evt.type() == EVT_NODE_METRICS_UPDATED;
 
                 latch.countDown();
+                taskLatch.countDown();
 
                 return true;
             }
@@ -203,7 +205,7 @@ public class ClusterNodeMetricsSelfTest extends GridCommonAbstractTest {
         assert metrics.getAverageWaitingJobs() == 0;
         assert metrics.getCurrentActiveJobs() == 0;
         assert metrics.getCurrentCancelledJobs() == 0;
-        assert metrics.getCurrentJobExecuteTime() == 0;
+        assert metrics.getCurrentJobExecuteTime() > 0;
         assert metrics.getCurrentJobWaitTime() == 0;
         assert metrics.getCurrentWaitingJobs() == 0;
         assert metrics.getMaximumActiveJobs() == 1;

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityMappedTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityMappedTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityMappedTest.java
index f6f641b..7535228 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityMappedTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityMappedTest.java
@@ -54,10 +54,13 @@ public class GridAffinityMappedTest extends GridCommonAbstractTest {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
+
         disco.setIpFinder(ipFinder);
+
         cfg.setDiscoverySpi(disco);
 
+        cfg.setFailureDetectionTimeout(Integer.MAX_VALUE);
+
         if (igniteInstanceName.endsWith("1"))
             cfg.setCacheConfiguration(); // Empty cache configuration.
         else {

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityP2PSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityP2PSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityP2PSelfTest.java
index 4e4586f..216c50e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityP2PSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/GridAffinityP2PSelfTest.java
@@ -85,11 +85,12 @@ public class GridAffinityP2PSelfTest extends GridCommonAbstractTest {
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
         disco.setIpFinder(ipFinder);
 
         c.setDiscoverySpi(disco);
 
+        c.setFailureDetectionTimeout(Integer.MAX_VALUE);
+
         c.setDeploymentMode(depMode);
 
         if (igniteInstanceName.endsWith("1"))

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinitySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinitySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridAffinitySelfTest.java
index d2df1be..92933f9 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/GridAffinitySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/GridAffinitySelfTest.java
@@ -49,11 +49,12 @@ public class GridAffinitySelfTest extends GridCommonAbstractTest {
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
         disco.setIpFinder(IP_FINDER);
 
         cfg.setDiscoverySpi(disco);
 
+        cfg.setFailureDetectionTimeout(Integer.MAX_VALUE);
+
         if (igniteInstanceName.endsWith("1"))
             cfg.setClientMode(true);
         else {

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/GridCancelledJobsMetricsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridCancelledJobsMetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridCancelledJobsMetricsSelfTest.java
index 39677c5..a5d60cc 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/GridCancelledJobsMetricsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/GridCancelledJobsMetricsSelfTest.java
@@ -72,7 +72,7 @@ public class GridCancelledJobsMetricsSelfTest extends GridCommonAbstractTest {
 
         assert discoSpi instanceof TcpDiscoverySpi;
 
-        ((TcpDiscoverySpi)discoSpi).setHeartbeatFrequency(500);
+        cfg.setMetricsUpdateFrequency(500);
 
         return cfg;
     }
@@ -221,4 +221,4 @@ public class GridCancelledJobsMetricsSelfTest extends GridCommonAbstractTest {
                 tmp.onExternalCollision();
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/GridFailFastNodeFailureDetectionSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridFailFastNodeFailureDetectionSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridFailFastNodeFailureDetectionSelfTest.java
index 4d503bd..79dc81a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/GridFailFastNodeFailureDetectionSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/GridFailFastNodeFailureDetectionSelfTest.java
@@ -49,7 +49,6 @@ public class GridFailFastNodeFailureDetectionSelfTest extends GridCommonAbstract
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
         disco.setIpFinder(IP_FINDER);
-        disco.setHeartbeatFrequency(10_000);
 
         // Set parameters for fast ping failure.
         disco.setSocketTimeout(100);
@@ -57,6 +56,7 @@ public class GridFailFastNodeFailureDetectionSelfTest extends GridCommonAbstract
         disco.setReconnectCount(2);
 
         cfg.setDiscoverySpi(disco);
+        cfg.setMetricsUpdateFrequency(10_000);
 
         return cfg;
     }
@@ -129,4 +129,4 @@ public class GridFailFastNodeFailureDetectionSelfTest extends GridCommonAbstract
 
         U.invoke(comm.getClass(), comm, "simulateNodeFailure");
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/GridJobCollisionCancelSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridJobCollisionCancelSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridJobCollisionCancelSelfTest.java
index c213464..80b5599 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/GridJobCollisionCancelSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/GridJobCollisionCancelSelfTest.java
@@ -102,7 +102,7 @@ public class GridJobCollisionCancelSelfTest extends GridCommonAbstractTest {
                 // Should be exactly the same as Jobs number.
                 assert cancelCnt <= SPLIT_COUNT : "Invalid cancel count: " + cancelCnt;
 
-                // One per start and one per stop and some that come with heartbeats.
+                // One per start and one per stop and some that come with metrics update.
                 assert colResolutionCnt > SPLIT_COUNT + 1:
                     "Invalid collision resolution count: " + colResolutionCnt;
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAliveCacheSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAliveCacheSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAliveCacheSelfTest.java
index f0c50eb..1847303 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAliveCacheSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAliveCacheSelfTest.java
@@ -101,15 +101,15 @@ public class GridDiscoveryManagerAliveCacheSelfTest extends GridCommonAbstractTe
         if (clientMode && ((igniteInstanceName.charAt(igniteInstanceName.length() - 1) - '0') & 1) != 0)
             cfg.setClientMode(true);
         else
-            disc.setMaxMissedClientHeartbeats(50);
+            cfg.setClientFailureDetectionTimeout(50000);
 
-        disc.setHeartbeatFrequency(500);
         disc.setIpFinder(IP_FINDER);
         disc.setAckTimeout(1000);
         disc.setSocketTimeout(1000);
 
         cfg.setCacheConfiguration(cCfg);
         cfg.setDiscoverySpi(disc);
+        cfg.setMetricsUpdateFrequency(500);
 
         return cfg;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFailoverSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFailoverSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFailoverSelfTest.java
index ccb879e..57a2420 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFailoverSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFailoverSelfTest.java
@@ -78,13 +78,13 @@ public abstract class GridCacheAbstractFailoverSelfTest extends GridCacheAbstrac
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
         cfg.setNetworkTimeout(60_000);
+        cfg.setMetricsUpdateFrequency(30_000);
 
         TcpDiscoverySpi discoSpi = (TcpDiscoverySpi)cfg.getDiscoverySpi();
 
         discoSpi.setSocketTimeout(30_000);
         discoSpi.setAckTimeout(30_000);
         discoSpi.setNetworkTimeout(60_000);
-        discoSpi.setHeartbeatFrequency(30_000);
         discoSpi.setReconnectCount(2);
 
         ((TcpCommunicationSpi)cfg.getCommunicationSpi()).setSharedMemoryPort(-1);
@@ -386,4 +386,4 @@ public abstract class GridCacheAbstractFailoverSelfTest extends GridCacheAbstrac
     private IgniteCache<String,Integer> cache(Ignite g) {
         return g.cache(null);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractSelfTest.java
index 95f8bb8..c40d44d 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractSelfTest.java
@@ -201,9 +201,9 @@ public abstract class GridCacheAbstractSelfTest extends GridCommonAbstractTest {
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
-        TcpDiscoverySpi disco = new TcpDiscoverySpi();
+        cfg.setFailureDetectionTimeout(Integer.MAX_VALUE);
 
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
+        TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
         disco.setIpFinder(ipFinder);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManagerSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManagerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManagerSelfTest.java
index 47b9473..957828c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManagerSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccManagerSelfTest.java
@@ -51,10 +51,11 @@ public class GridCacheMvccManagerSelfTest extends GridCommonAbstractTest {
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
         disco.setIpFinder(ipFinder);
 
         cfg.setDiscoverySpi(disco);
+
+        cfg.setFailureDetectionTimeout(Integer.MAX_VALUE);
         cfg.setCacheConfiguration(cacheConfiguration());
 
         return cfg;

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractTest.java
index 688e1cc..5133f61 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractTest.java
@@ -93,17 +93,17 @@ public abstract class IgniteCacheAbstractTest extends GridCommonAbstractTest {
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi().setForceServerMode(true);
 
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
-
         disco.setIpFinder(ipFinder);
 
         if (isDebug())
             disco.setAckTimeout(Integer.MAX_VALUE);
 
-        MemoryEventStorageSpi eventSpi = new MemoryEventStorageSpi();
-        eventSpi.setExpireCount(100);
+        MemoryEventStorageSpi evtSpi = new MemoryEventStorageSpi();
+        evtSpi.setExpireCount(100);
+
+        cfg.setFailureDetectionTimeout(Integer.MAX_VALUE);
 
-        cfg.setEventStorageSpi(eventSpi);
+        cfg.setEventStorageSpi(evtSpi);
 
         cfg.setDiscoverySpi(disco);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataUpdatesFlowTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataUpdatesFlowTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataUpdatesFlowTest.java
index b76279d..e0fc205 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataUpdatesFlowTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataUpdatesFlowTest.java
@@ -147,9 +147,9 @@ public class BinaryMetadataUpdatesFlowTest extends GridCommonAbstractTest {
                 }
             };
 
-            discoSpi.setHeartbeatFrequency(1000);
-
             cfg.setDiscoverySpi(discoSpi);
+
+            cfg.setMetricsUpdateFrequency(1000);
         }
 
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
index c68c8d0..9c24073 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
@@ -158,11 +158,12 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
 
         discoSpi.setForceServerMode(forceSrvMode);
         discoSpi.setIpFinder(ipFinder);
-        discoSpi.setMaxMissedClientHeartbeats(100);
         discoSpi.setNetworkTimeout(60_000);
 
         cfg.setDiscoverySpi(discoSpi);
 
+        cfg.setClientFailureDetectionTimeout(100000);
+
         CacheConfiguration[] ccfg;
 
         if (cacheC != null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheNodeFailureAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheNodeFailureAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheNodeFailureAbstractTest.java
index e11e198..cd475fe 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheNodeFailureAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheNodeFailureAbstractTest.java
@@ -87,10 +87,9 @@ public abstract class GridCacheNodeFailureAbstractTest extends GridCommonAbstrac
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
-
         disco.setIpFinder(ipFinder);
 
+        c.setFailureDetectionTimeout(Integer.MAX_VALUE);
         c.setDiscoverySpi(disco);
 
         c.setDeploymentMode(DeploymentMode.SHARED);

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
index aaacd2d..6d7ec90 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
@@ -67,8 +67,8 @@ public class IgniteCache150ClientsTest extends GridCommonAbstractTest {
 
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setJoinTimeout(0);
-        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setMaxMissedClientHeartbeats(200);
 
+        cfg.setClientFailureDetectionTimeout(200000);
         cfg.setClientMode(!igniteInstanceName.equals(getTestIgniteInstanceName(0)));
 
         CacheConfiguration[] ccfgs = new CacheConfiguration[CACHES];

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheNearRestartRollbackSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheNearRestartRollbackSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheNearRestartRollbackSelfTest.java
index bbbcfd7..907922c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheNearRestartRollbackSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheNearRestartRollbackSelfTest.java
@@ -71,8 +71,8 @@ public class IgniteCacheNearRestartRollbackSelfTest extends GridCommonAbstractTe
         TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();
 
         discoSpi.setIpFinder(IP_FINDER);
-        discoSpi.setMaxMissedClientHeartbeats(50);
 
+        cfg.setClientFailureDetectionTimeout(50000);
         cfg.setDiscoverySpi(discoSpi);
 
         cfg.setCacheConfiguration(cacheConfiguration(igniteInstanceName));

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheColocatedTxSingleThreadedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheColocatedTxSingleThreadedSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheColocatedTxSingleThreadedSelfTest.java
index ba9f9e4..644fabd 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheColocatedTxSingleThreadedSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheColocatedTxSingleThreadedSelfTest.java
@@ -64,8 +64,8 @@ public class GridCacheColocatedTxSingleThreadedSelfTest extends IgniteTxSingleTh
         TcpDiscoverySpi spi = new TcpDiscoverySpi();
 
         spi.setIpFinder(ipFinder);
-        spi.setMaxMissedHeartbeats(Integer.MAX_VALUE);
 
+        c.setFailureDetectionTimeout(Integer.MAX_VALUE);
         c.setDiscoverySpi(spi);
 
         c.setCacheConfiguration(cc);

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadDelayedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadDelayedSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadDelayedSelfTest.java
index b9afd65..3bdce46 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadDelayedSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadDelayedSelfTest.java
@@ -93,8 +93,8 @@ public class GridCacheDhtPreloadDelayedSelfTest extends GridCommonAbstractTest {
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
         disco.setIpFinder(ipFinder);
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
 
+        c.setFailureDetectionTimeout(Integer.MAX_VALUE);
         c.setDiscoverySpi(disco);
         c.setCacheConfiguration(cc);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadMessageCountTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadMessageCountTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadMessageCountTest.java
index f223c9b..af7aff4 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadMessageCountTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtPreloadMessageCountTest.java
@@ -66,8 +66,8 @@ public class GridCacheDhtPreloadMessageCountTest extends GridCommonAbstractTest
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
         disco.setIpFinder(ipFinder);
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
 
+        c.setFailureDetectionTimeout(Integer.MAX_VALUE);
         c.setDiscoverySpi(disco);
         c.setCacheConfiguration(cc);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
index 591858a..6fdb354 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
@@ -82,7 +82,7 @@ public class IgniteCacheAtomicProtocolTest extends GridCommonAbstractTest {
         cfg.setConsistentId(gridName);
 
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
-        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setMaxMissedClientHeartbeats(1000);
+        cfg.setClientFailureDetectionTimeout(Integer.MAX_VALUE);
 
         TestRecordingCommunicationSpi commSpi = new TestRecordingCommunicationSpi();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiGetSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiGetSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiGetSelfTest.java
index d041ae2..61cc580 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiGetSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiGetSelfTest.java
@@ -82,8 +82,8 @@ public class GridCacheNearMultiGetSelfTest extends GridCommonAbstractTest {
         TcpDiscoverySpi spi = new TcpDiscoverySpi();
 
         spi.setIpFinder(ipFinder);
-        spi.setMaxMissedHeartbeats(Integer.MAX_VALUE);
 
+        c.setFailureDetectionTimeout(Integer.MAX_VALUE);
         c.setDiscoverySpi(spi);
 
         c.setCacheConfiguration(cc);

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiNodeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiNodeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiNodeSelfTest.java
index e4ed64b..a6b8d79 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiNodeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearMultiNodeSelfTest.java
@@ -106,8 +106,8 @@ public class GridCacheNearMultiNodeSelfTest extends GridCommonAbstractTest {
         TcpDiscoverySpi spi = new TcpDiscoverySpi();
 
         spi.setIpFinder(ipFinder);
-        spi.setMaxMissedHeartbeats(Integer.MAX_VALUE);
 
+        cfg.setFailureDetectionTimeout(Integer.MAX_VALUE);
         cfg.setDiscoverySpi(spi);
 
         CacheConfiguration cacheCfg = defaultCacheConfiguration();

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSingleThreadedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSingleThreadedSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSingleThreadedSelfTest.java
index 62e11a7..ef472a1 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSingleThreadedSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSingleThreadedSelfTest.java
@@ -63,8 +63,8 @@ public class GridCachePartitionedTxSingleThreadedSelfTest extends IgniteTxSingle
         TcpDiscoverySpi spi = new TcpDiscoverySpi();
 
         spi.setIpFinder(ipFinder);
-        spi.setMaxMissedHeartbeats(Integer.MAX_VALUE);
 
+        c.setFailureDetectionTimeout(Integer.MAX_VALUE);
         c.setDiscoverySpi(spi);
 
         c.setCacheConfiguration(cc);

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQuerySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQuerySelfTest.java
index 62adb77..7349a4e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQuerySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQuerySelfTest.java
@@ -74,12 +74,12 @@ public class IndexingSpiQuerySelfTest extends TestCase {
         TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
-        disco.setMaxMissedHeartbeats(Integer.MAX_VALUE);
-
         disco.setIpFinder(ipFinder);
 
         cfg.setDiscoverySpi(disco);
 
+        cfg.setFailureDetectionTimeout(Integer.MAX_VALUE);
+
         return cfg;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceClientNodeTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceClientNodeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceClientNodeTest.java
index 08f2709..1d6cbae 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceClientNodeTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceClientNodeTest.java
@@ -42,10 +42,11 @@ public class GridServiceClientNodeTest extends GridCommonAbstractTest {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
-        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setMaxMissedClientHeartbeats(30);
-        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setHeartbeatFrequency(1000);
+
+        cfg.setClientFailureDetectionTimeout(30000);
 
         cfg.setClientMode(client);
+        cfg.setMetricsUpdateFrequency(1000);
 
         return cfg;
     }
@@ -150,4 +151,4 @@ public class GridServiceClientNodeTest extends GridCommonAbstractTest {
 
         assertTrue(latch.await(5000, TimeUnit.MILLISECONDS));
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesAbstractLoadTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesAbstractLoadTest.java b/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesAbstractLoadTest.java
index 6fb7cdf..fedb4ac 100644
--- a/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesAbstractLoadTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesAbstractLoadTest.java
@@ -41,11 +41,6 @@ public abstract class GridSingleSplitsNewNodesAbstractLoadTest extends GridCommo
      */
     protected abstract DiscoverySpi getDiscoverySpi(IgniteConfiguration cfg);
 
-    /**
-     * @return Discovery spi heartbeat frequency.
-     */
-    protected abstract int getHeartbeatFrequency();
-
     /** {@inheritDoc} */
     @SuppressWarnings("ConstantConditions")
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
@@ -120,11 +115,11 @@ public abstract class GridSingleSplitsNewNodesAbstractLoadTest extends GridCommo
 
                                 startGrid(idx);
 
-                                Thread.sleep(getHeartbeatFrequency() * 3);
+                                Thread.sleep(grid(idx).configuration().getMetricsUpdateFrequency() * 3);
 
                                 stopGrid(idx);
 
-                                Thread.sleep(getHeartbeatFrequency() * 3);
+                                Thread.sleep(grid(idx).configuration().getMetricsUpdateFrequency() * 3);
                             }
                         }
                         catch (Throwable e) {
@@ -175,4 +170,4 @@ public abstract class GridSingleSplitsNewNodesAbstractLoadTest extends GridCommo
             G.stop(getTestIgniteInstanceName(), false);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesMulticastLoadTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesMulticastLoadTest.java b/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesMulticastLoadTest.java
index 6d2c7aa..77142dc 100644
--- a/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesMulticastLoadTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/loadtests/direct/newnodes/GridSingleSplitsNewNodesMulticastLoadTest.java
@@ -33,13 +33,6 @@ public class GridSingleSplitsNewNodesMulticastLoadTest extends GridSingleSplitsN
 
         assert discoSpi instanceof TcpDiscoverySpi : "Wrong default SPI implementation.";
 
-        ((TcpDiscoverySpi)discoSpi).setHeartbeatFrequency(getHeartbeatFrequency());
-
         return discoSpi;
     }
-
-    /** {@inheritDoc} */
-    @Override protected int getHeartbeatFrequency() {
-        return 3000;
-    }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java
index a126b4b..d2878e0 100644
--- a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PSameClassLoaderSelfTest.java
@@ -71,8 +71,8 @@ public class GridP2PSameClassLoaderSelfTest extends GridCommonAbstractTest {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
         cfg.setDeploymentMode(depMode);
+        cfg.setMetricsUpdateFrequency(500);
 
-        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setHeartbeatFrequency(500);
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(FINDER);
 
         cfg.setCacheConfiguration();

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java
index daa3ec0..fa1a2ae 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java
@@ -219,11 +219,11 @@ public abstract class AbstractDiscoverySelfTest<T extends IgniteSpi> extends Gri
     }
 
     /**
-     * Tests whether local node heartbeats cause METRICS_UPDATE event.
+     * Tests whether local node metrics update cause METRICS_UPDATE event.
      *
      * @throws Exception If test failed.
      */
-    public void testLocalHeartbeat() throws Exception {
+    public void testLocalMetricsUpdate() throws Exception {
         AtomicInteger[] locUpdCnts = new AtomicInteger[getSpiCount()];
 
         int i = 0;
@@ -231,7 +231,7 @@ public abstract class AbstractDiscoverySelfTest<T extends IgniteSpi> extends Gri
         for (final DiscoverySpi spi : spis) {
             final AtomicInteger spiCnt = new AtomicInteger(0);
 
-            DiscoverySpiListener locHeartbeatLsnr = new DiscoverySpiListener() {
+            DiscoverySpiListener locMetricsUpdateLsnr = new DiscoverySpiListener() {
                 /** {@inheritDoc} */
                 @Override public void onLocalNodeInitialized(ClusterNode locNode) {
                     // No-op.
@@ -249,17 +249,16 @@ public abstract class AbstractDiscoverySelfTest<T extends IgniteSpi> extends Gri
 
             locUpdCnts[i] = spiCnt;
 
-            spi.setListener(locHeartbeatLsnr);
+            spi.setListener(locMetricsUpdateLsnr);
 
             i++;
         }
 
-        // Sleep fro 3 Heartbeats.
+        // Sleep for 3 metrics update.
         Thread.sleep(getMaxDiscoveryTime() * 3);
 
-        for (AtomicInteger cnt : locUpdCnts) {
-            assert cnt.get() > 1 : "One of the SPIs did not get at least 2 METRICS_UPDATE events from local node";
-        }
+        for (AtomicInteger cnt : locUpdCnts)
+            assertTrue("One of the SPIs did not get at least 2 METRICS_UPDATE events from local node", cnt.get() > 1);
     }
 
     /**
@@ -491,9 +490,9 @@ public abstract class AbstractDiscoverySelfTest<T extends IgniteSpi> extends Gri
         }
 
         for (IgniteTestResources rscrs : spiRsrcs) {
-            MBeanServer mBeanServer = rscrs.getMBeanServer();
+            MBeanServer mBeanSrv = rscrs.getMBeanServer();
 
-            mBeanServer.unregisterMBean(new ObjectName(HTTP_ADAPTOR_MBEAN_NAME));
+            mBeanSrv.unregisterMBean(new ObjectName(HTTP_ADAPTOR_MBEAN_NAME));
 
             rscrs.stopThreads();
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/6998785a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiFailureTimeoutSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiFailureTimeoutSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiFailureTimeoutSelfTest.java
index a0545f5..689ac72 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiFailureTimeoutSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiFailureTimeoutSelfTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.spi.discovery.tcp;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.Socket;
 import java.net.SocketTimeoutException;
 import java.util.ArrayList;
@@ -28,15 +29,18 @@ import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.events.DiscoveryEvent;
 import org.apache.ignite.events.Event;
 import org.apache.ignite.internal.util.typedef.G;
 import org.apache.ignite.internal.util.typedef.X;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAbstractMessage;
 import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryPingRequest;
 import org.jetbrains.annotations.Nullable;
 
@@ -53,8 +57,14 @@ public class TcpClientDiscoverySpiFailureTimeoutSelfTest extends TcpClientDiscov
     private final static long FAILURE_THRESHOLD = 10_000;
 
     /** */
+    private final static long CLIENT_FAILURE_THRESHOLD = 30_000;
+
+    /** Failure detection timeout for nodes configuration. */
     private static long failureThreshold = FAILURE_THRESHOLD;
 
+    /** Client failure detection timeout for nodes configuration. */
+    private static long clientFailureThreshold = CLIENT_FAILURE_THRESHOLD;
+
     /** */
     private static boolean useTestSpi;
 
@@ -64,6 +74,11 @@ public class TcpClientDiscoverySpiFailureTimeoutSelfTest extends TcpClientDiscov
     }
 
     /** {@inheritDoc} */
+    @Override protected long clientFailureDetectionTimeout() {
+        return clientFailureThreshold;
+    }
+
+    /** {@inheritDoc} */
     @Override protected long failureDetectionTimeout() {
         return failureThreshold;
     }
@@ -74,6 +89,11 @@ public class TcpClientDiscoverySpiFailureTimeoutSelfTest extends TcpClientDiscov
     }
 
     /** {@inheritDoc} */
+    @Override protected long awaitClientTime() {
+        return clientFailureDetectionTimeout() + FAILURE_AWAIT_TIME;
+    }
+
+    /** {@inheritDoc} */
     @Override protected TcpDiscoverySpi getDiscoverySpi() {
         return useTestSpi ? new TestTcpDiscoverySpi2() : super.getDiscoverySpi();
     }
@@ -88,12 +108,12 @@ public class TcpClientDiscoverySpiFailureTimeoutSelfTest extends TcpClientDiscov
         checkNodes(1, 1);
 
         assertTrue(((TcpDiscoverySpi)(G.ignite("server-0").configuration().getDiscoverySpi())).
-                failureDetectionTimeoutEnabled());
+            failureDetectionTimeoutEnabled());
         assertEquals(failureDetectionTimeout(),
             ((TcpDiscoverySpi)(G.ignite("server-0").configuration().getDiscoverySpi())).failureDetectionTimeout());
 
         assertTrue(((TcpDiscoverySpi)(G.ignite("client-0").configuration().getDiscoverySpi())).
-                failureDetectionTimeoutEnabled());
+            failureDetectionTimeoutEnabled());
         assertEquals(failureDetectionTimeout(),
             ((TcpDiscoverySpi)(G.ignite("client-0").configuration().getDiscoverySpi())).failureDetectionTimeout());
     }
@@ -127,6 +147,123 @@ public class TcpClientDiscoverySpiFailureTimeoutSelfTest extends TcpClientDiscov
     }
 
     /**
+     * Test failure detection time between server and client if client fail with failure detection.
+     *
+     * @throws Exception in case of error.
+     */
+    public void testFailureTimeoutServerClient() throws Exception {
+        failureThreshold = 3000;
+        clientFailureThreshold = 2000;
+
+        try {
+            startServerNodes(1);
+
+            startClientNodes(1);
+
+            checkNodes(1, 1);
+
+            Ignite srvNode = G.ignite("server-0");
+            final TcpDiscoverySpi srvSpi = (TcpDiscoverySpi) srvNode.configuration().getDiscoverySpi();
+
+            Ignite clientNode = G.ignite("client-0");
+            final TcpDiscoverySpi clientSpi = (TcpDiscoverySpi)clientNode.configuration().getDiscoverySpi();
+
+            long failureTime = U.currentTimeMillis();
+
+            final long[] failureDetectTime = new long[1];
+            final CountDownLatch latch = new CountDownLatch(1);
+
+            clientSpi.simulateNodeFailure();
+
+            srvNode.events().localListen(new IgnitePredicate<Event>() {
+                @Override public boolean apply(Event evt) {
+                    failureDetectTime[0] = U.currentTimeMillis();
+
+                    latch.countDown();
+
+                    return true;
+                }
+            }, EVT_NODE_FAILED);
+
+            assertTrue("Can't get node failure event", latch.await(15000, TimeUnit.MILLISECONDS));
+
+            long detectTime = failureDetectTime[0] - failureTime;
+
+            assertTrue("Client node failure detected too fast: " + detectTime + "ms",
+                detectTime > clientFailureThreshold - 200);
+            assertTrue("Client node failure detected too slow:  " + detectTime + "ms",
+                detectTime < clientFailureThreshold + 5000);
+        }
+        finally {
+            failureThreshold = FAILURE_THRESHOLD;
+            clientFailureThreshold = CLIENT_FAILURE_THRESHOLD;
+        }
+    }
+
+    /**
+     * Test failure detection time between servers with failure detection.
+     *
+     * @throws Exception in case of error.
+     */
+    public void testFailureTimeout3Server() throws Exception {
+        failureThreshold = 1000;
+        clientFailureThreshold = 10000;
+        useTestSpi = true;
+
+        try {
+            startServerNodes(3);
+
+            checkNodes(3, 0);
+
+            Ignite srv0 = G.ignite("server-0");
+            final TestTcpDiscoverySpi2 spi0 = (TestTcpDiscoverySpi2)srv0.configuration().getDiscoverySpi();
+
+            final Ignite srv1 = G.ignite("server-1");
+            final TestTcpDiscoverySpi2 spi1 = (TestTcpDiscoverySpi2)srv1.configuration().getDiscoverySpi();
+
+            Ignite srv2 = G.ignite("server-2");
+            final TestTcpDiscoverySpi2 spi2 = (TestTcpDiscoverySpi2)srv2.configuration().getDiscoverySpi();
+
+            long failureTime = U.currentTimeMillis();
+
+            final AtomicLong failureDetectTime = new AtomicLong();
+            final CountDownLatch latch = new CountDownLatch(2);
+
+            spi1.writeToSocketDelay = 2000;
+
+            for (Ignite srv : new Ignite[]{srv0, srv2}) {
+                srv.events().localListen(new IgnitePredicate<Event>() {
+                    @Override public boolean apply(Event evt) {
+                        DiscoveryEvent evt0 = (DiscoveryEvent)evt;
+
+                        assertEquals(srv1.cluster().localNode().id(), evt0.eventNode().id());
+
+                        failureDetectTime.compareAndSet(0, U.currentTimeMillis());
+
+                        latch.countDown();
+
+                        return true;
+                    }
+                }, EVT_NODE_FAILED);
+            }
+
+            assertTrue("Can't get node failure event", latch.await(15000, TimeUnit.MILLISECONDS));
+
+            long detectTime = failureDetectTime.get() - failureTime;
+
+            assertTrue("Server node failure detected too fast: " + detectTime + "ms",
+                detectTime > failureThreshold - 100);
+            assertTrue("Server node failure detected too slow:  " + detectTime + "ms",
+                detectTime < clientFailureThreshold);
+        }
+        finally {
+            failureThreshold = FAILURE_THRESHOLD;
+            clientFailureThreshold = CLIENT_FAILURE_THRESHOLD;
+            useTestSpi = false;
+        }
+    }
+
+    /**
      * @throws Exception in case of error.
      */
     private void checkFailureThresholdWorkability() throws Exception {
@@ -288,15 +425,114 @@ public class TcpClientDiscoverySpiFailureTimeoutSelfTest extends TcpClientDiscov
      */
     private static class TestTcpDiscoverySpi2 extends TcpDiscoverySpi {
         /** */
-        private long readDelay;
+        private volatile long readDelay;
+
+        private volatile long writeToSocketDelay;
 
         /** */
         private Exception err;
 
+        /**  */
+        @Override protected void writeToSocket(
+            Socket sock,
+            TcpDiscoveryAbstractMessage msg,
+            byte[] data,
+            long timeout
+        ) throws IOException {
+            if (writeToSocketDelay > 0) {
+                try {
+                    U.dumpStack(log, "Before sleep [msg=" + msg +
+                        ", arrLen=" + (data != null ? data.length : "n/a") + ']');
+
+                    Thread.sleep(writeToSocketDelay);
+                }
+                catch (InterruptedException e) {
+                    // Nothing to do.
+                }
+            }
+
+            if (sock.getSoTimeout() >= writeToSocketDelay)
+                super.writeToSocket(sock, msg, data, timeout);
+            else
+                throw new SocketTimeoutException("Write to socket delay timeout exception.");
+        }
+
+        /**  */
+        @Override protected void writeToSocket(Socket sock,
+            OutputStream out,
+            TcpDiscoveryAbstractMessage msg,
+            long timeout) throws IOException, IgniteCheckedException {
+            if (writeToSocketDelay > 0) {
+                try {
+                    U.dumpStack(log, "Before sleep [msg=" + msg + ']');
+
+                    Thread.sleep(writeToSocketDelay);
+                }
+                catch (InterruptedException e) {
+                    // Nothing to do.
+                }
+            }
+
+            if (sock.getSoTimeout() >= writeToSocketDelay)
+                super.writeToSocket(sock, out, msg, timeout);
+            else
+                throw new SocketTimeoutException("Write to socket delay timeout exception.");
+        }
+
+        /**  */
+        @Override protected void writeToSocket(
+            Socket sock,
+            TcpDiscoveryAbstractMessage msg,
+            long timeout
+        ) throws IOException, IgniteCheckedException {
+            if (writeToSocketDelay > 0) {
+                try {
+                    U.dumpStack(log, "Before sleep [msg=" + msg + ']');
+
+                    Thread.sleep(writeToSocketDelay);
+                }
+                catch (InterruptedException e) {
+                    // Nothing to do.
+                }
+            }
+
+            if (sock.getSoTimeout() >= writeToSocketDelay)
+                super.writeToSocket(sock, msg, timeout);
+            else
+                throw new SocketTimeoutException("Write to socket delay timeout exception.");
+        }
+
+        /**  */
+        @Override protected void writeToSocket(
+            TcpDiscoveryAbstractMessage msg,
+            Socket sock,
+            int res,
+            long timeout
+        ) throws IOException {
+            if (writeToSocketDelay > 0) {
+                try {
+                    U.dumpStack(log, "Before sleep [msg=" + msg + ']');
+
+                    Thread.sleep(writeToSocketDelay);
+                }
+                catch (InterruptedException e) {
+                    // Nothing to do.
+                }
+            }
+
+            if (sock.getSoTimeout() >= writeToSocketDelay)
+                super.writeToSocket(msg, sock, res, timeout);
+            else
+                throw new SocketTimeoutException("Write to socket delay timeout exception.");
+        }
+
         /** {@inheritDoc} */
         @Override protected <T> T readMessage(Socket sock, @Nullable InputStream in, long timeout)
             throws IOException, IgniteCheckedException {
-            if (readDelay < failureDetectionTimeout()) {
+            long currTimeout = getLocalNode().isClient() ?
+                clientFailureDetectionTimeout() : failureDetectionTimeout();
+
+            if (readDelay < currTimeout) {
                 try {
                     return super.readMessage(sock, in, timeout);
                 }
@@ -329,6 +565,7 @@ public class TcpClientDiscoverySpiFailureTimeoutSelfTest extends TcpClientDiscov
          */
         private void reset() {
             readDelay = 0;
+            writeToSocketDelay = 0;
             err = null;
         }
     }