Repository: ignite
Updated Branches:
  refs/heads/master 2a09d5462 -> d4496c770


IGNITE-10354 Failing client node due to not receiving metrics updates - Fixes 
#5485.

Signed-off-by: Ilya Kasnacheev <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d4496c77
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d4496c77
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d4496c77

Branch: refs/heads/master
Commit: d4496c77090593125a36454ef74e77b1d0240cae
Parents: 2a09d54
Author: Roman Guseinov <[email protected]>
Authored: Thu Nov 29 16:40:46 2018 +0300
Committer: Ilya Kasnacheev <[email protected]>
Committed: Thu Nov 29 16:40:46 2018 +0300

----------------------------------------------------------------------
 .../ignite/spi/discovery/tcp/ServerImpl.java    |   3 +
 .../tcp/internal/TcpDiscoveryNode.java          |   9 +-
 ...ClientDiscoverySpiCoordinatorChangeTest.java | 121 +++++++++++++++++++
 .../IgniteSpiDiscoverySelfTestSuite.java        |   2 +
 4 files changed, 134 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d4496c77/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 4c74706..ce69e78 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
@@ -5232,6 +5232,9 @@ class ServerImpl extends TcpDiscoveryImpl {
                             if (clientNodeIds.contains(clientNode.id()))
                                 
clientNode.clientAliveTime(spi.clientFailureDetectionTimeout());
                             else {
+                                if (clientNode.clientAliveTime() == 0L)
+                                    
clientNode.clientAliveTime(spi.clientFailureDetectionTimeout());
+
                                 boolean aliveCheck = 
clientNode.isClientAlive();
 
                                 if (!aliveCheck && isLocalNodeCoordinator()) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/d4496c77/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java
index 13d1006..763a678 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java
@@ -124,7 +124,7 @@ public class TcpDiscoveryNode extends 
GridMetadataAwareAdapter implements Ignite
 
     /** Alive check time (used by clients). */
     @GridToStringExclude
-    private transient long aliveCheckTime;
+    private transient volatile long aliveCheckTime;
 
     /** Client router node ID. */
     @GridToStringExclude
@@ -500,6 +500,13 @@ public class TcpDiscoveryNode extends 
GridMetadataAwareAdapter implements Ignite
     }
 
     /**
+     * @return Client alive check time.
+     */
+    public long clientAliveTime() {
+        return aliveCheckTime;
+    }
+
+    /**
      * @return Client router node ID.
      */
     public UUID clientRouterNodeId() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/d4496c77/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiCoordinatorChangeTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiCoordinatorChangeTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiCoordinatorChangeTest.java
new file mode 100644
index 0000000..0939e63
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpiCoordinatorChangeTest.java
@@ -0,0 +1,121 @@
+/*
+ * 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;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.Event;
+import org.apache.ignite.events.EventType;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * This class tests that a client is able to connect to another server node 
without leaving the cluster.
+ */
+public class TcpClientDiscoverySpiCoordinatorChangeTest extends 
GridCommonAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        stopAllGrids();
+    }
+
+    /**
+     * Checks that a client node doesn't fail because of coordinator change.
+     *
+     * @throws Exception If test fails.
+     */
+    public void testClientNotFailed() throws Exception {
+        TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+        // Start server A.
+        Ignite srvA = startNode("server-a", ipFinder, false);
+
+        // Start the client.
+        Ignite client = startNode("client", ipFinder, true);
+
+        AtomicBoolean clientReconnectState = getClientReconnectState(client);
+
+        // Start server B.
+        Ignite srvB = startNode("server-b", ipFinder, false);
+
+        // Stop server A.
+        srvA.close();
+
+        // Will throw an exception if the client is disconnected.
+        client.getOrCreateCache("CACHE-NAME");
+
+        // Check that the client didn't disconnect/reconnect quickly.
+        assertFalse("Client node was failed and reconnected to the cluster.", 
clientReconnectState.get());
+
+        // Stop the client.
+        client.close();
+
+        // Stop server B.
+        srvB.close();
+    }
+
+    /**
+     * @param instanceName Instance name.
+     * @param ipFinder IP-finder.
+     * @param clientMode Client mode flag.
+     * @return Started node.
+     * @throws Exception If a node was not started.
+     */
+    private Ignite startNode(String instanceName, TcpDiscoveryIpFinder 
ipFinder,  boolean clientMode) throws Exception {
+        IgniteConfiguration cfg = getConfiguration(instanceName)
+            .setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(ipFinder))
+            .setClientMode(clientMode);
+
+        return Ignition.start(cfg);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String 
instanceName) throws Exception {
+        return super.getConfiguration(instanceName)
+            .setMetricsUpdateFrequency(Integer.MAX_VALUE)
+            .setClientFailureDetectionTimeout(Integer.MAX_VALUE)
+            .setFailureDetectionTimeout(Integer.MAX_VALUE);
+    }
+
+    /**
+     * @param ignite Client node.
+     * @return Client reconnect state.
+     */
+    private AtomicBoolean getClientReconnectState(Ignite ignite) {
+        final AtomicBoolean reconnectState = new AtomicBoolean(false);
+
+        ignite.events().localListen(
+            new IgnitePredicate<Event>() {
+                @Override public boolean apply(Event evt) {
+                    if (evt.type() == EventType.EVT_CLIENT_NODE_RECONNECTED)
+                        reconnectState.set(true);
+
+                    return true;
+                }
+            },
+            EventType.EVT_CLIENT_NODE_RECONNECTED
+        );
+
+        return reconnectState;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/d4496c77/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
index 80f093d..3ef1087 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
@@ -28,6 +28,7 @@ import 
org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest;
 import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectTest;
 import 
org.apache.ignite.spi.discovery.tcp.IgniteClientReconnectMassiveShutdownTest;
 import 
org.apache.ignite.spi.discovery.tcp.TcpClientDiscoveryMarshallerCheckSelfTest;
+import 
org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiCoordinatorChangeTest;
 import 
org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiFailureTimeoutSelfTest;
 import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiMulticastTest;
 import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiSelfTest;
@@ -100,6 +101,7 @@ public class IgniteSpiDiscoverySelfTestSuite extends 
TestSuite {
         suite.addTest(new TestSuite(TcpClientDiscoverySpiSelfTest.class));
         suite.addTest(new TestSuite(LongClientConnectToClusterTest.class));
         suite.addTest(new 
TestSuite(TcpClientDiscoveryMarshallerCheckSelfTest.class));
+        suite.addTest(new 
TestSuite(TcpClientDiscoverySpiCoordinatorChangeTest.class));
         suite.addTest(new TestSuite(TcpClientDiscoverySpiMulticastTest.class));
         suite.addTest(new 
TestSuite(TcpClientDiscoverySpiFailureTimeoutSelfTest.class));
         suite.addTest(new 
TestSuite(TcpClientDiscoveryUnresolvedHostTest.class));

Reply via email to