IGNITE-5273 .NET: MemoryMetrics API improvements This closes #2039
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6f8577f3 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6f8577f3 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6f8577f3 Branch: refs/heads/ignite-5075 Commit: 6f8577f34c6b9b9de21629bba30adbdac86d8126 Parents: 10a0a84 Author: Pavel Tupitsyn <[email protected]> Authored: Wed May 31 10:29:27 2017 +0300 Committer: Pavel Tupitsyn <[email protected]> Committed: Wed May 31 10:29:48 2017 +0300 ---------------------------------------------------------------------- .../platform/cluster/PlatformClusterGroup.java | 45 +++++++++++++++++--- .../utils/PlatformConfigurationUtils.java | 6 ++- .../Cache/MemoryMetricsTest.cs | 20 +++++++++ .../IgniteConfigurationSerializerTest.cs | 8 +++- .../IgniteConfigurationTest.cs | 6 ++- .../Configuration/MemoryPolicyConfiguration.cs | 45 +++++++++++++++++++- .../dotnet/Apache.Ignite.Core/IIgnite.cs | 9 ++++ .../IgniteConfigurationSection.xsd | 10 +++++ .../Impl/Cluster/ClusterGroupImpl.cs | 12 ++++++ .../dotnet/Apache.Ignite.Core/Impl/Ignite.cs | 8 ++++ 10 files changed, 158 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java index 5a5ebfd..cd8d9b8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java @@ -25,6 +25,7 @@ import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCluster; import org.apache.ignite.MemoryMetrics; +import org.apache.ignite.binary.BinaryRawWriter; import org.apache.ignite.cluster.ClusterMetrics; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.cluster.ClusterGroupEx; @@ -112,6 +113,9 @@ public class PlatformClusterGroup extends PlatformAbstractTarget { /** */ private static final int OP_MEMORY_METRICS = 26; + /** */ + private static final int OP_MEMORY_METRICS_BY_NAME = 27; + /** Projection. */ private final ClusterGroupEx prj; @@ -142,12 +146,7 @@ public class PlatformClusterGroup extends PlatformAbstractTarget { writer.writeInt(metrics.size()); for (MemoryMetrics m : metrics) { - writer.writeString(m.getName()); - writer.writeLong(m.getTotalAllocatedPages()); - writer.writeFloat(m.getAllocationRate()); - writer.writeFloat(m.getEvictionRate()); - writer.writeFloat(m.getLargeEntriesPagesPercentage()); - writer.writeFloat(m.getPagesFillFactor()); + writeMemoryMetrics(writer, m); } break; @@ -236,6 +235,22 @@ public class PlatformClusterGroup extends PlatformAbstractTarget { break; } + case OP_MEMORY_METRICS_BY_NAME: { + String plcName = reader.readString(); + + MemoryMetrics metrics = platformCtx.kernalContext().grid().memoryMetrics(plcName); + + if (metrics != null) { + writer.writeBoolean(true); + writeMemoryMetrics(writer, metrics); + } + else { + writer.writeBoolean(false); + } + + break; + } + default: super.processInStreamOutStream(type, reader, writer); } @@ -399,4 +414,22 @@ public class PlatformClusterGroup extends PlatformAbstractTarget { return ((IgniteCluster)prj).topology(topVer); } + + /** + * Writes the memory metrics. + * + * @param writer Writer. + * @param metrics Metrics. + */ + private static void writeMemoryMetrics(BinaryRawWriter writer, MemoryMetrics metrics) { + assert writer != null; + assert metrics != null; + + writer.writeString(metrics.getName()); + writer.writeLong(metrics.getTotalAllocatedPages()); + writer.writeFloat(metrics.getAllocationRate()); + writer.writeFloat(metrics.getEvictionRate()); + writer.writeFloat(metrics.getLargeEntriesPagesPercentage()); + writer.writeFloat(metrics.getPagesFillFactor()); + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/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 6ba88d9..dca6960 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 @@ -1351,7 +1351,9 @@ public class PlatformConfigurationUtils { .setPageEvictionMode(DataPageEvictionMode.values()[in.readInt()]) .setEvictionThreshold(in.readDouble()) .setEmptyPagesPoolSize(in.readInt()) - .setMetricsEnabled(in.readBoolean()); + .setMetricsEnabled(in.readBoolean()) + .setSubIntervals(in.readInt()) + .setRateTimeInterval((int) (in.readLong() / 1000)); plcs[i] = cfg; } @@ -1396,6 +1398,8 @@ public class PlatformConfigurationUtils { w.writeDouble(plc.getEvictionThreshold()); w.writeInt(plc.getEmptyPagesPoolSize()); w.writeBoolean(plc.isMetricsEnabled()); + w.writeInt(plc.getSubIntervals()); + w.writeLong(plc.getRateTimeInterval() * 1000); } } else { http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/MemoryMetricsTest.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/MemoryMetricsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/MemoryMetricsTest.cs index 0aba377..1aad823 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/MemoryMetricsTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/MemoryMetricsTest.cs @@ -60,6 +60,26 @@ namespace Apache.Ignite.Core.Tests.Cache var sysMetrics = metrics[2]; Assert.AreEqual("sysMemPlc", sysMetrics.Name); AssertMetricsAreEmpty(sysMetrics); + + // Metrics by name. + emptyMetrics = ignite.GetMemoryMetrics(MemoryPolicyNoMetrics); + Assert.AreEqual(MemoryPolicyNoMetrics, emptyMetrics.Name); + AssertMetricsAreEmpty(emptyMetrics); + + memMetrics = ignite.GetMemoryMetrics(MemoryPolicyWithMetrics); + Assert.AreEqual(MemoryPolicyWithMetrics, memMetrics.Name); + Assert.Greater(memMetrics.AllocationRate, 0); + Assert.AreEqual(0, memMetrics.EvictionRate); + Assert.AreEqual(0, memMetrics.LargeEntriesPagesPercentage); + Assert.Greater(memMetrics.PageFillFactor, 0); + Assert.Greater(memMetrics.TotalAllocatedPages, 1000); + + sysMetrics = ignite.GetMemoryMetrics("sysMemPlc"); + Assert.AreEqual("sysMemPlc", sysMetrics.Name); + AssertMetricsAreEmpty(sysMetrics); + + // Invalid name. + Assert.IsNull(ignite.GetMemoryMetrics("boo")); } /// <summary> http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/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 a90eae5..c726f85 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs @@ -137,7 +137,7 @@ namespace Apache.Ignite.Core.Tests <eventStorageSpi type='MemoryEventStorageSpi' expirationTimeout='00:00:23.45' maxEventCount='129' /> <memoryConfiguration concurrencyLevel='3' defaultMemoryPolicyName='dfPlc' pageSize='45' systemCacheInitialSize='67' systemCacheMaxSize='68'> <memoryPolicies> - <memoryPolicyConfiguration emptyPagesPoolSize='1' evictionThreshold='0.2' name='dfPlc' pageEvictionMode='RandomLru' initialSize='89' maxSize='98' swapFilePath='abc' metricsEnabled='true' /> + <memoryPolicyConfiguration emptyPagesPoolSize='1' evictionThreshold='0.2' name='dfPlc' pageEvictionMode='RandomLru' initialSize='89' maxSize='98' swapFilePath='abc' metricsEnabled='true' rateTimeInterval='0:1:2' subIntervals='9' /> </memoryPolicies> </memoryConfiguration> </igniteConfig>"; @@ -274,6 +274,8 @@ namespace Apache.Ignite.Core.Tests Assert.AreEqual(89, memPlc.InitialSize); Assert.AreEqual(98, memPlc.MaxSize); Assert.IsTrue(memPlc.MetricsEnabled); + Assert.AreEqual(9, memPlc.SubIntervals); + Assert.AreEqual(TimeSpan.FromSeconds(62), memPlc.RateTimeInterval); Assert.AreEqual(PeerAssemblyLoadingMode.CurrentAppDomain, cfg.PeerAssemblyLoadingMode); } @@ -822,7 +824,9 @@ namespace Apache.Ignite.Core.Tests MaxSize = 345 * 1024 * 1024, EvictionThreshold = 0.88, EmptyPagesPoolSize = 77, - SwapFilePath = "myPath1" + SwapFilePath = "myPath1", + RateTimeInterval = TimeSpan.FromSeconds(22), + SubIntervals = 99 }, new MemoryPolicyConfiguration { http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/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 ae82d8a..80b271d 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs @@ -262,6 +262,8 @@ namespace Apache.Ignite.Core.Tests Assert.AreEqual(MemoryPolicyConfiguration.DefaultEvictionThreshold, plc.EvictionThreshold); Assert.AreEqual(MemoryPolicyConfiguration.DefaultInitialSize, plc.InitialSize); Assert.AreEqual(MemoryPolicyConfiguration.DefaultMaxSize, plc.MaxSize); + Assert.AreEqual(MemoryPolicyConfiguration.DefaultSubIntervals, plc.SubIntervals); + Assert.AreEqual(MemoryPolicyConfiguration.DefaultRateTimeInterval, plc.RateTimeInterval); } } @@ -598,7 +600,9 @@ namespace Apache.Ignite.Core.Tests MaxSize = 345 * 1024 * 1024, EvictionThreshold = 0.88, EmptyPagesPoolSize = 77, - SwapFilePath = "myPath1" + SwapFilePath = "myPath1", + RateTimeInterval = TimeSpan.FromSeconds(35), + SubIntervals = 7 }, new MemoryPolicyConfiguration { http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/MemoryPolicyConfiguration.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/MemoryPolicyConfiguration.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/MemoryPolicyConfiguration.cs index 1db9ea9..c1fcaa2 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/MemoryPolicyConfiguration.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/MemoryPolicyConfiguration.cs @@ -17,9 +17,12 @@ namespace Apache.Ignite.Core.Cache.Configuration { + using System; using System.ComponentModel; + using System.Diagnostics.CodeAnalysis; using Apache.Ignite.Core.Binary; using Apache.Ignite.Core.Impl; + using Apache.Ignite.Core.Impl.Binary; /// <summary> /// Defines page memory policy configuration. See <see cref="MemoryConfiguration.MemoryPolicies"/>. @@ -47,6 +50,18 @@ namespace Apache.Ignite.Core.Cache.Configuration public static readonly long DefaultMaxSize = (long) ((long) NativeMethods.GetTotalPhysicalMemory() * 0.8); /// <summary> + /// The default sub intervals. + /// </summary> + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", + Justification = "Consistency with Java config")] + public const int DefaultSubIntervals = 5; + + /// <summary> + /// The default rate time interval. + /// </summary> + public static readonly TimeSpan DefaultRateTimeInterval = TimeSpan.FromSeconds(60); + + /// <summary> /// Initializes a new instance of the <see cref="MemoryPolicyConfiguration"/> class. /// </summary> public MemoryPolicyConfiguration() @@ -56,6 +71,8 @@ namespace Apache.Ignite.Core.Cache.Configuration Name = MemoryConfiguration.DefaultDefaultMemoryPolicyName; InitialSize = DefaultInitialSize; MaxSize = DefaultMaxSize; + SubIntervals = DefaultSubIntervals; + RateTimeInterval = DefaultRateTimeInterval; } /// <summary> @@ -72,6 +89,8 @@ namespace Apache.Ignite.Core.Cache.Configuration EvictionThreshold = reader.ReadDouble(); EmptyPagesPoolSize = reader.ReadInt(); MetricsEnabled = reader.ReadBoolean(); + SubIntervals = reader.ReadInt(); + RateTimeInterval = reader.ReadLongAsTimespan(); } /// <summary> @@ -87,6 +106,8 @@ namespace Apache.Ignite.Core.Cache.Configuration writer.WriteDouble(EvictionThreshold); writer.WriteInt(EmptyPagesPoolSize); writer.WriteBoolean(MetricsEnabled); + writer.WriteInt(SubIntervals); + writer.WriteTimeSpanAsLong(RateTimeInterval); } /// <summary> @@ -146,8 +167,30 @@ namespace Apache.Ignite.Core.Cache.Configuration /// <summary> /// Gets or sets a value indicating whether memory metrics should be enabled. /// <para /> - /// Metrics can be retrieved with <see cref="IIgnite.GetMemoryMetrics"/> method. + /// Metrics can be retrieved with <see cref="IIgnite.GetMemoryMetrics()"/> method. /// </summary> public bool MetricsEnabled { get; set; } + + /// <summary> + /// Gets or sets the rate time interval for <see cref="IMemoryMetrics.AllocationRate"/> + /// and <see cref="IMemoryMetrics.EvictionRate"/> monitoring purposes. + /// <para /> + /// For instance, after setting the interval to 60 seconds, subsequent calls + /// to <see cref="IMemoryMetrics.AllocationRate"/> will return average allocation + /// rate (pages per second) for the last minute. + /// </summary> + [DefaultValue(typeof(TimeSpan), "00:01:00")] + public TimeSpan RateTimeInterval { get; set; } + + /// <summary> + /// Gets or sets the number of sub intervals to split <see cref="RateTimeInterval"/> into to calculate + /// <see cref="IMemoryMetrics.AllocationRate"/> and <see cref="IMemoryMetrics.EvictionRate"/>. + /// <para /> + /// Bigger value results in more accurate metrics. + /// </summary> + [DefaultValue(DefaultSubIntervals)] + [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", + Justification = "Consistency with Java config")] + public int SubIntervals { get; set; } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/modules/platforms/dotnet/Apache.Ignite.Core/IIgnite.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/IIgnite.cs b/modules/platforms/dotnet/Apache.Ignite.Core/IIgnite.cs index 863952b..acf2064 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/IIgnite.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/IIgnite.cs @@ -337,5 +337,14 @@ namespace Apache.Ignite.Core /// Memory metrics should be enabled with <see cref="MemoryPolicyConfiguration.MetricsEnabled"/>. /// </summary> ICollection<IMemoryMetrics> GetMemoryMetrics(); + + /// <summary> + /// Gets the memory metrics for the specified memory policy. + /// <para /> + /// To get metrics for the default memory region, + /// use <see cref="MemoryConfiguration.DefaultMemoryPolicyName"/>. + /// </summary> + /// <param name="memoryPolicyName">Name of the memory policy.</param> + IMemoryMetrics GetMemoryMetrics(string memoryPolicyName); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/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 bdfa8db..fae4ebb 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd +++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd @@ -1205,6 +1205,16 @@ <xs:documentation>Enable memory metrics.</xs:documentation> </xs:annotation> </xs:attribute> + <xs:attribute name="subIntervals" type="xs:int"> + <xs:annotation> + <xs:documentation>Number of sub intervals to split RateTimeInterval into.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="rateTimeInterval" type="xs:string"> + <xs:annotation> + <xs:documentation>Rate time interval for AllocationRate and EvictionRate monitoring.</xs:documentation> + </xs:annotation> + </xs:attribute> </xs:complexType> </xs:element> </xs:sequence> http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs ---------------------------------------------------------------------- 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 ad180ee..d6947b2 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs @@ -121,6 +121,9 @@ namespace Apache.Ignite.Core.Impl.Cluster /** */ private const int OpMemoryMetrics = 26; + /** */ + private const int OpMemoryMetricsByName = 27; + /** Initial Ignite instance. */ private readonly Ignite _ignite; @@ -578,6 +581,15 @@ namespace Apache.Ignite.Core.Impl.Cluster } /// <summary> + /// Gets the memory metrics. + /// </summary> + public IMemoryMetrics GetMemoryMetrics(string memoryPolicyName) + { + return DoOutInOp(OpMemoryMetricsByName, w => w.WriteString(memoryPolicyName), + stream => stream.ReadBool() ? new MemoryMetrics(Marshaller.StartUnmarshal(stream, false)) : null); + } + + /// <summary> /// Creates new Cluster Group from given native projection. /// </summary> /// <param name="prj">Native projection.</param> http://git-wip-us.apache.org/repos/asf/ignite/blob/6f8577f3/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs index b392f9c..000968c 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs @@ -737,6 +737,14 @@ namespace Apache.Ignite.Core.Impl return _prj.GetMemoryMetrics(); } + /** <inheritdoc /> */ + public IMemoryMetrics GetMemoryMetrics(string memoryPolicyName) + { + IgniteArgumentCheck.NotNullOrEmpty(memoryPolicyName, "memoryPolicyName"); + + return _prj.GetMemoryMetrics(memoryPolicyName); + } + /// <summary> /// Gets or creates near cache. /// </summary>
