ignite-752: improvements
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/dd076a08 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/dd076a08 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/dd076a08 Branch: refs/heads/ignite-752 Commit: dd076a0899f464e331fab8aa27643be542259937 Parents: 12ba6bc Author: Denis Magda <[email protected]> Authored: Thu Jul 2 10:19:48 2015 +0300 Committer: Denis Magda <[email protected]> Committed: Thu Jul 2 10:19:48 2015 +0300 ---------------------------------------------------------------------- .../configuration/IgniteConfiguration.java | 3 + .../communication/tcp/TcpCommunicationSpi.java | 28 ++-- .../ignite/spi/discovery/tcp/ClientImpl.java | 2 +- .../ignite/spi/discovery/tcp/ServerImpl.java | 2 +- .../spi/discovery/tcp/TcpDiscoverySpi.java | 12 +- .../IgniteConfigurationValidationSelfTest.java | 141 +++++++++++++++++++ .../tcp/TcpClientDiscoverySpiSelfTest.java | 4 +- .../testsuites/IgniteKernalSelfTestSuite.java | 1 + 8 files changed, 177 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/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 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. */ http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java ---------------------------------------------------------------------- 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<String, Object> 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; } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java ---------------------------------------------------------------------- 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()); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/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 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<Socket> connLsnr : spi.incomeConnLsnrs) connLsnr.apply(sock); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/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 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 <tt>0ms</tt>). */ 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. * <p> * 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}. * <p> * 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; } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/modules/core/src/test/java/org/apache/ignite/internal/IgniteConfigurationValidationSelfTest.java ---------------------------------------------------------------------- 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; + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiSelfTest.java ---------------------------------------------------------------------- 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(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/dd076a08/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteKernalSelfTestSuite.java ---------------------------------------------------------------------- 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);
