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 2015/07/15 16:12:03 UTC
[2/3] incubator-ignite git commit: ignite-752: reimplemented pingNode
with failure detection threshold
ignite-752: reimplemented pingNode with failure detection threshold
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/567aec10
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/567aec10
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/567aec10
Branch: refs/heads/ignite-752
Commit: 567aec1029a6302016e3fe189f5a973014b54d94
Parents: 1a7421e
Author: Denis Magda <dm...@gridgain.com>
Authored: Wed Jul 15 12:29:49 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Jul 15 12:29:49 2015 +0300
----------------------------------------------------------------------
.../configuration/IgniteConfiguration.java | 25 ++++-
.../org/apache/ignite/spi/IgniteSpiAdapter.java | 103 ++++++++++++++++++
.../ignite/spi/discovery/tcp/ServerImpl.java | 30 +++++-
.../spi/discovery/tcp/TcpDiscoverySpi.java | 108 +++++++++++--------
4 files changed, 217 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/567aec10/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java
index 2d36c7a..b3d2bfc 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java
@@ -189,6 +189,9 @@ public class IgniteConfiguration {
/** Default value for cache sanity check enabled flag. */
public static final boolean DFLT_CACHE_SANITY_CHECK_ENABLED = true;
+ /** Default failure detection threshold used by DiscoverySpi and CommunicationSpi in millis. */
+ public static final int DFLT_FAILURE_DETECTION_THRESHOLD = 10_000;
+
/** Optional grid name. */
private String gridName;
@@ -366,6 +369,9 @@ public class IgniteConfiguration {
/** Port number range for time server. */
private int timeSrvPortRange = DFLT_TIME_SERVER_PORT_RANGE;
+ /** Failure detection threshold used by DiscoverySpi and CommunicationSpi. */
+ private int failureDetectionThreshold = DFLT_FAILURE_DETECTION_THRESHOLD;
+
/** Property names to include into node attributes. */
private String[] includeProps;
@@ -444,7 +450,7 @@ public class IgniteConfiguration {
clockSyncSamples = cfg.getClockSyncSamples();
deployMode = cfg.getDeploymentMode();
discoStartupDelay = cfg.getDiscoveryStartupDelay();
- pubPoolSize = cfg.getPublicThreadPoolSize();
+ failureDetectionThreshold = cfg.getFailureDetectionThreshold();
ggHome = cfg.getIgniteHome();
ggWork = cfg.getWorkDirectory();
gridName = cfg.getGridName();
@@ -474,6 +480,7 @@ public class IgniteConfiguration {
p2pMissedCacheSize = cfg.getPeerClassLoadingMissedResourcesCacheSize();
p2pPoolSize = cfg.getPeerClassLoadingThreadPoolSize();
pluginCfgs = cfg.getPluginConfigurations();
+ pubPoolSize = cfg.getPublicThreadPoolSize();
segChkFreq = cfg.getSegmentCheckFrequency();
segPlc = cfg.getSegmentationPolicy();
segResolveAttempts = cfg.getSegmentationResolveAttempts();
@@ -1629,6 +1636,22 @@ public class IgniteConfiguration {
}
/**
+ * TODO: IGNITE-752
+ * @return
+ */
+ public int getFailureDetectionThreshold() {
+ return failureDetectionThreshold;
+ }
+
+ /**
+ * TODO: IGNITE-752
+ * @param failureDetectionThreshold
+ */
+ public void setFailureDetectionThreshold(int failureDetectionThreshold) {
+ this.failureDetectionThreshold = failureDetectionThreshold;
+ }
+
+ /**
* Should return fully configured load balancing SPI implementation. If not provided,
* {@link RoundRobinLoadBalancingSpi} will be used.
*
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/567aec10/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java b/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java
index 5e557bd..82ed3d0 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java
@@ -19,6 +19,7 @@ package org.apache.ignite.spi;
import org.apache.ignite.*;
import org.apache.ignite.cluster.*;
+import org.apache.ignite.configuration.*;
import org.apache.ignite.events.*;
import org.apache.ignite.internal.*;
import org.apache.ignite.internal.managers.communication.*;
@@ -35,6 +36,7 @@ import org.jetbrains.annotations.*;
import javax.management.*;
import java.io.*;
+import java.net.*;
import java.text.*;
import java.util.*;
@@ -73,6 +75,15 @@ public abstract class IgniteSpiAdapter implements IgniteSpi, IgniteSpiManagement
/** Discovery listener. */
private GridLocalEventListener paramsLsnr;
+ /** Failure detection threshold will not be used usage switch. */
+ private boolean failureDetectionThresholdEnabled = true;
+
+ /**
+ * Failure detection threshold. Initialized with the value of
+ * {@link IgniteConfiguration#getFailureDetectionThreshold()}.
+ */
+ private long failureDetectionThreshold;
+
/**
* Creates new adapter and initializes it from the current (this) class.
* SPI name will be initialized to the simple name of the class
@@ -194,6 +205,15 @@ public abstract class IgniteSpiAdapter implements IgniteSpi, IgniteSpiManagement
spiCtx = new GridDummySpiContext(locNode, true, spiCtx);
}
+ /** {@inheritDoc} */
+ @Override public void spiStart(@Nullable String gridName) throws IgniteSpiException {
+ if (!failureDetectionThresholdEnabled) {
+ failureDetectionThreshold = ignite.configuration().getFailureDetectionThreshold();
+
+ assertParameter(failureDetectionThreshold > 0, "failureDetectionThreshold > 0");
+ }
+ }
+
/**
* Inject ignite instance.
*/
@@ -560,6 +580,89 @@ public abstract class IgniteSpiAdapter implements IgniteSpi, IgniteSpiManagement
}
/**
+ * TODO: IGNITE-752
+ * @param dfltTimeout
+ * @return
+ */
+ public long firstNetOperationTimeout(long dfltTimeout) {
+ return !failureDetectionThresholdEnabled ? dfltTimeout : failureDetectionThreshold;
+ }
+
+ /**
+ * TODO: IGNITE-752
+ * @param curTimeout
+ * @param lastOperStartTime
+ * @param dfltTimeout
+ * @return
+ * @throws IOException
+ */
+ public long nextNetOperationTimeout(long curTimeout, long lastOperStartTime, long dfltTimeout)
+ throws NetOperationTimeoutException {
+ if (!failureDetectionThresholdEnabled)
+ return dfltTimeout;
+
+ long timeLeft = curTimeout - lastOperStartTime;
+
+ if (timeLeft <= 0)
+ throw new NetOperationTimeoutException("Network operation timed out. Increase failure detection threshold" +
+ " using IgniteConfiguration.setFailureDetectionThreshold() or set SPI specific timeouts manually." +
+ " Current failure detection threshold: " + failureDetectionThreshold);
+
+ return timeLeft;
+ }
+
+ /**
+ * TODO: IGNITE-752
+ * @param e
+ * @return
+ */
+ public boolean checkFailureDetectionThresholdReached(Exception e) {
+ if (!failureDetectionThresholdEnabled)
+ return false;
+
+ return e instanceof NetOperationTimeoutException || e instanceof SocketTimeoutException ||
+ X.hasCause(e, NetOperationTimeoutException.class, SocketException.class);
+ }
+
+ /**
+ * TODO: IGNITE-752
+ * @param enabled
+ */
+ public void failureDetectionThresholdEnabled(boolean enabled) {
+ failureDetectionThresholdEnabled = enabled;
+ }
+
+ /**
+ * TODO: IGNITE-752
+ * @return
+ */
+ public boolean failureDetectionThresholdEnabled() {
+ return failureDetectionThresholdEnabled;
+ }
+
+ /**
+ * TODO: IGNITE-752
+ * @return
+ */
+ public long failureDetectionThreshold() {
+ return failureDetectionThreshold;
+ }
+
+
+ /**
+ * TODO: IGNITE-752
+ */
+ public static class NetOperationTimeoutException extends IgniteCheckedException {
+ /**
+ * Constructor.
+ * @param msg Error message.
+ */
+ public NetOperationTimeoutException(String msg) {
+ super(msg);
+ }
+ }
+
+ /**
* Temporarily SPI context.
*/
private class GridDummySpiContext implements IgniteSpiContext {
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/567aec10/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
----------------------------------------------------------------------
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 d51293e..9dd565c 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
@@ -50,6 +50,7 @@ import static org.apache.ignite.internal.IgniteNodeAttributes.*;
import static org.apache.ignite.spi.IgnitePortProtocol.*;
import static org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.*;
import static org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessage.*;
+import static org.apache.ignite.spi.IgniteSpiAdapter.NetOperationTimeoutException;
/**
*
@@ -508,18 +509,32 @@ class ServerImpl extends TcpDiscoveryImpl {
try {
Socket sock = null;
- for (int i = 0; i < spi.reconCnt; i++) {
+ long timeout = 0;
+ long lastOperStartTs = 0;
+
+ int reconCnt = 0;
+
+ while (true) {
try {
if (addr.isUnresolved())
addr = new InetSocketAddress(InetAddress.getByName(addr.getHostName()), addr.getPort());
- long tstamp = U.currentTimeMillis();
+ timeout = lastOperStartTs == 0 ? spi.firstNetOperationTimeout(spi.getSocketTimeout()) :
+ spi.nextNetOperationTimeout(timeout, lastOperStartTs, spi.getSocketTimeout());
+
+ long tstamp = lastOperStartTs = U.currentTimeMillis();
+
+ sock = spi.openSocket(addr, timeout);
- sock = spi.openSocket(addr);
+ timeout = spi.nextNetOperationTimeout(timeout, lastOperStartTs, spi.getSocketTimeout());
+ lastOperStartTs = U.currentTimeMillis();
- spi.writeToSocket(sock, new TcpDiscoveryPingRequest(locNodeId, clientNodeId));
+ spi.writeToSocket(sock, new TcpDiscoveryPingRequest(locNodeId, clientNodeId), timeout);
- TcpDiscoveryPingResponse res = spi.readMessage(sock, null, spi.netTimeout);
+ timeout = spi.nextNetOperationTimeout(timeout, lastOperStartTs, spi.getNetworkTimeout());
+ lastOperStartTs = U.currentTimeMillis();
+
+ TcpDiscoveryPingResponse res = spi.readMessage(sock, null, timeout);
if (locNodeId.equals(res.creatorNodeId())) {
if (log.isDebugEnabled())
@@ -541,6 +556,11 @@ class ServerImpl extends TcpDiscoveryImpl {
errs = new ArrayList<>();
errs.add(e);
+
+ if (spi.checkFailureDetectionThresholdReached(e))
+ break;
+ else if (!spi.failureDetectionThresholdEnabled() && ++reconCnt == spi.getReconnectCount())
+ break;
}
finally {
U.closeQuiet(sock);
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/567aec10/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
index 4240d6a..e5d5cd6 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
@@ -327,9 +327,6 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
/** */
private boolean forceSrvMode;
- /** User manually set one of the failure detection timeouts. Failure detection threshold will not be used. */
- private boolean manualFailureDetectionSetup;
-
/** {@inheritDoc} */
@Override public String getSpiState() {
return impl.getSpiState();
@@ -502,7 +499,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
@IgniteSpiConfiguration(optional = true)
public TcpDiscoverySpi setReconnectCount(int reconCnt) {
this.reconCnt = reconCnt;
- manualFailureDetectionSetup = true;
+
+ failureDetectionThresholdEnabled(false);
return this;
}
@@ -529,7 +527,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
@IgniteSpiConfiguration(optional = true)
public TcpDiscoverySpi setMaxAckTimeout(long maxAckTimeout) {
this.maxAckTimeout = maxAckTimeout;
- manualFailureDetectionSetup = true;
+
+ failureDetectionThresholdEnabled(false);
return this;
}
@@ -702,7 +701,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
@IgniteSpiConfiguration(optional = true)
public TcpDiscoverySpi setSocketTimeout(long sockTimeout) {
this.sockTimeout = sockTimeout;
- manualFailureDetectionSetup = true;
+
+ failureDetectionThresholdEnabled(false);
return this;
}
@@ -720,7 +720,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
@IgniteSpiConfiguration(optional = true)
public TcpDiscoverySpi setAckTimeout(long ackTimeout) {
this.ackTimeout = ackTimeout;
- manualFailureDetectionSetup = true;
+
+ failureDetectionThresholdEnabled(false);
return this;
}
@@ -735,7 +736,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
@IgniteSpiConfiguration(optional = true)
public TcpDiscoverySpi setNetworkTimeout(long netTimeout) {
this.netTimeout = netTimeout;
- manualFailureDetectionSetup = true;
+
+ failureDetectionThresholdEnabled(false);
return this;
}
@@ -1101,10 +1103,12 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
/**
* @param sockAddr Remote address.
+ * @param timeout Socket opening timeout.
* @return Opened socket.
* @throws IOException If failed.
*/
- protected Socket openSocket(InetSocketAddress sockAddr) throws IOException {
+ protected Socket openSocket(InetSocketAddress sockAddr, long timeout) throws IOException,
+ NetOperationTimeoutException {
assert sockAddr != null;
InetSocketAddress resolved = sockAddr.isUnresolved() ?
@@ -1120,9 +1124,13 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
sock.setTcpNoDelay(true);
- sock.connect(resolved, (int)sockTimeout);
+ long startTs = U.currentTimeMillis();
+
+ sock.connect(resolved, (int)timeout);
+
+ timeout = nextNetOperationTimeout(timeout, startTs, sockTimeout);
- writeToSocket(sock, U.IGNITE_HEADER);
+ writeToSocket(sock, U.IGNITE_HEADER, timeout);
return sock;
}
@@ -1132,14 +1140,16 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
*
* @param sock Socket.
* @param data Raw data to write.
+ * @param timeout Socket write timeout.
* @throws IOException If IO failed or write timed out.
*/
@SuppressWarnings("ThrowFromFinallyBlock")
- protected void writeToSocket(Socket sock, byte[] data) throws IOException {
+ private void writeToSocket(Socket sock, byte[] data, long timeout) throws IOException {
assert sock != null;
assert data != null;
- SocketTimeoutObject obj = new SocketTimeoutObject(sock, U.currentTimeMillis() + sockTimeout);
+ //SocketTimeoutObject obj = new SocketTimeoutObject(sock, U.currentTimeMillis() + sockTimeout);
+ SocketTimeoutObject obj = new SocketTimeoutObject(sock, U.currentTimeMillis() + timeout);
addTimeoutObject(obj);
@@ -1175,11 +1185,13 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
*
* @param sock Socket.
* @param msg Message.
+ * @param timeout Socket write timeout.
* @throws IOException If IO failed or write timed out.
* @throws IgniteCheckedException If marshalling failed.
*/
- protected void writeToSocket(Socket sock, TcpDiscoveryAbstractMessage msg) throws IOException, IgniteCheckedException {
- writeToSocket(sock, msg, new GridByteArrayOutputStream(8 * 1024)); // 8K.
+ protected void writeToSocket(Socket sock, TcpDiscoveryAbstractMessage msg, long timeout)
+ throws IOException, IgniteCheckedException {
+ writeToSocket(sock, msg, new GridByteArrayOutputStream(8 * 1024), timeout); // 8K.
}
/**
@@ -1192,8 +1204,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
* @throws IgniteCheckedException If marshalling failed.
*/
@SuppressWarnings("ThrowFromFinallyBlock")
- protected void writeToSocket(Socket sock, TcpDiscoveryAbstractMessage msg, GridByteArrayOutputStream bout)
- throws IOException, IgniteCheckedException {
+ protected void writeToSocket(Socket sock, TcpDiscoveryAbstractMessage msg, GridByteArrayOutputStream bout,
+ long timeout) throws IOException, IgniteCheckedException {
assert sock != null;
assert msg != null;
assert bout != null;
@@ -1201,7 +1213,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
// Marshall message first to perform only write after.
marsh.marshal(msg, bout);
- SocketTimeoutObject obj = new SocketTimeoutObject(sock, U.currentTimeMillis() + sockTimeout);
+ SocketTimeoutObject obj = new SocketTimeoutObject(sock, U.currentTimeMillis() + timeout);
addTimeoutObject(obj);
@@ -1548,39 +1560,43 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
/** {@inheritDoc} */
@Override public void spiStart(@Nullable String gridName) throws IgniteSpiException {
- if (!forceSrvMode && (Boolean.TRUE.equals(ignite.configuration().isClientMode()))) {
- if (ackTimeout == 0)
- ackTimeout = DFLT_ACK_TIMEOUT_CLIENT;
+ super.spiStart(gridName);
- if (sockTimeout == 0)
- sockTimeout = DFLT_SOCK_TIMEOUT_CLIENT;
+ if (!failureDetectionThresholdEnabled()) {
+ if (!forceSrvMode && (Boolean.TRUE.equals(ignite.configuration().isClientMode()))) {
+ if (ackTimeout == 0)
+ ackTimeout = DFLT_ACK_TIMEOUT_CLIENT;
- impl = new ClientImpl(this);
+ if (sockTimeout == 0)
+ sockTimeout = DFLT_SOCK_TIMEOUT_CLIENT;
- ctxInitLatch.countDown();
- }
- else {
- if (ackTimeout == 0)
- ackTimeout = DFLT_ACK_TIMEOUT;
+ impl = new ClientImpl(this);
+
+ ctxInitLatch.countDown();
+ } else {
+ if (ackTimeout == 0)
+ ackTimeout = DFLT_ACK_TIMEOUT;
- if (sockTimeout == 0)
- sockTimeout = DFLT_SOCK_TIMEOUT;
+ if (sockTimeout == 0)
+ sockTimeout = DFLT_SOCK_TIMEOUT;
- impl = new ServerImpl(this);
+ impl = new ServerImpl(this);
+ }
+
+ assertParameter(netTimeout > 0, "networkTimeout > 0");
+ assertParameter(sockTimeout > 0, "sockTimeout > 0");
+ assertParameter(ackTimeout > 0, "ackTimeout > 0");
+ assertParameter(maxAckTimeout > ackTimeout, "maxAckTimeout > ackTimeout");
+ assertParameter(reconCnt > 0, "reconnectCnt > 0");
}
assertParameter(ipFinder != null, "ipFinder != null");
assertParameter(hbFreq > 0, "heartbeatFreq > 0");
- assertParameter(netTimeout > 0, "networkTimeout > 0");
- assertParameter(sockTimeout > 0, "sockTimeout > 0");
- assertParameter(ackTimeout > 0, "ackTimeout > 0");
assertParameter(ipFinderCleanFreq > 0, "ipFinderCleanFreq > 0");
assertParameter(locPort > 1023, "localPort > 1023");
assertParameter(locPortRange >= 0, "localPortRange >= 0");
assertParameter(locPort + locPortRange <= 0xffff, "locPort + locPortRange <= 0xffff");
- assertParameter(maxAckTimeout > ackTimeout, "maxAckTimeout > ackTimeout");
- assertParameter(reconCnt > 0, "reconnectCnt > 0");
assertParameter(maxMissedHbs > 0, "maxMissedHeartbeats > 0");
assertParameter(maxMissedClientHbs > 0, "maxMissedClientHeartbeats > 0");
assertParameter(threadPri > 0, "threadPri > 0");
@@ -1598,11 +1614,17 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
log.debug(configInfo("localPort", locPort));
log.debug(configInfo("localPortRange", locPortRange));
log.debug(configInfo("threadPri", threadPri));
- log.debug(configInfo("networkTimeout", netTimeout));
- log.debug(configInfo("sockTimeout", sockTimeout));
- log.debug(configInfo("ackTimeout", ackTimeout));
- log.debug(configInfo("maxAckTimeout", maxAckTimeout));
- log.debug(configInfo("reconnectCount", reconCnt));
+
+ if (!failureDetectionThresholdEnabled()) {
+ log.debug(configInfo("networkTimeout", netTimeout));
+ log.debug(configInfo("sockTimeout", sockTimeout));
+ log.debug(configInfo("ackTimeout", ackTimeout));
+ log.debug(configInfo("maxAckTimeout", maxAckTimeout));
+ log.debug(configInfo("reconnectCount", reconCnt));
+ }
+ else
+ log.debug(configInfo("failureDetectionThreshold", failureDetectionThreshold()));
+
log.debug(configInfo("ipFinder", ipFinder));
log.debug(configInfo("ipFinderCleanFreq", ipFinderCleanFreq));
log.debug(configInfo("heartbeatFreq", hbFreq));
@@ -1611,7 +1633,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T
}
// Warn on odd network timeout.
- if (netTimeout < 3000)
+ if (!failureDetectionThresholdEnabled() && netTimeout < 3000)
U.warn(log, "Network timeout is too low (at least 3000 ms recommended): " + netTimeout);
registerMBean(gridName, this, TcpDiscoverySpiMBean.class);