[ 
https://issues.apache.org/jira/browse/IGNITE-24634?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Raymond Wilson updated IGNITE-24634:
------------------------------------
    Description: 
When using the C# client on Ignite 2.16, statistics collection for caches 
appears to ignore Gets for element read from the OffHeap in-memory location.

When I run the included reproducer, I get the following output which appears to 
show no Gets were satisfied from OffHeap

Completed: Put count = 1000, Get Count = 2000, OffHeap Gets = 0, Off heap local 
peek count = 1000

If after running an initial time, I comment out the writing and reading 
sections and just perform the peek operations on a subsequent run I get this 
output which implies that even when no get operations have been performed, the 
local peek restricted to OffHeap is reporting the elements are present

Completed: Put count = 0, Get Count = 0, OffHeap Gets = 0, Off heap local peek 
count = 1000

Code for reproducer is as follows:


using System;
using System.Collections.Generic;
using System.IO;
using Apache.Ignite.Core;
using Apache.Ignite.Core.Cache;
using Apache.Ignite.Core.Cache.Configuration;
using Apache.Ignite.Core.Configuration;

namespace OutOfMemoryReproducer
{
  static class Program
  {
    public static ICache<string, byte[]> cache;

    static void Main()
    {
      // Make the server
      var cfgServer = new IgniteConfiguration
      {
        IgniteInstanceName = "Server",
        JvmMaxMemoryMb = 1024,
        JvmInitialMemoryMb = 512,
        DataStorageConfiguration = new DataStorageConfiguration
        {
          WalMode = WalMode.Fsync,
          PageSize = 16 * 1024, // Failure does not occur when using default 
page size of 4096
          StoragePath = Path.Combine(@"c:\temp", "ErrorReproducer", 
"Persistence"),
          WalArchivePath = Path.Combine(@"c:\temp", "ErrorReproducer", 
"WalArchive"),
          WalPath = Path.Combine(@"c:\temp", "ErrorReproducer", "WalStore"),
          DefaultDataRegionConfiguration = new DataRegionConfiguration
          {
            Name = "Default",
            InitialSize = 64 * 1024 * 1024, // 128 MB
            MaxSize = 2L * 1024 * 1024 * 1024, // 2 GB

            PersistenceEnabled = true
          }
        },
        JvmOptions = new List<string>() {"-DIGNITE_QUIET=false", 
"-Djava.net.preferIPv4Stack=true", "-XX:+UseG1GC"},
        WorkDirectory = Path.Combine(@"c:\temp", "ErrorReproducer")
      };

      var igniteServer = Ignition.Start(cfgServer);

      // Activate the grid
      igniteServer.GetCluster().SetActive(true);

      // Set up the cache
      var cacheCfgServer = new CacheConfiguration {Name = "BufferQueueCache", 
KeepBinaryInStore = true, CacheMode = CacheMode.Partitioned, DataRegionName = 
"Default"};
      cache = igniteServer.GetOrCreateCache<string, byte[]>(cacheCfgServer);

      // Instruct the cache to collect operational statistics
      cache.EnableStatistics(true);

      var numEntriesToTest = 1000;

      // Write a series of elements
      for (var i = 0; i < numEntriesToTest; i++)
      {
        cache.Put($"Item {i}", new byte[1]);
        Console.WriteLine($"Put item {i} with 1 bytes");
      }

      // Read a series of elements
      for (var i = 0; i < numEntriesToTest; i++)
      {
        var x = cache.Get($"Item {i}");
        Console.WriteLine($"Get item {i} with 1 bytes");
      }

      // Read a series of elements for a second time
      for (var i = 0; i < numEntriesToTest; i++)
      {
        var x = cache.Get($"Item {i}");
        Console.WriteLine($"Get item {i} with 1 bytes");
      }

      var offHeapLocalPeekCount = 0;

      // Peek a series of elements
      for (var i = 0; i < numEntriesToTest; i++)
      {
        var result = cache.TryLocalPeek($"Item {i}", out var x, 
CachePeekMode.Offheap);
        Console.WriteLine($"Local peek for item {i} in off heap is {result}");

        if (result)
          offHeapLocalPeekCount++;
      }

      // Get the statistics
      var metrics = cache.GetLocalMetrics();
      Console.WriteLine($"Completed: Put count = {metrics.CachePuts}, Get Count 
= {metrics.CacheGets}, OffHeap Gets = {metrics.OffHeapGets}, Off heap local 
peek count = {offHeapLocalPeekCount}");
      Console.ReadKey();
    }
  }
}




  was:
When using the C# client on Ignite 2.16, statistics collection for caches 
appears to ignore Gets for element read from the OffHeap in-memory location.

When I run the included reproducer, I get the following output which appears to 
show no Gets were satisfied from OffHeap

Completed: Put count = 1000, Get Count = 2000, OffHeap Gets = 0, Off heap local 
peek count = 1000

If after running an initial time, I comment out the writing and reading 
sections and just perform the peek operations on a subsequent run I get this 
output which implies that even when no get operations have been performed, the 
local peek restricted to OffHeap is reporting the elements are present

Completed: Put count = 0, Get Count = 0, OffHeap Gets = 0, Off heap local peek 
count = 1000

Code for reproducer is as follows:


using System;
using System.Collections.Generic;
using System.IO;
using Apache.Ignite.Core;
using Apache.Ignite.Core.Cache;
using Apache.Ignite.Core.Cache.Configuration;
using Apache.Ignite.Core.Configuration;

namespace OutOfMemoryReproducer
{
  static class Program
  {
    public static ICache<string, byte[]> cache;

    static void Main()
    {
      // Make the server
      var cfgServer = new IgniteConfiguration
      {
        IgniteInstanceName = "Server",
        JvmMaxMemoryMb = 1024,
        JvmInitialMemoryMb = 512,
        DataStorageConfiguration = new DataStorageConfiguration
        {
          WalMode = WalMode.Fsync,
          PageSize = 16 * 1024, // Failure does not occur when using default 
page size of 4096
          StoragePath = Path.Combine(@"c:\temp", "ErrorReproducer", 
"Persistence"),
          WalArchivePath = Path.Combine(@"c:\temp", "ErrorReproducer", 
"WalArchive"),
          WalPath = Path.Combine(@"c:\temp", "ErrorReproducer", "WalStore"),
          DefaultDataRegionConfiguration = new DataRegionConfiguration
          {
            Name = "Default",
            InitialSize = 64 * 1024 * 1024, // 128 MB
            MaxSize = 2L * 1024 * 1024 * 1024, // 2 GB

            PersistenceEnabled = true
          }
        },
        JvmOptions = new List<string>() {"-DIGNITE_QUIET=false", 
"-Djava.net.preferIPv4Stack=true", "-XX:+UseG1GC"},
        WorkDirectory = Path.Combine(@"c:\temp", "ErrorReproducer")
      };

      var igniteServer = Ignition.Start(cfgServer);

      // Activate the grid
      igniteServer.GetCluster().SetActive(true);

      // Set up the cache
      var cacheCfgServer = new CacheConfiguration {Name = "BufferQueueCache", 
KeepBinaryInStore = true, CacheMode = CacheMode.Partitioned, DataRegionName = 
"Default"};
      cache = igniteServer.GetOrCreateCache<string, byte[]>(cacheCfgServer);

      // Instruct the cache to collect operational statistics
      cache.EnableStatistics(true);

      var numEntriesToTest = 1000;

      // Write a series of elements
      for (var i = 0; i < numEntriesToTest; i++)
      {
        cache.Put($"Item {i}", new byte[1]);
        Console.WriteLine($"Put item {i} with 1 bytes");
      }

      // Read a series of elements
      for (var i = 0; i < numEntriesToTest; i++)
      {
        var x = cache.Get($"Item {i}");
        Console.WriteLine($"Get item {i} with {i} bytes");
      }

      // Read a series of elements for a second time
      for (var i = 0; i < numEntriesToTest; i++)
      {
        var x = cache.Get($"Item {i}");
        Console.WriteLine($"Get item {i} with {i} bytes");
      }

      var offHeapLocalPeekCount = 0;

      // Peek a series of elements
      for (var i = 0; i < numEntriesToTest; i++)
      {
        var result = cache.TryLocalPeek($"Item {i}", out var x, 
CachePeekMode.Offheap);
        Console.WriteLine($"Local peek for item {i} in off heap is {result}");

        if (result)
          offHeapLocalPeekCount++;
      }

      // Get the statistics
      var metrics = cache.GetLocalMetrics();
      Console.WriteLine($"Completed: Put count = {metrics.CachePuts}, Get Count 
= {metrics.CacheGets}, OffHeap Gets = {metrics.OffHeapGets}, Off heap local 
peek count = {offHeapLocalPeekCount}");
      Console.ReadKey();
    }
  }
}





> Cache statistics do not track Gets from OffHeap
> -----------------------------------------------
>
>                 Key: IGNITE-24634
>                 URL: https://issues.apache.org/jira/browse/IGNITE-24634
>             Project: Ignite
>          Issue Type: Bug
>          Components: cache
>    Affects Versions: 2.16
>            Reporter: Raymond Wilson
>            Priority: Major
>
> When using the C# client on Ignite 2.16, statistics collection for caches 
> appears to ignore Gets for element read from the OffHeap in-memory location.
> When I run the included reproducer, I get the following output which appears 
> to show no Gets were satisfied from OffHeap
> Completed: Put count = 1000, Get Count = 2000, OffHeap Gets = 0, Off heap 
> local peek count = 1000
> If after running an initial time, I comment out the writing and reading 
> sections and just perform the peek operations on a subsequent run I get this 
> output which implies that even when no get operations have been performed, 
> the local peek restricted to OffHeap is reporting the elements are present
> Completed: Put count = 0, Get Count = 0, OffHeap Gets = 0, Off heap local 
> peek count = 1000
> Code for reproducer is as follows:
> using System;
> using System.Collections.Generic;
> using System.IO;
> using Apache.Ignite.Core;
> using Apache.Ignite.Core.Cache;
> using Apache.Ignite.Core.Cache.Configuration;
> using Apache.Ignite.Core.Configuration;
> namespace OutOfMemoryReproducer
> {
>   static class Program
>   {
>     public static ICache<string, byte[]> cache;
>     static void Main()
>     {
>       // Make the server
>       var cfgServer = new IgniteConfiguration
>       {
>         IgniteInstanceName = "Server",
>         JvmMaxMemoryMb = 1024,
>         JvmInitialMemoryMb = 512,
>         DataStorageConfiguration = new DataStorageConfiguration
>         {
>           WalMode = WalMode.Fsync,
>           PageSize = 16 * 1024, // Failure does not occur when using default 
> page size of 4096
>           StoragePath = Path.Combine(@"c:\temp", "ErrorReproducer", 
> "Persistence"),
>           WalArchivePath = Path.Combine(@"c:\temp", "ErrorReproducer", 
> "WalArchive"),
>           WalPath = Path.Combine(@"c:\temp", "ErrorReproducer", "WalStore"),
>           DefaultDataRegionConfiguration = new DataRegionConfiguration
>           {
>             Name = "Default",
>             InitialSize = 64 * 1024 * 1024, // 128 MB
>             MaxSize = 2L * 1024 * 1024 * 1024, // 2 GB
>             PersistenceEnabled = true
>           }
>         },
>         JvmOptions = new List<string>() {"-DIGNITE_QUIET=false", 
> "-Djava.net.preferIPv4Stack=true", "-XX:+UseG1GC"},
>         WorkDirectory = Path.Combine(@"c:\temp", "ErrorReproducer")
>       };
>       var igniteServer = Ignition.Start(cfgServer);
>       // Activate the grid
>       igniteServer.GetCluster().SetActive(true);
>       // Set up the cache
>       var cacheCfgServer = new CacheConfiguration {Name = "BufferQueueCache", 
> KeepBinaryInStore = true, CacheMode = CacheMode.Partitioned, DataRegionName = 
> "Default"};
>       cache = igniteServer.GetOrCreateCache<string, byte[]>(cacheCfgServer);
>       // Instruct the cache to collect operational statistics
>       cache.EnableStatistics(true);
>       var numEntriesToTest = 1000;
>       // Write a series of elements
>       for (var i = 0; i < numEntriesToTest; i++)
>       {
>         cache.Put($"Item {i}", new byte[1]);
>         Console.WriteLine($"Put item {i} with 1 bytes");
>       }
>       // Read a series of elements
>       for (var i = 0; i < numEntriesToTest; i++)
>       {
>         var x = cache.Get($"Item {i}");
>         Console.WriteLine($"Get item {i} with 1 bytes");
>       }
>       // Read a series of elements for a second time
>       for (var i = 0; i < numEntriesToTest; i++)
>       {
>         var x = cache.Get($"Item {i}");
>         Console.WriteLine($"Get item {i} with 1 bytes");
>       }
>       var offHeapLocalPeekCount = 0;
>       // Peek a series of elements
>       for (var i = 0; i < numEntriesToTest; i++)
>       {
>         var result = cache.TryLocalPeek($"Item {i}", out var x, 
> CachePeekMode.Offheap);
>         Console.WriteLine($"Local peek for item {i} in off heap is {result}");
>         if (result)
>           offHeapLocalPeekCount++;
>       }
>       // Get the statistics
>       var metrics = cache.GetLocalMetrics();
>       Console.WriteLine($"Completed: Put count = {metrics.CachePuts}, Get 
> Count = {metrics.CacheGets}, OffHeap Gets = {metrics.OffHeapGets}, Off heap 
> local peek count = {offHeapLocalPeekCount}");
>       Console.ReadKey();
>     }
>   }
> }



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to