IGNITE-6249 .NET: IgniteConfiguration.ConsistentId This closes #2727
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/68c100df Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/68c100df Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/68c100df Branch: refs/heads/ignite-3478 Commit: 68c100df28ddd97828fd67c2d46f6124ce080d4c Parents: 6f1ca41 Author: Pavel Tupitsyn <[email protected]> Authored: Mon Sep 25 13:07:35 2017 +0300 Committer: Pavel Tupitsyn <[email protected]> Committed: Mon Sep 25 13:07:35 2017 +0300 ---------------------------------------------------------------------- .../utils/PlatformConfigurationUtils.java | 10 +++ .../IgniteConfigurationSerializerTest.cs | 7 +- .../IgniteConfigurationTest.cs | 73 ++++++++++++++++++-- .../Apache.Ignite.Core/IgniteConfiguration.cs | 7 ++ .../IgniteConfigurationSection.xsd | 5 ++ .../Common/IgniteConfigurationXmlSerializer.cs | 4 +- 6 files changed, 97 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/68c100df/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java index 7e17bdb..dc45166 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.platform.utils; +import java.io.Serializable; import java.lang.management.ManagementFactory; import java.net.InetSocketAddress; import java.security.AccessController; @@ -571,6 +572,14 @@ public class PlatformConfigurationUtils { if (in.readBoolean()) cfg.setActiveOnStart(in.readBoolean()); + Object consId = in.readObjectDetached(); + + if (consId instanceof Serializable) { + cfg.setConsistentId((Serializable) consId); + } else if (consId != null) { + throw new IgniteException("IgniteConfiguration.ConsistentId should be Serializable."); + } + // Thread pools. if (in.readBoolean()) cfg.setPublicThreadPoolSize(in.readInt()); @@ -1025,6 +1034,7 @@ public class PlatformConfigurationUtils { w.writeLong(cfg.getLongQueryWarningTimeout()); w.writeBoolean(true); w.writeBoolean(cfg.isActiveOnStart()); + w.writeObject(cfg.getConsistentId()); // Thread pools. w.writeBoolean(true); http://git-wip-us.apache.org/repos/asf/ignite/blob/68c100df/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs index ac214ce..23ee884 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs @@ -68,7 +68,7 @@ namespace Apache.Ignite.Core.Tests [Test] public void TestPredefinedXml() { - var xml = @"<igniteConfig workDirectory='c:' JvmMaxMemoryMb='1024' MetricsLogFrequency='0:0:10' isDaemon='true' isLateAffinityAssignment='false' springConfigUrl='c:\myconfig.xml' autoGenerateIgniteInstanceName='true' peerAssemblyLoadingMode='CurrentAppDomain' longQueryWarningTimeout='1:2:3' isActiveOnStart='false'> + var xml = @"<igniteConfig workDirectory='c:' JvmMaxMemoryMb='1024' MetricsLogFrequency='0:0:10' isDaemon='true' isLateAffinityAssignment='false' springConfigUrl='c:\myconfig.xml' autoGenerateIgniteInstanceName='true' peerAssemblyLoadingMode='CurrentAppDomain' longQueryWarningTimeout='1:2:3' isActiveOnStart='false' consistentId='someId012'> <localhost>127.1.1.1</localhost> <binaryConfiguration compactFooter='false' keepDeserialized='true'> <nameMapper type='Apache.Ignite.Core.Tests.IgniteConfigurationSerializerTest+NameMapper' bar='testBar' /> @@ -145,6 +145,7 @@ namespace Apache.Ignite.Core.Tests <sqlConnectorConfiguration host='bar' port='10' portRange='11' socketSendBufferSize='12' socketReceiveBufferSize='13' tcpNoDelay='true' maxOpenCursorsPerConnection='14' threadPoolSize='15' /> <clientConnectorConfiguration host='bar' port='10' portRange='11' socketSendBufferSize='12' socketReceiveBufferSize='13' tcpNoDelay='true' maxOpenCursorsPerConnection='14' threadPoolSize='15' /> <persistentStoreConfiguration alwaysWriteFullPages='true' checkpointingFrequency='00:00:1' checkpointingPageBufferSize='2' checkpointingThreads='3' lockWaitTime='00:00:04' persistentStorePath='foo' tlbSize='5' walArchivePath='bar' walFlushFrequency='00:00:06' walFsyncDelayNanos='7' walHistorySize='8' walMode='None' walRecordIteratorBufferSize='9' walSegments='10' walSegmentSize='11' walStorePath='baz' metricsEnabled='true' rateTimeInterval='0:0:6' subIntervals='3' /> + <consistentId type='System.String'>someId012</consistentId> </igniteConfig>"; var cfg = IgniteConfiguration.FromXml(xml); @@ -171,6 +172,7 @@ namespace Apache.Ignite.Core.Tests Assert.IsTrue(cfg.AutoGenerateIgniteInstanceName); Assert.AreEqual(new TimeSpan(1, 2, 3), cfg.LongQueryWarningTimeout); Assert.IsFalse(cfg.IsActiveOnStart); + Assert.AreEqual("someId012", cfg.ConsistentId); Assert.AreEqual("secondCache", cfg.CacheConfiguration.Last().Name); @@ -927,7 +929,8 @@ namespace Apache.Ignite.Core.Tests MetricsEnabled = true, RateTimeInterval = TimeSpan.FromDays(1) }, - IsActiveOnStart = false + IsActiveOnStart = false, + ConsistentId = "myId123" }; } http://git-wip-us.apache.org/repos/asf/ignite/blob/68c100df/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs index 5facb38..4f8014f 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs @@ -47,10 +47,10 @@ namespace Apache.Ignite.Core.Tests public class IgniteConfigurationTest { /// <summary> - /// Fixture setup. + /// Fixture tear down. /// </summary> [TestFixtureSetUp] - public void FixtureSetUp() + public void FixtureTearDown() { Ignition.StopAll(true); } @@ -195,6 +195,8 @@ namespace Apache.Ignite.Core.Tests Assert.AreEqual(cfg.UtilityCacheThreadPoolSize, resCfg.UtilityCacheThreadPoolSize); Assert.AreEqual(cfg.QueryThreadPoolSize, resCfg.QueryThreadPoolSize); + Assert.AreEqual(cfg.ConsistentId, resCfg.ConsistentId); + var binCfg = cfg.BinaryConfiguration; Assert.IsFalse(binCfg.CompactFooter); @@ -463,6 +465,31 @@ namespace Apache.Ignite.Core.Tests } /// <summary> + /// Tests the consistent id. + /// </summary> + [Test] + [NUnit.Framework.Category(TestUtils.CategoryIntensive)] + public void TestConsistentId() + { + var ids = new object[] + { + null, new MyConsistentId {Data = "foo"}, "str", 1, 1.1, DateTime.Now, Guid.NewGuid() + }; + + var cfg = TestUtils.GetTestConfiguration(); + + foreach (var id in ids) + { + cfg.ConsistentId = id; + + using (var ignite = Ignition.Start(cfg)) + { + Assert.AreEqual(id, ignite.GetConfiguration().ConsistentId); + } + } + } + + /// <summary> /// Tests the ip finders. /// </summary> /// <param name="ipFinder">The ip finder.</param> @@ -636,7 +663,7 @@ namespace Apache.Ignite.Core.Tests JoinTimeout = TimeSpan.FromSeconds(5), IpFinder = new TcpDiscoveryStaticIpFinder { - Endpoints = new[] { "127.0.0.1:49900", "127.0.0.1:49901" } + Endpoints = new[] {"127.0.0.1:49900", "127.0.0.1:49901"} }, ClientReconnectDisabled = true, ForceServerMode = true, @@ -718,7 +745,7 @@ namespace Apache.Ignite.Core.Tests } }, // Skip cache check because with persistence the grid is not active by default. - PluginConfigurations = new[] { new TestIgnitePluginConfiguration{ SkipCacheCheck = true } }, + PluginConfigurations = new[] {new TestIgnitePluginConfiguration {SkipCacheCheck = true}}, EventStorageSpi = new MemoryEventStorageSpi { ExpirationTimeout = TimeSpan.FromSeconds(5), @@ -754,7 +781,7 @@ namespace Apache.Ignite.Core.Tests EmptyPagesPoolSize = 66, SwapFilePath = "somePath2", MetricsEnabled = true - } + } } }, PublicThreadPoolSize = 3, @@ -798,8 +825,42 @@ namespace Apache.Ignite.Core.Tests MetricsEnabled = true, SubIntervals = 7, RateTimeInterval = TimeSpan.FromSeconds(9) - } + }, + ConsistentId = new MyConsistentId {Data = "abc"} }; } + + private class MyConsistentId + { + public string Data { get; set; } + + private bool Equals(MyConsistentId other) + { + return string.Equals(Data, other.Data); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + return Equals((MyConsistentId) obj); + } + + public override int GetHashCode() + { + return (Data != null ? Data.GetHashCode() : 0); + } + + public static bool operator ==(MyConsistentId left, MyConsistentId right) + { + return Equals(left, right); + } + + public static bool operator !=(MyConsistentId left, MyConsistentId right) + { + return !Equals(left, right); + } + } } } http://git-wip-us.apache.org/repos/asf/ignite/blob/68c100df/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs index 14cd375..cb91ee1 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs @@ -281,6 +281,7 @@ namespace Apache.Ignite.Core writer.WriteTimeSpanAsLongNullable(_clientFailureDetectionTimeout); writer.WriteTimeSpanAsLongNullable(_longQueryWarningTimeout); writer.WriteBooleanNullable(_isActiveOnStart); + writer.WriteObjectDetached(ConsistentId); // Thread pools writer.WriteIntNullable(_publicThreadPoolSize); @@ -546,6 +547,7 @@ namespace Apache.Ignite.Core _clientFailureDetectionTimeout = r.ReadTimeSpanNullable(); _longQueryWarningTimeout = r.ReadTimeSpanNullable(); _isActiveOnStart = r.ReadBooleanNullable(); + ConsistentId = r.ReadObject<object>(); // Thread pools _publicThreadPoolSize = r.ReadIntNullable(); @@ -1272,5 +1274,10 @@ namespace Apache.Ignite.Core get { return _isActiveOnStart ?? DefaultIsActiveOnStart; } set { _isActiveOnStart = value; } } + + /// <summary> + /// Gets or sets consistent globally unique node identifier which survives node restarts. + /// </summary> + public object ConsistentId { get; set; } } } http://git-wip-us.apache.org/repos/asf/ignite/blob/68c100df/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd index ac1111b..19ce110 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd +++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd @@ -1484,6 +1484,11 @@ </xs:sequence> </xs:complexType> </xs:element> + <xs:element name="consistentId" minOccurs="0"> + <xs:annotation> + <xs:documentation>Consistent globally unique node identifier which survives node restarts.</xs:documentation> + </xs:annotation> + </xs:element> </xs:all> <xs:attribute name="igniteInstanceName" type="xs:string"> <xs:annotation> http://git-wip-us.apache.org/repos/asf/ignite/blob/68c100df/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs index 775add4..8ee0c07 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs @@ -518,7 +518,9 @@ namespace Apache.Ignite.Core.Impl.Common { Debug.Assert(obj != null); - return obj.GetType().GetProperties().Where(p => !Equals(p.GetValue(obj, null), GetDefaultValue(p))); + return obj.GetType().GetProperties() + .Where(p => p.GetIndexParameters().Length == 0 && // Skip indexed properties. + !Equals(p.GetValue(obj, null), GetDefaultValue(p))); } /// <summary>
