You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2020/08/31 15:53:41 UTC
[ignite] 02/02: IGNITE-13369 .NET: Clear cached node data on client
disconnect
This is an automated email from the ASF dual-hosted git repository.
alexpl pushed a commit to branch ignite-2.9
in repository https://gitbox.apache.org/repos/asf/ignite.git
commit 03c7e2a132208e5bcb04204fd8195b97fc79d113
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
(cherry picked from commit 3cb71994e4fc22c34337658c3b5c24cb9ac0d7a3)
---
.../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 e8aa60a..b748041 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;
@@ -123,6 +126,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++; };
@@ -163,6 +169,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);
}
}
@@ -187,6 +200,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();
@@ -218,6 +233,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>
@@ -250,5 +268,24 @@ namespace Apache.Ignite.Core.Tests
IgniteProcess.KillAll();
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;