From 392274ee5d079a22d1c5c8010d0c101cbc462867 Mon Sep 17 00:00:00 2001 From: Denis Magda Date: Wed, 1 Jul 2015 16:54:58 +0300 Subject: [PATCH 1/4] ignite-752: implemented --- .../ignite/configuration/IgniteConfiguration.java | 44 ++++++++ .../spi/communication/tcp/TcpCommunicationSpi.java | 48 ++++++--- .../ignite/spi/discovery/tcp/TcpDiscoverySpi.java | 119 ++++++++++++--------- 3 files changed, 148 insertions(+), 63 deletions(-) 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..d1d55ee 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 @@ -108,6 +108,12 @@ public class IgniteConfiguration { /** Default message send retries count. */ public static final int DFLT_SEND_RETRY_CNT = 3; + /** Default communication timeout for network related operations in SPI. Value is 5000ms. */ + public static final long DFLT_SPI_COMMUNICATION_TIMEOUT = 5000; + + /** Default communication timeout for network related operations in SPI in client mode. Value is 5000ms. */ + public static final long DFLT_SPI_COMMUNICATION_TIMEOUT_CLIENT = 5000; + /** Default number of clock sync samples. */ public static final int DFLT_CLOCK_SYNC_SAMPLES = 8; @@ -258,6 +264,9 @@ public class IgniteConfiguration { /** Maximum network requests timeout. */ private long netTimeout = DFLT_NETWORK_TIMEOUT; + /* SPI communication timeout. */ + private Long spiCommTimeout; + /** Interval between message send retries. */ private long sndRetryDelay = DFLT_SEND_RETRY_DELAY; @@ -468,6 +477,7 @@ public class IgniteConfiguration { metricsUpdateFreq = cfg.getMetricsUpdateFrequency(); mgmtPoolSize = cfg.getManagementThreadPoolSize(); netTimeout = cfg.getNetworkTimeout(); + spiCommTimeout = cfg.getSpiCommunicationTimeout(); nodeId = cfg.getNodeId(); p2pEnabled = cfg.isPeerClassLoadingEnabled(); p2pLocClsPathExcl = cfg.getPeerClassLoadingLocalClassPathExclude(); @@ -1176,6 +1186,40 @@ public class IgniteConfiguration { } /** + * Sets maximum timeout for most network related operations of {@link TcpDiscoverySpi} and + * {@link TcpCommunicationSpi}. + * + * In case of {@link TcpDiscoverySpi} this communication timeout is used as default for socket timeout, + * network timeout and message acknowledgement timeout. Basing on this timeout default values are calculated + * for {@link TcpDiscoverySpi} heartbeat frequency and maximum message acknowledgement timeout. + * + * In case of {@link TcpCommunicationSpi} this timeout is set as default for socket connection timeout and + * used for maximum socket connection timeout calculation. + * + * @param spiCommTimeout SPI communication timeout. + * @return {@code this} for chaining. + */ + public IgniteConfiguration setSpiCommunicationTimeout(long spiCommTimeout) { + this.spiCommTimeout = spiCommTimeout; + + return this; + } + + /** + * Gets SPI communication used as default for most network related operations of {@link TcpDiscoverySpi} and + * {@link TcpCommunicationSpi}. + * + * If the timeout is not explicitly set, then either {@link #DFLT_SPI_COMMUNICATION_TIMEOUT} or + * {@link #DFLT_SPI_COMMUNICATION_TIMEOUT_CLIENT} is used depending on whether a node is run on server or cliend + * mode. + * + * @return Timeout value or {@code null} if the value has not been set explicitly. + */ + public Long getSpiCommunicationTimeout() { + return spiCommTimeout; + } + + /** * Interval in milliseconds between message send retries. *

* If not provided, then default value diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java index addf243d..ce6882c 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java @@ -173,12 +173,6 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter /** Default socket send and receive buffer size. */ public static final int DFLT_SOCK_BUF_SIZE = 32 * 1024; - /** Default connection timeout (value is 5000ms). */ - public static final long DFLT_CONN_TIMEOUT = 5000; - - /** Default Maximum connection timeout (value is 600,000ms). */ - public static final long DFLT_MAX_CONN_TIMEOUT = 10 * 60 * 1000; - /** Default reconnect attempts count (value is 10). */ public static final int DFLT_RECONNECT_CNT = 10; @@ -634,10 +628,10 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter private long idleConnTimeout = DFLT_IDLE_CONN_TIMEOUT; /** Connect timeout. */ - private long connTimeout = DFLT_CONN_TIMEOUT; + private Long connTimeout; /** Maximum connect timeout. */ - private long maxConnTimeout = DFLT_MAX_CONN_TIMEOUT; + private Long maxConnTimeout; /** Reconnect attempts count. */ @SuppressWarnings({"FieldAccessedSynchronizedAndUnsynchronized"}) @@ -963,7 +957,7 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter *

* {@code 0} is interpreted as infinite timeout. *

- * If not provided, default value is {@link #DFLT_CONN_TIMEOUT}. + * If not provided, default value is {@link IgniteConfiguration#getSpiCommunicationTimeout()}. * * @param connTimeout Connect timeout. */ @@ -974,7 +968,13 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter /** {@inheritDoc} */ @Override public long getConnectTimeout() { - return connTimeout; + if (connTimeout != null) + return connTimeout; + + if (ignite != null && ignite.configuration().getSpiCommunicationTimeout() != null) + return ignite.configuration().getSpiCommunicationTimeout(); + + return IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; } /** @@ -985,7 +985,8 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter *

* {@code 0} is interpreted as infinite timeout. *

- * If not provided, default value is {@link #DFLT_MAX_CONN_TIMEOUT}. + * If not provided, default value is calculated in a way that connection timeout will be doubled and used at least + * four times before failing. * * @param maxConnTimeout Maximum connect timeout. */ @@ -996,7 +997,10 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter /** {@inheritDoc} */ @Override public long getMaxConnectTimeout() { - return maxConnTimeout; + if (maxConnTimeout != null) + return maxConnTimeout; + + return defaultMaxConnectTimeout(); } /** @@ -1309,6 +1313,15 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter @Override public void spiStart(String gridName) throws IgniteSpiException { assert locHost != null; + if (connTimeout == null) + connTimeout = ignite.configuration().getSpiCommunicationTimeout() != null ? + ignite.configuration().getSpiCommunicationTimeout() : + IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; + + if (maxConnTimeout == null) + // connTimeout will be doubled at least four times before failing. Using geometric progression formula. + maxConnTimeout = defaultMaxConnectTimeout(); + // Start SPI start stopwatch. startStopwatch(); @@ -2020,7 +2033,7 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter long rcvCnt = -1; try { - ch.socket().connect(addr, (int)connTimeout); + ch.socket().connect(addr, connTimeout.intValue()); rcvCnt = safeHandshake(ch, recoveryDesc, node.id(), connTimeout0); @@ -2348,6 +2361,15 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter } /** + * Calculates default value for max connect timeout. + * + * @return Max connect timeout. + */ + private long defaultMaxConnectTimeout() { + return getConnectTimeout() * (1 << 4); + } + + /** * @param msg Error message. * @param e Exception. */ 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 7663fe6..764ec92 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 @@ -157,6 +157,9 @@ import java.util.concurrent.atomic.*; @DiscoverySpiOrderSupport(true) @DiscoverySpiHistorySupport(true) public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, TcpDiscoverySpiMBean { + /** */ + private static final double HEARTBEAT_DIVIDER = 2.5; + /** Node attribute that is mapped to node's external addresses (value is disc.tcp.ext-addrs). */ public static final String ATTR_EXT_ADDRS = "disc.tcp.ext-addrs"; @@ -169,30 +172,12 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T /** Default timeout for joining topology (value is 0). */ public static final long DFLT_JOIN_TIMEOUT = 0; - /** Default network timeout in milliseconds (value is 5000ms). */ - public static final long DFLT_NETWORK_TIMEOUT = 5000; - /** Default value for thread priority (value is 10). */ public static final int DFLT_THREAD_PRI = 10; - /** Default heartbeat messages issuing frequency (value is 2000ms). */ - public static final long DFLT_HEARTBEAT_FREQ = 2000; - /** Default size of topology snapshots history. */ public static final int DFLT_TOP_HISTORY_SIZE = 1000; - /** Default socket operations timeout in milliseconds (value is 5000ms). */ - public static final long DFLT_SOCK_TIMEOUT = 5000; - - /** Default timeout for receiving message acknowledgement in milliseconds (value is 5000ms). */ - public static final long DFLT_ACK_TIMEOUT = 5000; - - /** Default socket operations timeout in milliseconds (value is 5000ms). */ - public static final long DFLT_SOCK_TIMEOUT_CLIENT = 5000; - - /** Default timeout for receiving message acknowledgement in milliseconds (value is 5000ms). */ - public static final long DFLT_ACK_TIMEOUT_CLIENT = 5000; - /** Default reconnect attempts count (value is 10). */ public static final int DFLT_RECONNECT_CNT = 10; @@ -208,9 +193,6 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T /** Default statistics print frequency in milliseconds (value is 0ms). */ public static final long DFLT_STATS_PRINT_FREQ = 0; - /** Maximum ack timeout value for receiving message acknowledgement in milliseconds (value is 600,000ms). */ - public static final long DFLT_MAX_ACK_TIMEOUT = 10 * 60 * 1000; - /** Local address. */ protected String locAddr; @@ -221,13 +203,13 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T protected TcpDiscoveryIpFinder ipFinder; /** Socket operations timeout. */ - protected long sockTimeout; // Must be initialized in the constructor of child class. + protected Long sockTimeout; // Must be initialized in the constructor of child class. /** Message acknowledgement timeout. */ - protected long ackTimeout; // Must be initialized in the constructor of child class. + protected Long ackTimeout; // Must be initialized in the constructor of child class. /** Network timeout. */ - protected long netTimeout = DFLT_NETWORK_TIMEOUT; + protected Long netTimeout; /** Join timeout. */ @SuppressWarnings("RedundantFieldInitialization") @@ -237,7 +219,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T protected int threadPri = DFLT_THREAD_PRI; /** Heartbeat messages issuing frequency. */ - protected long hbFreq = DFLT_HEARTBEAT_FREQ; + protected Long hbFreq; /** Size of topology snapshots history. */ protected int topHistSize = DFLT_TOP_HISTORY_SIZE; @@ -290,7 +272,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T protected long statsPrintFreq = DFLT_STATS_PRINT_FREQ; /** Maximum message acknowledgement timeout. */ - protected long maxAckTimeout = DFLT_MAX_ACK_TIMEOUT; + protected Long maxAckTimeout; /** Max heartbeats count node can miss without initiating status check. */ protected int maxMissedHbs = DFLT_MAX_MISSED_HEARTBEATS; @@ -505,7 +487,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T /** {@inheritDoc} */ @Override public long getMaxAckTimeout() { - return maxAckTimeout; + return maxAckTimeout != null ? maxAckTimeout : defaultMaxAckTimeout(); } /** @@ -516,7 +498,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * timeout will be increased. If no acknowledgement is received and {@code maxAckTimeout} * is reached, then the process of message sending is considered as failed. *

- * If not specified, default is {@link #DFLT_MAX_ACK_TIMEOUT}. + * If not specified, default is calculated in a way that message acknowledgement timeout will be doubled and used + * at least four times before failing. *

* Affected server nodes only. * @@ -690,7 +673,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * Note that when running Ignite on Amazon EC2, socket timeout must be set to a value * significantly greater than the default (e.g. to {@code 30000}). *

- * If not specified, default is {@link #DFLT_SOCK_TIMEOUT} or {@link #DFLT_SOCK_TIMEOUT_CLIENT}. + * If not specified, default is {@link IgniteConfiguration#getSpiCommunicationTimeout()}. * * @param sockTimeout Socket connection timeout. */ @@ -707,7 +690,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * If acknowledgement is not received within this timeout, sending is considered as failed * and SPI tries to repeat message sending. *

- * If not specified, default is {@link #DFLT_ACK_TIMEOUT} or {@link #DFLT_ACK_TIMEOUT_CLIENT}. + * If not specified, default is {@link IgniteConfiguration#getSpiCommunicationTimeout()}. * * @param ackTimeout Acknowledgement timeout. */ @@ -719,13 +702,16 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T } /** + * Deprecated, use {@link IgniteConfiguration#setSpiCommunicationTimeout(long)} instead. + * * Sets maximum network timeout to use for network operations. *

- * If not specified, default is {@link #DFLT_NETWORK_TIMEOUT}. + * If not specified, default is {@link IgniteConfiguration#getSpiCommunicationTimeout()}. * * @param netTimeout Network timeout. */ @IgniteSpiConfiguration(optional = true) + @Deprecated public TcpDiscoverySpi setNetworkTimeout(long netTimeout) { this.netTimeout = netTimeout; @@ -776,7 +762,8 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * Sets delay between issuing of heartbeat messages. SPI sends heartbeat messages * in configurable time interval to other nodes to notify them about its state. *

- * If not provided, default value is {@link #DFLT_HEARTBEAT_FREQ}. + * If not provided, default value is {@link IgniteConfiguration#getSpiCommunicationTimeout()} divided by two and a + * half. * * @param hbFreq Heartbeat frequency in milliseconds. */ @@ -927,17 +914,17 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T /** {@inheritDoc} */ @Override public long getSocketTimeout() { - return sockTimeout; + return sockTimeout != null ? sockTimeout : defaultSpiCommunicationTimeout(); } /** {@inheritDoc} */ @Override public long getAckTimeout() { - return ackTimeout; + return ackTimeout != null ? ackTimeout : defaultSpiCommunicationTimeout(); } /** {@inheritDoc} */ @Override public long getNetworkTimeout() { - return netTimeout; + return netTimeout != null ? netTimeout : defaultSpiCommunicationTimeout(); } /** {@inheritDoc} */ @@ -947,7 +934,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T /** {@inheritDoc} */ @Override public long getHeartbeatFrequency() { - return hbFreq; + return hbFreq != null ? hbFreq : (long)(defaultSpiCommunicationTimeout() / HEARTBEAT_DIVIDER); } /** {@inheritDoc} */ @@ -1112,7 +1099,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T sock.setTcpNoDelay(true); - sock.connect(resolved, (int)sockTimeout); + sock.connect(resolved, sockTimeout.intValue()); writeToSocket(sock, U.IGNITE_HEADER); @@ -1540,26 +1527,31 @@ 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; + long commTimeout = defaultSpiCommunicationTimeout(); + + if (ackTimeout == null) + ackTimeout = commTimeout; + + if (sockTimeout == null) + sockTimeout = commTimeout; + + if (netTimeout == null) + netTimeout = commTimeout; + + if (hbFreq == null) + hbFreq = (long)(commTimeout / HEARTBEAT_DIVIDER); - if (sockTimeout == 0) - sockTimeout = DFLT_SOCK_TIMEOUT_CLIENT; + if (maxAckTimeout == null) + // ackTimeout will be doubled at least four times before failing. Using geometric progression formula. + maxAckTimeout = defaultMaxAckTimeout(); + if (!forceSrvMode && (Boolean.TRUE.equals(ignite.configuration().isClientMode()))) { impl = new ClientImpl(this); ctxInitLatch.countDown(); } - else { - if (ackTimeout == 0) - ackTimeout = DFLT_ACK_TIMEOUT; - - if (sockTimeout == 0) - sockTimeout = DFLT_SOCK_TIMEOUT; - + else impl = new ServerImpl(this); - } assertParameter(ipFinder != null, "ipFinder != null"); assertParameter(hbFreq > 0, "heartbeatFreq > 0"); @@ -1764,6 +1756,33 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T } /** + * Default SPI communication timeout. + * + * @return SPI communication timeout. + */ + private long defaultSpiCommunicationTimeout() { + if (ignite == null) + return IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; + + if (ignite().configuration().getSpiCommunicationTimeout() != null) + return ignite().configuration().getSpiCommunicationTimeout(); + + if (!forceSrvMode && (Boolean.TRUE.equals(ignite.configuration().isClientMode()))) + return IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT_CLIENT; + else + return IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; + } + + /** + * Default max ack timeout. + * + * @return Max acknowledgement timeout. + */ + private long defaultMaxAckTimeout() { + return getAckTimeout() * (1 << 4); + } + + /** * Socket timeout object. */ private class SocketTimeoutObject implements IgniteSpiTimeoutObject { -- 1.9.5.msysgit.0 From 6b37a9e9619629df895d2f7b7d69403084a29fb7 Mon Sep 17 00:00:00 2001 From: Denis Magda Date: Wed, 1 Jul 2015 16:57:00 +0300 Subject: [PATCH 2/4] ignite-752: implemented --- .../org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java index ce6882c..c9976af 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java @@ -2368,7 +2368,7 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter private long defaultMaxConnectTimeout() { return getConnectTimeout() * (1 << 4); } - + /** * @param msg Error message. * @param e Exception. -- 1.9.5.msysgit.0 From dd076a0899f464e331fab8aa27643be542259937 Mon Sep 17 00:00:00 2001 From: Denis Magda Date: Thu, 2 Jul 2015 10:19:48 +0300 Subject: [PATCH 3/4] ignite-752: improvements --- .../ignite/configuration/IgniteConfiguration.java | 3 + .../spi/communication/tcp/TcpCommunicationSpi.java | 28 ++-- .../ignite/spi/discovery/tcp/ClientImpl.java | 2 +- .../ignite/spi/discovery/tcp/ServerImpl.java | 2 +- .../ignite/spi/discovery/tcp/TcpDiscoverySpi.java | 12 +- .../IgniteConfigurationValidationSelfTest.java | 141 +++++++++++++++++++++ .../tcp/TcpClientDiscoverySpiSelfTest.java | 4 +- .../testsuites/IgniteKernalSelfTestSuite.java | 1 + 8 files changed, 177 insertions(+), 16 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/IgniteConfigurationValidationSelfTest.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 d1d55ee..3fec5a4 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 @@ -1196,6 +1196,9 @@ public class IgniteConfiguration { * In case of {@link TcpCommunicationSpi} this timeout is set as default for socket connection timeout and * used for maximum socket connection timeout calculation. * + * Refer to {@link TcpDiscoverySpi} and {@link TcpCommunicationSpi} if advanced network related settings are + * required. + * * @param spiCommTimeout SPI communication timeout. * @return {@code this} for chaining. */ diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java index c9976af..bf3fa46 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java @@ -179,6 +179,9 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter /** Default message queue limit per connection (for incoming and outgoing . */ public static final int DFLT_MSG_QUEUE_LIMIT = GridNioServer.DFLT_SEND_QUEUE_LIMIT; + /** Default max connection timeout can't be bigger than this value. */ + public static final long DFLT_MAX_CONN_TIMEOUT_LIMIT = 20000; + /** * Default count of selectors for TCP server equals to * {@code "Math.min(4, Runtime.getRuntime().availableProcessors())"}. @@ -1243,6 +1246,15 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter @Override public Map getNodeAttributes() throws IgniteSpiException { nodeIdMsg = new NodeIdMessage(getLocalNodeId()); + if (connTimeout == null) + connTimeout = ignite.configuration().getSpiCommunicationTimeout() != null ? + ignite.configuration().getSpiCommunicationTimeout() : + IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; + + if (maxConnTimeout == null) + // connTimeout will be doubled at least four times before failing. Using geometric progression formula. + maxConnTimeout = defaultMaxConnectTimeout(); + assertParameter(locPort > 1023, "locPort > 1023"); assertParameter(locPort <= 0xffff, "locPort < 0xffff"); assertParameter(locPortRange >= 0, "locPortRange >= 0"); @@ -1313,15 +1325,6 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter @Override public void spiStart(String gridName) throws IgniteSpiException { assert locHost != null; - if (connTimeout == null) - connTimeout = ignite.configuration().getSpiCommunicationTimeout() != null ? - ignite.configuration().getSpiCommunicationTimeout() : - IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; - - if (maxConnTimeout == null) - // connTimeout will be doubled at least four times before failing. Using geometric progression formula. - maxConnTimeout = defaultMaxConnectTimeout(); - // Start SPI start stopwatch. startStopwatch(); @@ -2366,7 +2369,12 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter * @return Max connect timeout. */ private long defaultMaxConnectTimeout() { - return getConnectTimeout() * (1 << 4); + long maxTimeout = getConnectTimeout() * (1 << 4); + + if (maxTimeout > DFLT_MAX_CONN_TIMEOUT_LIMIT) + maxTimeout = DFLT_MAX_CONN_TIMEOUT_LIMIT; + + return maxTimeout; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java index 04276d2..4d4e6f6 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java @@ -982,7 +982,7 @@ class ClientImpl extends TcpDiscoveryImpl { try { oldTimeout = sock.getSoTimeout(); - sock.setSoTimeout((int)spi.netTimeout); + sock.setSoTimeout(spi.netTimeout.intValue()); InputStream in = new BufferedInputStream(sock.getInputStream()); 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 720ce3a..2f20cd1 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 @@ -4044,7 +4044,7 @@ class ServerImpl extends TcpDiscoveryImpl { int timeout = sock.getSoTimeout(); - sock.setSoTimeout((int)spi.netTimeout); + sock.setSoTimeout(spi.netTimeout.intValue()); for (IgniteInClosure connLsnr : spi.incomeConnLsnrs) connLsnr.apply(sock); 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 764ec92..bfab4ce 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 @@ -193,6 +193,9 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T /** Default statistics print frequency in milliseconds (value is 0ms). */ public static final long DFLT_STATS_PRINT_FREQ = 0; + /** Default max ack timeout can't be bigger than this value. */ + public static final long DFLT_MAX_ACK_TIMEOUT_LIMIT = 20000; + /** Local address. */ protected String locAddr; @@ -499,7 +502,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * is reached, then the process of message sending is considered as failed. *

* If not specified, default is calculated in a way that message acknowledgement timeout will be doubled and used - * at least four times before failing. + * at least four times before failing and must be no bigger than {@link #DFLT_MAX_ACK_TIMEOUT_LIMIT}. *

* Affected server nodes only. * @@ -1779,7 +1782,12 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * @return Max acknowledgement timeout. */ private long defaultMaxAckTimeout() { - return getAckTimeout() * (1 << 4); + long maxAck = getAckTimeout() * (1 << 4); + + if (maxAck > DFLT_MAX_ACK_TIMEOUT_LIMIT) + maxAck = DFLT_MAX_ACK_TIMEOUT_LIMIT; + + return maxAck; } /** diff --git a/modules/core/src/test/java/org/apache/ignite/internal/IgniteConfigurationValidationSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/IgniteConfigurationValidationSelfTest.java new file mode 100644 index 0000000..dccdccc --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/IgniteConfigurationValidationSelfTest.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal; + +import org.apache.ignite.*; +import org.apache.ignite.configuration.*; +import org.apache.ignite.spi.communication.tcp.*; +import org.apache.ignite.spi.discovery.tcp.*; +import org.apache.ignite.testframework.junits.common.*; + +import java.lang.reflect.*; + +/** + * Ignite configuration validation test. + */ +public class IgniteConfigurationValidationSelfTest extends GridCommonAbstractTest { + /** */ + private static final long SPI_COMM_TIMEOUT = 2000; + + /** + * @throws Exception In case of error. + */ + public void testDefaultSpiCommunicationTimeouts() throws Exception { + IgniteConfiguration cfg = new IgniteConfiguration(); + + cfg.setDiscoverySpi(new TcpDiscoverySpi()); + cfg.setCommunicationSpi(new TcpCommunicationSpi()); + + assertNull(cfg.getSpiCommunicationTimeout()); + + cfg.setSpiCommunicationTimeout(SPI_COMM_TIMEOUT); + + checkTimeouts(cfg, IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT); + } + + /** + * @throws Exception In case of error. + */ + public void testDefaultCommunicationTimeoutsAfterNodeStart() throws Exception { + IgniteConfiguration cfg = new IgniteConfiguration(); + + cfg.setGridLogger(getTestResources().getLogger()); + cfg.setSpiCommunicationTimeout(SPI_COMM_TIMEOUT); + + Ignite node = startGrid(getTestGridName(), cfg); + + try { + checkTimeouts(node.configuration(), SPI_COMM_TIMEOUT); + } + finally { + stopGrid(); + } + } + + /** + * @throws Exception + */ + public void testAdvancedTimeoutsAfterNodeStart() throws Exception { + IgniteConfiguration cfg = super.getConfiguration(); + + cfg.setSpiCommunicationTimeout(SPI_COMM_TIMEOUT); + + TcpDiscoverySpi discSpi = (TcpDiscoverySpi)cfg.getDiscoverySpi(); + + discSpi.setSocketTimeout(2500); + discSpi.setHeartbeatFrequency(1200); + + TcpCommunicationSpi commSpi = (TcpCommunicationSpi)cfg.getCommunicationSpi(); + + commSpi.setConnectTimeout(6000); + + Ignite node = startGrid(getTestGridName(), cfg); + + try { + discSpi = (TcpDiscoverySpi)node.configuration().getDiscoverySpi(); + + assertEquals(2500, discSpi.getSocketTimeout()); + assertEquals(SPI_COMM_TIMEOUT, discSpi.getNetworkTimeout()); + assertEquals(SPI_COMM_TIMEOUT, discSpi.getAckTimeout()); + assertEquals(1200, discSpi.getHeartbeatFrequency()); + + assert discSpi.getMaxAckTimeout() > discSpi.getAckTimeout() && discSpi.getMaxAckTimeout() + <= TcpDiscoverySpi.DFLT_MAX_ACK_TIMEOUT_LIMIT; + + commSpi = (TcpCommunicationSpi)node.configuration().getCommunicationSpi(); + + assertEquals(6000, commSpi.getConnectTimeout()); + + assert commSpi.getMaxConnectTimeout() > commSpi.getConnectTimeout() && commSpi.getMaxConnectTimeout() <= + TcpCommunicationSpi.DFLT_MAX_CONN_TIMEOUT_LIMIT; + } + finally { + stopGrid(); + } + } + + /** + * Checks timeouts. + * + * @param cfg Ignite configuration. + * @param expectedTimeout Expected timeout value. + * @throws Exception In case of error. + */ + private void checkTimeouts(IgniteConfiguration cfg, long expectedTimeout) throws Exception { + TcpDiscoverySpi discSpi = (TcpDiscoverySpi)cfg.getDiscoverySpi(); + + assertEquals(expectedTimeout, discSpi.getSocketTimeout()); + assertEquals(expectedTimeout, discSpi.getNetworkTimeout()); + assertEquals(expectedTimeout, discSpi.getAckTimeout()); + + Field field = TcpDiscoverySpi.class.getDeclaredField("HEARTBEAT_DIVIDER"); + field.setAccessible(true); + + assertEquals((long)(expectedTimeout / field.getDouble(null)), discSpi.getHeartbeatFrequency()); + + assert discSpi.getMaxAckTimeout() > discSpi.getAckTimeout() && discSpi.getMaxAckTimeout() + <= TcpDiscoverySpi.DFLT_MAX_ACK_TIMEOUT_LIMIT; + + TcpCommunicationSpi commSpi = (TcpCommunicationSpi)cfg.getCommunicationSpi(); + + assertEquals(expectedTimeout, commSpi.getConnectTimeout()); + + assert commSpi.getMaxConnectTimeout() > commSpi.getConnectTimeout() && commSpi.getMaxConnectTimeout() <= + TcpCommunicationSpi.DFLT_MAX_CONN_TIMEOUT_LIMIT; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiSelfTest.java index ec6a526..9986539 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiSelfTest.java @@ -100,7 +100,7 @@ public class TcpClientDiscoverySpiSelfTest extends GridCommonAbstractTest { private long joinTimeout = TcpDiscoverySpi.DFLT_JOIN_TIMEOUT; /** */ - private long netTimeout = TcpDiscoverySpi.DFLT_NETWORK_TIMEOUT; + private long netTimeout = IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; /** */ private boolean longSockTimeouts; @@ -193,7 +193,7 @@ public class TcpClientDiscoverySpiSelfTest extends GridCommonAbstractTest { nodeId = null; clientIpFinder = null; joinTimeout = TcpDiscoverySpi.DFLT_JOIN_TIMEOUT; - netTimeout = TcpDiscoverySpi.DFLT_NETWORK_TIMEOUT; + netTimeout = IgniteConfiguration.DFLT_SPI_COMMUNICATION_TIMEOUT; longSockTimeouts = false; assert G.allGrids().isEmpty(); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java index 575f1fa..74181d8 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java @@ -84,6 +84,7 @@ public class IgniteKernalSelfTestSuite extends TestSuite { suite.addTestSuite(GridUpdateNotifierSelfTest.class); suite.addTestSuite(GridLocalEventListenerSelfTest.class); suite.addTestSuite(IgniteTopologyPrintFormatSelfTest.class); + suite.addTestSuite(IgniteConfigurationValidationSelfTest.class); // Managed Services. suite.addTestSuite(GridServiceProcessorSingleNodeSelfTest.class); -- 1.9.5.msysgit.0 From 22ee6e858c7e1dbd897b0b100c86dd4293a4471f Mon Sep 17 00:00:00 2001 From: Denis Magda Date: Thu, 2 Jul 2015 10:51:35 +0300 Subject: [PATCH 4/4] ignite-752: bugs fixing --- .../ignite/spi/communication/tcp/TcpCommunicationSpi.java | 11 +++++++---- .../org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java index bf3fa46..05bb951 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java @@ -180,7 +180,7 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter public static final int DFLT_MSG_QUEUE_LIMIT = GridNioServer.DFLT_SEND_QUEUE_LIMIT; /** Default max connection timeout can't be bigger than this value. */ - public static final long DFLT_MAX_CONN_TIMEOUT_LIMIT = 20000; + public static final long DFLT_MAX_CONN_TIMEOUT_LIMIT = 30000; /** * Default count of selectors for TCP server equals to @@ -989,7 +989,9 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter * {@code 0} is interpreted as infinite timeout. *

* If not provided, default value is calculated in a way that connection timeout will be doubled and used at least - * four times before failing. + * four times before failing. The default value, calculated this way, may be corrected to be no bigger than + * {@link #DFLT_MAX_CONN_TIMEOUT_LIMIT}. If {@link #DFLT_MAX_CONN_TIMEOUT_LIMIT} is smaller than connect + * timeout than max connect timeout will be set to some value bigger than connect timeout. * * @param maxConnTimeout Maximum connect timeout. */ @@ -2369,10 +2371,11 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter * @return Max connect timeout. */ private long defaultMaxConnectTimeout() { - long maxTimeout = getConnectTimeout() * (1 << 4); + long connTimeout = getConnectTimeout(); + long maxTimeout = connTimeout * (1 << 4); if (maxTimeout > DFLT_MAX_CONN_TIMEOUT_LIMIT) - maxTimeout = DFLT_MAX_CONN_TIMEOUT_LIMIT; + maxTimeout = DFLT_MAX_CONN_TIMEOUT_LIMIT > connTimeout ? DFLT_MAX_CONN_TIMEOUT_LIMIT : connTimeout * 2; return maxTimeout; } 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 bfab4ce..e1e8d0a 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 @@ -194,7 +194,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T public static final long DFLT_STATS_PRINT_FREQ = 0; /** Default max ack timeout can't be bigger than this value. */ - public static final long DFLT_MAX_ACK_TIMEOUT_LIMIT = 20000; + public static final long DFLT_MAX_ACK_TIMEOUT_LIMIT = 30000; /** Local address. */ protected String locAddr; @@ -502,7 +502,9 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * is reached, then the process of message sending is considered as failed. *

* If not specified, default is calculated in a way that message acknowledgement timeout will be doubled and used - * at least four times before failing and must be no bigger than {@link #DFLT_MAX_ACK_TIMEOUT_LIMIT}. + * at least four times before failing. The default value, calculated this way, may be corrected to be no bigger than + * {@link #DFLT_MAX_ACK_TIMEOUT_LIMIT}. If {@link #DFLT_MAX_ACK_TIMEOUT_LIMIT} is smaller than acknowledgement + * timeout than max acknowledgement timeout will be set to some value bigger than acknowledgement timeout. *

* Affected server nodes only. * @@ -1782,10 +1784,11 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements DiscoverySpi, T * @return Max acknowledgement timeout. */ private long defaultMaxAckTimeout() { - long maxAck = getAckTimeout() * (1 << 4); + long ackTimeout = getAckTimeout(); + long maxAck = ackTimeout * (1 << 4); if (maxAck > DFLT_MAX_ACK_TIMEOUT_LIMIT) - maxAck = DFLT_MAX_ACK_TIMEOUT_LIMIT; + maxAck = DFLT_MAX_ACK_TIMEOUT_LIMIT > ackTimeout ? DFLT_MAX_ACK_TIMEOUT_LIMIT : ackTimeout * 2; return maxAck; } -- 1.9.5.msysgit.0