You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2020/08/19 19:35:55 UTC

[ignite] branch master updated: IGNITE-13369 .NET: Clear cached node data on client disconnect

This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 3cb7199  IGNITE-13369 .NET: Clear cached node data on client disconnect
3cb7199 is described below

commit 3cb71994e4fc22c34337658c3b5c24cb9ac0d7a3
Author: Pavel Tupitsyn <pt...@apache.org>
AuthorDate: Wed Aug 19 22:35:43 2020 +0300

    IGNITE-13369 .NET: Clear cached node data on client disconnect
    
    Client reconnect causes local node ID to change, so cached local node info should be cleared on disconnect
---
 .../Apache.Ignite.Core.Tests/ReconnectTest.cs      | 37 ++++++++++++++++++++++
 .../Impl/Cluster/ClusterGroupImpl.cs               |  9 ++++++
 .../dotnet/Apache.Ignite.Core/Impl/Ignite.cs       |  8 ++++-
 3 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs
index c06ac98..1a4c30a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs
@@ -18,10 +18,13 @@
 namespace Apache.Ignite.Core.Tests
 {
     using System;
+    using System.Collections.Generic;
+    using System.Linq;
     using System.Threading;
     using System.Threading.Tasks;
     using Apache.Ignite.Core.Cache;
     using Apache.Ignite.Core.Cache.Configuration;
+    using Apache.Ignite.Core.Cluster;
     using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Lifecycle;
     using Apache.Ignite.Core.Tests.Client.Cache;
@@ -125,6 +128,9 @@ namespace Apache.Ignite.Core.Tests
 
             using (var ignite = Ignition.Start(cfg))
             {
+                var localNode = ignite.GetCluster().GetLocalNode();
+                var remoteNode = ignite.GetCluster().ForRemotes().GetNode();
+
                 var reconnected = 0;
                 var disconnected = 0;
                 ignite.ClientDisconnected += (sender, args) => { disconnected++; };
@@ -165,6 +171,13 @@ namespace Apache.Ignite.Core.Tests
 
                 Thread.Sleep(100);  // Wait for event handler
                 Assert.AreEqual(1, reconnected);
+                
+                var localNodeNew = ignite.GetCluster().GetLocalNode();
+                Assert.AreNotSame(localNode, localNodeNew);
+                Assert.AreNotEqual(localNode.Id, localNodeNew.Id);
+
+                var remoteNodeNew = ignite.GetCluster().ForRemotes().GetNode();
+                Assert.AreEqual(remoteNode.Id, remoteNodeNew.Id);
             }
         }
 #endif
@@ -190,6 +203,8 @@ namespace Apache.Ignite.Core.Tests
             var client = Ignition.Start(clientCfg);
 
             Assert.AreEqual(2, client.GetCluster().GetNodes().Count);
+            var localNode = client.GetCluster().GetLocalNode();
+            var nodes = client.GetCluster().GetNodes();
 
             var evt = new ManualResetEventSlim(false);
             client.ClientReconnected += (sender, args) => evt.Set();
@@ -221,6 +236,9 @@ namespace Apache.Ignite.Core.Tests
 
             var serverCache = server2.GetCache<int, Person>(CacheName);
             Assert.AreEqual(2, serverCache[2].Id);
+            
+            // Verify that cached node info is updated on the client.
+            CheckUpdatedNodes(client, localNode, nodes);
         }
 
         /// <summary>
@@ -237,5 +255,24 @@ namespace Apache.Ignite.Core.Tests
 
             Ignition.ClientMode = false;
         }
+        
+        /// <summary>
+        /// Checks that node info is up to date.
+        /// </summary>
+        // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local
+        private static void CheckUpdatedNodes(IIgnite client, IClusterNode localNode, ICollection<IClusterNode> nodes)
+        {
+            var localNodeNew = client.GetCluster().GetLocalNode();
+            Assert.AreNotSame(localNode, localNodeNew);
+            Assert.AreNotEqual(localNode.Id, localNodeNew.Id);
+
+            var nodesNew = client.GetCluster().GetNodes();
+            Assert.AreEqual(2, nodesNew.Count);
+
+            foreach (var node in nodesNew)
+            {
+                Assert.IsFalse(nodes.Any(n => n.Id == node.Id));
+            }
+        }
     }
 }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
index a2a7a7c..09c5b94 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
@@ -721,6 +721,15 @@ namespace Apache.Ignite.Core.Impl.Cluster
 #pragma warning restore 618
 
         /// <summary>
+        /// Clears cached node data.
+        /// </summary>
+        internal void ClearCachedNodeData()
+        {
+            _topVer = TopVerInit;
+            _nodes = null;
+        }
+
+        /// <summary>
         /// Creates new Cluster Group from given native projection.
         /// </summary>
         /// <param name="prj">Native projection.</param>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
index 7c23d66..9dfa40b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
@@ -129,7 +129,7 @@ namespace Apache.Ignite.Core.Impl
         private readonly IList<LifecycleHandlerHolder> _lifecycleHandlers;
 
         /** Local node. */
-        private IClusterNode _locNode;
+        private volatile IClusterNode _locNode;
 
         /** Callbacks */
         private readonly UnmanagedCallbacks _cbs;
@@ -1156,6 +1156,12 @@ namespace Apache.Ignite.Core.Impl
         /// </summary>
         internal void OnClientDisconnected()
         {
+            // Clear cached node data.
+            // Do not clear _nodes - it is in sync with PlatformContextImpl.sentNodes.
+            _locNode = null;
+            _prj.ClearCachedNodeData();
+
+            // Raise events.
             _clientReconnectTaskCompletionSource = new TaskCompletionSource<bool>();
             
             var handler = ClientDisconnected;