IGNITE-3027 - TcpDiscoveryImpl.registerLocalNodeAddress() has an infinite loop (cherry picked from commit 1f8b394)
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/90df322d Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/90df322d Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/90df322d Branch: refs/heads/ignite-2788 Commit: 90df322d534c086230f9baa1608853ed7db25750 Parents: 8873d43 Author: Yakov Zhdanov <[email protected]> Authored: Thu Apr 28 14:32:30 2016 +0300 Committer: shtykh_roman <[email protected]> Committed: Fri May 13 16:11:16 2016 +0900 ---------------------------------------------------------------------- .../ignite/spi/discovery/tcp/ServerImpl.java | 5 ++- .../spi/discovery/tcp/TcpDiscoveryImpl.java | 10 ++++++ .../spi/discovery/tcp/TcpDiscoverySelfTest.java | 34 ++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/90df322d/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 d7dd8c8..05bb1e6 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 @@ -160,7 +160,6 @@ import static org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusChe /** * */ -@SuppressWarnings("All") class ServerImpl extends TcpDiscoveryImpl { /** */ private static final int ENSURED_MSG_HIST_SIZE = getInteger(IGNITE_DISCOVERY_HISTORY_SIZE, 1024 * 10); @@ -1643,7 +1642,7 @@ class ServerImpl extends TcpDiscoveryImpl { * @return {@code True} if given parameters contain the same permissions, {@code False} otherwise. */ private boolean permissionsEqual(SecurityPermissionSet locPerms, SecurityPermissionSet rmtPerms) { - boolean dfltAllowMatch = !(locPerms.defaultAllowAll() ^ rmtPerms.defaultAllowAll()); + boolean dfltAllowMatch = locPerms.defaultAllowAll() == rmtPerms.defaultAllowAll(); boolean bothHaveSamePerms = F.eqNotOrdered(rmtPerms.systemPermissions(), locPerms.systemPermissions()) && F.eqNotOrdered(rmtPerms.cachePermissions(), locPerms.cachePermissions()) && @@ -1964,7 +1963,7 @@ class ServerImpl extends TcpDiscoveryImpl { private final Queue<TcpDiscoveryAbstractMessage> msgs = new ArrayDeque<>(MAX * 2); /** Processed custom message IDs. */ - private Set<IgniteUuid> procCustomMsgs = new GridBoundedLinkedHashSet<IgniteUuid>(MAX * 2); + private Set<IgniteUuid> procCustomMsgs = new GridBoundedLinkedHashSet<>(MAX * 2); /** Discarded message ID. */ private IgniteUuid discardId; http://git-wip-us.apache.org/repos/asf/ignite/blob/90df322d/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java index 1aef728..41086d1 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java @@ -260,6 +260,9 @@ abstract class TcpDiscoveryImpl { @SuppressWarnings("BusyWait") protected final void registerLocalNodeAddress() throws IgniteSpiException { // Make sure address registration succeeded. + // ... but limit it if join timeout is configured. + long start = spi.getJoinTimeout() > 0 ? U.currentTimeMillis() : 0; + while (true) { try { spi.ipFinder.initializeLocalAddresses(locNode.socketAddresses()); @@ -276,6 +279,13 @@ abstract class TcpDiscoveryImpl { "(retrying every 2000 ms)."); } + if (start > 0 && (U.currentTimeMillis() - start) > spi.getJoinTimeout()) + throw new IgniteSpiException( + "Failed to register local addresses with IP finder within join timeout " + + "(make sure IP finder configuration is correct, and operating system firewalls are disabled " + + "on all host machines, or consider increasing 'joinTimeout' configuration property) " + + "[joinTimeout=" + spi.getJoinTimeout() + ']'); + try { U.sleep(2000); } http://git-wip-us.apache.org/repos/asf/ignite/blob/90df322d/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index 45cd276..96c0e66 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -1058,6 +1058,40 @@ public class TcpDiscoverySelfTest extends GridCommonAbstractTest { } /** + * @throws Exception If any error occurs. + */ + public void testJoinTimeoutForIpFinder() throws Exception { + try { + // This start will fail as expected. + Throwable t = GridTestUtils.assertThrows(log, new Callable<Object>() { + @Override public Object call() throws Exception { + IgniteConfiguration c = getConfiguration("test-grid"); + + TcpDiscoverySpi disco = (TcpDiscoverySpi)c.getDiscoverySpi(); + + disco.setJoinTimeout(3000); + disco.setIpFinder( + new TcpDiscoveryVmIpFinder(true) { + @Override public void initializeLocalAddresses(Collection<InetSocketAddress> addrs) + throws IgniteSpiException { + throw new IgniteSpiException("Test exception."); + } + }); + + startGrid("test-grid", c); + + return null; + } + }, IgniteException.class, null); + + assert X.hasCause(t, IgniteSpiException.class) : "Unexpected exception: " + t; + } + finally { + stopAllGrids(); + } + } + + /** * @throws Exception If failed. */ public void testDirtyIpFinder() throws Exception {
